Eletrônica Silveira
Olá, Seja Bem-Vindo ao Fórum Eletrônica Silveira!!!!
Para você poder ver os mais variados Projetos do nosso Fórum, você precisa fazer o cadastro!

Depois de se Cadastrar, não se esqueça de ler as regras do fórum!

http://eletronicasilveira.forumeiros.com/t3-regras-do-forum#3


Administrador do Fórum,
Rafael Silveira
HOMENAGEM

Na vida tudo passa tudo acontece mas alguém igual a você a gente jamais esquece




★ 22 de novembro de 1991

† 12 de março de 2016

Nosso eterno amigo, administrador e fundador deste fórum
Quem está conectado
39 usuários online :: 8 usuários cadastrados, Nenhum Invisível e 31 Visitantes :: 2 Motores de busca

Bolasha, CEZARMOTOS, CMeletronica, coroner, ismail, jefferson toledo, microbit, varkrisz

[ Ver toda a lista ]


O recorde de usuários online foi de 264 em Seg 18 Mar 2013 - 11:54
Últimos assuntos
Eletrônica Perez
CM Eletrônica
Top dos mais postadores
Rafael Silveira (7816)
 
Caca Silva (5945)
 
renatoscp (3827)
 
CMeletronica (3141)
 
michel chagas (2791)
 
Railson (2118)
 
alexsandro rodrigues de a (1776)
 
naldo santos (1599)
 
ablacon64 (1220)
 
gilvantexas (1061)
 

Medidor de Velocidade

Publicidade

Estudos PWM em microcontroladores - Parte IV

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

Tutorial Estudos PWM em microcontroladores - Parte IV

Mensagem por Anderson M em Qui 14 Ago 2014 - 13:55

Estudos PWM em microcontroladores - Parte IV:

Continuando o tópico anterior....

http://eletronicasilveira.forumeiros.com/t5468-estudos-pwm-em-microcontroladores-parte-iii

Agora segue o projeto 2 em 1, onde será possível controlar velocidade por variação do Duty Cycle, e ainda mudar o sentido de rotação dos motores DC.
Ao invés de utilizar POWER MOSFETs como tem sido anteriormente, agora vamos utilizar C.I driver de motor DC.

Há teclas táctil ou push button ( N/A ) como alguns preferem chamá-los conectado ao PORT B do MCU, atuando como controles de velocidade e sentido de rotação dos motores DC.

Esquemático:



Esquemático no formato PDF:

Copie e cole no navegador...

h**p://***.4shared.com/office/PeZprWZ5ba/PWM_CONTROL_IV.html

TROCAR ** POR tt e TROCAR *** POR www


Funcionamento:

No total são 7 teclas conectado ao PORT B do MCU, cada uma faz sua função determinada.

Onde:

Down 1 --------------->  Diminui o Duty Cycle do módulo CCP1 pino 17.
UP 1 ------------------> Aumenta o Duty Cycle do módulo CCP1 pino 17.

Down 2 -------------->  Diminui o Duty Cycle do módulo CCP2 pino 16.
UP 2 -----------------> Aumenta o Duty Cycle do módulo CCP2 pino 16.

Será interessante quem tiver posse de um frequencímetro para verificar frequência de comutação, também um SCOPE para comprovar os sinais PWM nos pinos 16 e 17 do MCU variando conforme fomos pressionando as teclas UP - DOWN.

As teclas abaixo funciona da seguinte maneira, devemos pressionar por curto período, aguardar o início da ação e liberar logo em seguida.    

Clockwise -------------> Rotação no sentido ( horário )
Anti clockwise ---------> Rotação no sentido ( anti horário )
Brake -----------------> Frenagem dos motores DC.

- Há dois LEDs indicadores de cores diferente, são para indentificação visual do sentido de rotação.

NOTE: Não há resistores de ( pull up ) conectados no PORT B, não estranhe por não serem adicionados ao circuito, pois os resistores de ( pull up ) usados no projeto são interno do próprio MCU.

- Eles foram habilitados via programação como veremos nos comentários do código fonte.

________________________________________________________________

Integrado L293D:

- Este cara fará duas funções, operando como driver e ponte H dos motores DC.  



Diagrama interno:



Descrições básica:

Fabricante -------------------------------> SGS Thomson
Capacidade de corrente na saída ----------> ( 0.6A ) por canal.
Capacidade de corrente de pico na saída ---> ( 1.2A ) por canal.
Proteção contra alta temperatura.
Diodos grampeadores interno.
Frequência máxima de comutação ----------> ( 5 Khz )
Tensão de alimentação Vs pino 8 -----------> ( Mínima 4.5V -- Máxima 36V )
Tensão de almentação Vss pino 16 ---------> ( Mínima 4.5V -- Máxima 36V )

NOTE: Alimentação Vs pino 8 vai depender da tensão de alimentação do motor DC utilizado no projeto.

Pinagem do L293D:

Pino 1 - Enable 1  --> Recebe o sinal PWM do módulo CCP1 pino 17 do MCU.

Pino 9 - Enable 2  --> Recebe o sinal PWM do módulo CCP2 pino 16 do MCU.

Funcionamento:

O funcionamento das pontes H interno do L293D vai atuar conforme se encontram o estado lógico nos pinos ( Input ), ou seja, nível lógico 1 ou 0.    

Clockwise - ( sentido horário )

INPUT 1 -> 1
INPUT 2 -> 0

________________________________

Anti Clockwise - ( sentido anti horário )

INPUT 1 -> 0
INPUT 2 -> 1

________________________________

Clockwise - ( sentido horário )

INPUT 3 -> 0
INPUT 4 -> 1

________________________________

Anti Clockwise  - ( sentido anti horário )

INPUT 3 -> 1
INPUT 4 -> 0

________________________________

________________________________________________________________


Programa implementado ao projeto:

Apesar do código fonte estar bem detalhado com comentários, vou detalhar apenas três coisas.

Lá no início foi feito um comentário de não utilizar resistores ( pull up ) conectados ao PORT B, pois bem, isso foi habilitado através do programa.

- A função responsável estar logo abaixo.

intcon2.rbpu = 0;   // Habilita os resistores de PULL-UP do PORT B

Com isso fazemos habilitação dos resistores ( pull up ) interno no MCU.

O valor da frequência do PWM deverá ser o mesmo valor nos dois módulos.

Exemplo:

Pwm1_Init(5000);         // Inicializa o módulo PWM (1) com frequência 5 KHz

Pwm2_Init(5000);         // Inicializa o módulo PWM (2) com frequência 5 KHz

Jamais devemos definir valores diferente para ambos módulos, o motivo já foi explicado no tópico abaixo.

http://eletronicasilveira.forumeiros.com/t5357-estudos-pwm-em-microcontroladores-parte-ii

Seguindo uma especificação do fabricante do L293D, o valor máximo da frequência de comutação seria de ( 5 Khz ).

- Portanto pessoal, não sejam malvados em utilizar frequência maior kkkaaakkkk. Vocês poderão alterar para valores inferiores da máxima permitida.

________________________________________________________________


O processo de compilação do código fonte poderá ser revisto no tópico abaixo:

http://eletronicasilveira.forumeiros.com/t5325-estudos-pwm-em-microcontroladores-parte-i


Código fonte do exercício nº 4:

Selecione, copie e cole o código fonte do exercício nº 4 que está na caixa abaixo:

Código:
/*
 * Projeto: PWM CONTROL IV
 * MikroC v6.0.0
 * Copyright (c) Anderson M, 14/08/2014.
 * Fórum: Eletrônica Silveira
 * MCU: PIC 18F452
 * Cristal Oscilador Externo: 10.0 Mhz
 * Oscilador XT, Power-up Timer (Desabilitado), WDT OFF (Desabilitado)
 * Biblioteca adicionada: (PWM)
*/
//******************************************************************************
//******************************************************************************

//**************************** Programa principal ******************************

void main(){ // Função Principal....

//******************************************************************************
// Declarações de variáveis....
   int duty_1 = 0;  // Declaração de variável com valor atribuído (Zero)
   int duty_2 = 0; // Declaração de variável com valor atribuído (Zero)
//******************************************************************************

//******************************************************************************
//************ Início de configurações dos registradores TRIS do MCU ***********

   ADCON1 = 0b0000010;    // Habilita o canal (A/D do MCU
   TRISA = 0b11111111;   // Configura os pinos PORTA como entrada
   TRISB = 0b11111111;  // Configura os pinos PORTB como entrada
   PORTB = 1;          // Inicializa com nível lógico (1)
   TRISC = 0;         // Configura todos os pinos do PORTC como saída
   TRISD = 0;        // Configura todos os pinos do PORTD como saída
   PORTD = 0;       // Inicializa com nível lógico (0) zero
   TRISE = 0;      // Configura todos os pinos do PORTE como saída

//******************************************************************************
   intcon2.rbpu = 0;   // Habilita os resistores de PULL-UP do PORT B
//******************************************************************************

//******************** Configuração PWM do módulo CCP1 *************************

   Pwm1_Init(5000);         // Inicializa o módulo PWM (1) com frequência 5 KHz
   Pwm1_Start();           // Inícializa a geração do sinal PWM no módulo CCP1
   Pwm1_Set_Duty(duty_1); // Duty Cycle para o módulo CCP1
  
//******************************************************************************

//******************** Configuração PWM do módulo CCP2 *************************

   Pwm2_Init(5000);         // Inicializa o módulo PWM (2) com frequência 5 KHz
   Pwm2_Start();           // Inícializa a geração do sinal PWM no módulo CCP2
   Pwm2_Set_Duty(duty_2); // Duty Cycle para o módulo CCP2

//******************************************************************************

//******************************************************************************

while (1){ // LOOP Infinito...

//******************************************************************************
// INSTRUÇÕES DO DUTY CYCLE MÓDULO CCP1 - Pino 17 (RC2/CCP1)...
// Instruções de variação DUTY CYCLE nos valores entre (0 - 255) = (0% e 100%)

     if (!RB0_bit && duty_1 >0) // Se button conectado ao (RB0) for pressionado
     {
        Delay_ms(50);                    // Aguardar  50 milisegundos
        duty_1 = duty_1 - 10;          // Subtração do Duty Cycle
        Pwm1_Set_Duty(duty_1);       // Subtrair Duty Cycle em (10)
     }
    
     if (!RB1_bit && duty_1 <255) // Se button conectado ao (RB1) for pressionado
     {
        Delay_ms(50);               // Aguardar  50 milisegundos
        duty_1 = duty_1 + 10;     // Adição do Duty Cycle
        Pwm1_Set_Duty(duty_1);  // Adicionar Duty Cycle em (10)
     }
// FINAL DAS INSTRUÇÕES DO DUTY CYCLE MÓDULO CCP1 - Pino 17 (RC2/CCP1)...
//******************************************************************************

//******************************************************************************
// INSTRUÇÕES DO DUTY CYCLE MÓDULO CCP2 - Pino 16 (RC1/T1OSI/CCP2A)...
// Instruções de variação DUTY CYCLE nos valores entre (0 - 255) = (0% e 100%)

    if (!RB2_bit && duty_2 >0) // Se button conectado ao (RB2) for pressionado
    {
        Delay_ms(50);                 // Aguardar  50 milisegundos
        duty_2 = duty_2 - 10;        // Subtração do Duty Cycle
        Pwm2_Set_Duty(duty_2);      // Subtrair Duty Cycle em (10)
    }
    
    if (!RB3_bit && duty_2 <255)   // Se button conectado ao (RB3) for pressionado
    {
        Delay_ms(50);             // Aguardar  50 milisegundos
        duty_2 = duty_2 + 10;    // Adição do Duty Cycle
        Pwm2_Set_Duty(duty_2);  // Adicionar Duty Cycle em (10)
    }
// FINAL DAS INSTRUÇÕES DO DUTY CYCLE MÓDULO CCP2 - Pino 16 (RC1/T1OSI/CCP2A)...
//******************************************************************************

//******************************************************************************
// INSTRUÇÕES DO SENTIDO DE ROTAÇÂO DOS MOTORES DC....
// Sentido horário...

   if (portb.f4){ PORTB.F4 = 0;     // Se nível lógico no pino 37 (RB4) for (0)

      }else{                      // Então....
             PORTD.F5 = 0;       // Colocar nível lógico (0) no pino 28 (RD5)
                                // Desligar LED indicador do sentido anti horário...
                                
             PORTD.F0 = 1;     // Colocar nível lógico (1) no pino 19 (RD0)
             PORTD.F1 = 0;    // Colocar nível lógico (0) no pino 20 (RD1)
             PORTD.F2 = 0;   // Colocar nível lógico (0) no pino 21 (RD3)
             PORTD.F3 = 1;  // Colocar nível lógico (1) no pino 22 (RD3)
            
             PORTD.F4 = 1; // Colocar nível lógico (1) no pino 27 (RD4)
                          // Ligar o LED indicador do sentido horário...
           }
//******************************************************************************
// Sentido anti horário...

   if (portb.f5){ PORTB.F5 = 0;      // Se nível lógico no pino 38 (RB5) for (0)

      }else{                       // Então....
             PORTD.F4 = 0;        // Colocar nível lógico (0) no pino 27 (RD4)
                                 // Desligar LED indicador do sentido horário...
                                
             PORTD.F0 = 0;     // Colocar nível lógico (0) no pino 19 (RD0)
             PORTD.F1 = 1;    // Colocar nível lógico (1) no pino 20 (RD1)
             PORTD.F2 = 1;   // Colocar nível lógico (1) no pino 21 (RD3)
             PORTD.F3 = 0;  // Colocar nível lógico (0) no pino 22 (RD3)
            
             PORTD.F5 = 1; // Colocar nível lógico (1) no pino 28 (RD5)
                          // Ligar o LED indicador do sentido anti horário...
           }
//******************************************************************************

//******************************************************************************
// INSTRUÇÃO DA FRENAGEM DOS MOTORES DC....

   if (portb.f6){ PORTB.F6 = 0;       // Se nível lógico no pino 39 (RB6) for (0)
    
      }else{                        // Então....
                                   // Desligar os LEDs indicadores...
             PORTD.F4 = 0;        // Colocar nível lógico (0) no pino 27 (RD4)
             PORTD.F5 = 0;       // Colocar nível lógico (0) no pino 28 (RD5)
            
             PORTD.F0 = 0;      // Colocar nível lógico (0) no pino 19 (RD0)
             PORTD.F1 = 0;     // Colocar nível lógico (0) no pino 20 (RD1)
             PORTD.F2 = 0;    // Colocar nível lógico (0) no pino 21 (RD3)
             PORTD.F3 = 0;   // Colocar nível lógico (0) no pino 22 (RD3)
            }
             Delay_ms(10); // Atraso de 10 milisegundos para início do (WHILE)
      }
//******************************************************************************
}


Boa sorte a todos  Positivo 

Sds Anderson M
avatar
Anderson M
Avançado
Avançado

Mensagens : 401
Data de inscrição : 07/07/2011
Localização : São Paulo/SP

Voltar ao Topo Ir em baixo

Tutorial Re: Estudos PWM em microcontroladores - Parte IV

Mensagem por Anderson M em Qui 14 Ago 2014 - 14:31

Caso vocês queiram trocar o cristal do projeto por um de 8 Mhz, o procedimento necessário será detalhado abaixo.

- Na aba superior, devemos clicar em Project / Edit project
- Logo abrirá uma janela de configuração dos fuses.

- Trocar o valor o valor na caixa ( Oscillator Frequency ) onde estar o valor definido ( 10.000000 ) que corresponde 10 Mhz, então devemos atribuir um novo valor de clock ( 8.000000 ) que corresponde 8 Mhz.

- Clique em OK

OBS: Deixar as configurações ( Oscillator Selection ), ( Oscillator System Clock Switch ) e ( Power-up Timer ) como estão indicados na imagem.

Vejam na imagem abaixo:



Na aba inferior à direita ( Library Manager) devemos selecionar apenas à nossa biblioteca ( PWM ).

Esta imagem abaixo é um exemplo do tópico:

http://eletronicasilveira.forumeiros.com/t5325-estudos-pwm-em-microcontroladores-parte-i



- Faça compilação do programa fornecido.

avatar
Anderson M
Avançado
Avançado

Mensagens : 401
Data de inscrição : 07/07/2011
Localização : São Paulo/SP

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo


 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum