Subscribe:

Ads 468x60px

e-mail: eng@marcelomaciel.com. Tecnologia do Blogger.

domingo, 29 de abril de 2012

PWM para Motor DC 30A com PIC 16F877a

Existem muitas situação em que precisamos variar a velocidade de um motor DC. Uma maneira simples é a utilização do controle PWM.Com esta técnica podemos controlar a velocidade dos motores, mantendo o torque ainda que em baixas velocidades o que garante partidas suaves mesmo quando há uma carga maior sobre os motores.

A seguir apresento o projeto de controle de velocidade de um motor DC de até 30A microcontrolado com PIC.


O circuito é um simples e está apresentado abaixo:




Para controlar motores de corrente elevadas precisamos recorrer à transistores que suportem esta corrente. Escolhi o Mosfet IRFZ44N para este projeto pois suporta 39A de corrente e por sua disponibilidade no mercado e preço reduzido. Não devemos esquecer de equipá-lo com um grande e eficiente dissipador de calor, porque ele vai esquentar bastante, principalmente quando o ajuste do PWM estiver próximo de 90/100%.

Outro ponto que deve ser considerado em relação à este MOSFET é que para o PWM funcionar, devemos injetar o trem de pulsos do Gate com amplitude maior que 10V. Para compatibilizar a saído do PIC (+5Vcc) utilizamos o transistor BC337 (Q2). O único inconveniente neste caso é que o sinal PWM é invertido quando passa pelo transistor Q2, quer dizer, quando aplicamos o duty (largura do Pulso PWM) de 0% na saída do PIC, o motor receberá 100% e funcionará em velocidade máxima. Já, quando o duty na saído do PIC for de 100% o motor estará parado.

A utilização de um microcontrolador PIC16F877a para controlar um PWM parece exagero e é se esta for a única função do circuito, mas como normalmente o PWM é apenas um dos pontos a ser controlado em um sistema automatizado, este microcontrolador oferece suporte para acréscimo dos demais controles do projeto.

Abaixo o código escrito em linguagem C com o compilador CCS.

Código do programa em C
//Configuração PIC
#include <16f877a.h>                              
#device adc=10        
//
HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=20000000)                
#BYTE PORTA = 0X05
#BYTE PORTB = 0X06
#BYTE PORTC = 0X07
#BYTE PORTD = 0X08
#BYTE PORTE = 0X09
//
float duty;                                                  
//
// PROGRAMA PRINCIPAL
//
void main ()
{
     setup_ADC_ports(ALL_ANALOG);  
     setup_adc(adc_clock_div_4);              
     delay_us(15);
     setup_timer_2(T2_DIV_BY_4,255,1);
                                                                 
     setup_ccp1(CCP_PWM);      
     set_tris_a(0b11111111);      
     set_tris_b(0b00000000);
     set_tris_c(0b00000000);
     set_tris_d(0b00000000);
     set_tris_e(0b00000000);
             while (TRUE)
            {
                    set_adc_channel(0);  
                    delay_us(100);      
                    duty=read_adc();
                    duty=duty*1000;
                    duty=duty/1023;
                    set_pwm1_duty(duty);
             };
}


Lista de Componentes

U1 - Microcontrolador PIC16F877a;
X1 - Cristal oscilador 20MHz;
C1,C2 - Capacitor cerâmico 15pF;
R1 - Potenciômetro 10k;
R2,R3 - Resistor 4k7;
D1 - Diodo 1N4148;
Q1 - Transistor MOSFET IRFZ44N;
Q2 - Transistor BC337;
Motor - Motor DC a ser controlado. Tensão de 12V à 40V, corrente máxima 30A.

22 comentários:

  1. alguem sabe com abaixa os aquivos

    ResponderExcluir
  2. Obrigado plvictor pela visita. Os arquivos estavam hospedados no Google Sites e, depois das mudanças da política do Google, os links ficaram indisponíveis. Mudei o servidor dos arquivos. Tente baixá-los novamente e me avise se não conseguir.

    ResponderExcluir
  3. Óla Marcelo, cara busquei de varias formas na net um circuito parecido, e o seu foi o mais próximo que encontrei para meu problema, o pro é que não queria usar o pic16 e sim, um circuito que fizesse esse trem de pulso mas com o mesmo controle. E obrigado por partilha seu conhecimento com todos,
    Abraços.....aguardo....sua postagem....

    ResponderExcluir
  4. Obrigado João Carlos pela visita. O intúito do site é esse mesmo: Compartilhar conhecimento. Muita gente na Net se gaba de saber fazer as coisas mas não compartilha.Aqui tudo é ensinado.

    ResponderExcluir
  5. Olá Marcelo, primeiramente parabéns pela iniciativa do seu blog. Gostaria de que se possível você pudesse me dar uma explicação do funcionamento do seu código pois não tenho muito conhecimento da programação em pic e gostaria de saber quais as linhas q devo alterar para adequar aos meus valores do pwm. Simulei aqui no proteus e deu tudo certo me ajudou muito, só precisaria fazer umas mudanças no código. Muito obrigado pela atenção!!

    ResponderExcluir
  6. ola gostaria de baixar os arquivos, mas o link esta quebrado, aguardo grato

    ResponderExcluir
  7. Olá amigo, seria possivel vc me explicar na linha - setup_timer_2(T2_DIV_BY_4,255,1)
    O que é o valor dentro dos parênteses? é uma constante? Grato!

    ResponderExcluir
  8. Olá, Marcelo

    Estava olhando o seu código e gostaria de entender por que você multiplicou o duty por 1000 e dividiu por 1023?

    ResponderExcluir
  9. Olá Marcelo,

    Fiz o circuito acima na prática, mas não funcionou.
    O motor liga direto, e conforme a modulação PWM vai ocorrendo o motor vai perdendo rotação, mas não a perde totalmente, fica girando em velocidade média quando o PWM está total.
    Na ligação do IRFZ44N a base está ligada na fonte por meio de um resistor, o motor ligado no coletor e o emissor está no terra.
    Neste caso o IRFZ44N está polarizado direto, e não por sinal do Gate...???

    Você já tentou fazer este circuito na prática? Estou com dificulodades em conseguir com esta ligação. Agradeceria se me ajudasse...

    Obrigado...

    ResponderExcluir
  10. Olá Luiz Fernando,

    Obrigado pela Visita.

    Montei este circuito para controle de um ventilador tipo ciroco acoplado á um motor DC. No meu caso funcionou muito bem. O que ocorreu em minha montagem é que devido a forma construtiva do ventilador ciroco, em baixas velocidades se perdia muito rendimento no fluxo de ar, mas o sinal PWM funcionou muito bem.

    Quanto à polarização, no instante em que o Transistor está em corte ( o sinal PWM está em nível 0), o gate do Mosfet é polarizado e ele conduz. Quando o sinal PWM está em nível 1, o transistor entra em saturação e leva o gate a 0V, deixando de conduzir.
    Assim, a lógica de percentual do PWM é inversa, se o duty cile estiver em 75%, a carga receberá apenas 25%. Se o duty cicle estiver em 30%, a carga receberá 70%.

    Chegou a fazer simulação deste circuito no Proteus para comprovar o sinal de saida PWM?

    att.

    Marcelo

    ResponderExcluir
  11. Olá Marcelo,

    Fiz o circutio no Proteus sim, simulei ele, mas o comportamento é diferente do real.
    Notei realmente que quanto maior o sinal do PWM Duty Cicle, menor ficava a velocidade do motor, e quanto menor o PWM Duty Cicle, maior a velocidade do motor. Vou tentar mudar a programação do PIC, estou usando o 16f628a, não estou usando porta analógica e sim 1 botão que ativa e desativa o PWM e 2 botões para aumento e redução de velocidade. Na inicialização do PIC já vou setar ele como DutyCicle(1), estou usando:

    setup_timer_2(T2_DIV_BY_4,255,1);

    e incrementando ou decrementando 1 no DutyCile a cada 100 milisegundos com o botão pressionado.

    Vou tentar fazer este fim de semana e te comunico o ocorrido.

    Grande abraço e obrigado por ter respondido.

    ResponderExcluir
  12. Neste circuito, só é prciso se preocupar com a corrente dissipado pelo Mosfet, fora isso, funciona muito bem.

    Como está utilizando outro programa e outro microcontrolador, pode ser que este problema esteja ocorrendo devido à frequência que está utilizando. tente variar a frequência do PWM para verificar se este problema é resolvido.

    E fico feliz por este conteúdo do Blog estar sendo útil.

    Nas próximas semanas pretendo subir mais conteúdo.

    Muito obrigado pela visita.

    ResponderExcluir
  13. Bom dia Marcelo,

    Efetuei o teste com suas recomendações, e adivinha.....????..... A BAGAÇA FUNCIONOU DIREITINHO... kakakaka

    Valeu mesmo Marcelo, fiz a lógica invertida, 1 velocidade máxima, 1023 velocidade mínima, agora só falta eu adicionar um BIT de segurança, porque quando eu ligo o circuito o motor dá um pico e para, coisa muito rápida mas que vai ferrar com meu projeto inteiro... Aí pra não acontecer isso eu vou habilitar a alimentação do motor com a ajuda de um optoisolador, quando habilito um dos pinos do pic, ele alimenta o optoisolador que deixa passar a tensão para o motor, mas até aí o Duty Cicle já vai estar em 1023 e o motor não vai dar um pico e parar.


    Obrigado pela ajuda...

    ResponderExcluir
  14. Olá, Marcelo!
    Primeiramente, parabéns pelo blog. Está ajudando muito!
    Bom... em relação ao PWM, tentei implantar e não deu certo: o duty não aumenta proporcionalmente com a tensão de alimentação.
    E, outra dúvida, como poderia implantar esse algoritmo no 18F2550?

    Muito obrigado!
    (willian_rafael06@yahoo.com.br)

    ResponderExcluir
  15. nao consigo baixar os arquivos

    ResponderExcluir
    Respostas
    1. Mudei o servidor dos arquivos. Qualquer problema, pf me avise.

      Excluir
  16. Tenho que fazer um projeto de teto retrátil acionado por pic em que ao cair agua sobre um sensor de chuva o teto fecha,o circuito é semelhante ao que vc postou, no entanto não é PWM, já que o controle de velocidade é feito pelas engrenagens,estou usando o L298N como ponte H, o problema é:como fazer este mesmo circuito seu só que com ponte H?

    ResponderExcluir
    Respostas
    1. Olá Márcio, neste caso basta acionar um bit de saída do PIC para fechar o teto e outro bit para abrir. então vc conecta cada uma destas saídas às entradas A e B da Ponte H e pronto, seu sistema está pronto. Vou deixar aqui como sugestão de novo artigo um circuito de acionamento de ponte H com PIC.

      Excluir
  17. Marcelo, gosto muito do seu blog, já me ajudou bastante em relação a configurações de LCD dentre outros. Sou iniciante em programação de MIC. Cara preciso de um Help, já procurei bastante a respeito de PWM e ainda não consegui configurar um MIC para que o motor gire com um duty cycle qualquer (fixo). Vc pode me ajudar ? Vlw e continue postando ensinamentos no seu blog, ta ajudando pracas. Abraços

    ResponderExcluir
    Respostas
    1. Olá Alexandre, me diga qual o tipo de motor que está tentando controlar: Um mini servomotor ou um motor DC?

      Excluir
  18. Obrigado Marcelo pela ajuda. Então tenho um motor 5vcc e gostaria de brincar com ele variando o duty manualmente mesmo só para velo como funciona. Vou fazer uma programação para informar em um LCD algumas informações dele mas isso é de boa, só não consegui mesmo fazer o motor acionar quando apertar um botao qualquer tudo bem simples, mas neste caso estou apenhando. Agradeço pela ajuda e vou comentar junto a amigos da faculdade sobre seu Blog que é ótimo. Valeu obrigado.

    ResponderExcluir