PWM para Motor DC 30A com PIC 16F877a

PWM no PIC

 

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.

Marcelo Maciel

facebooktwittergoogle pluslinkedin

Engenheiro de Controle e Automação e Técnico Eletrônico com mais de 10 anos de experiência no desenvolvimento de dispositivos microcontrolados para pequenas e médias empresas em diversos ramos. Além disso, possui vivência na área de Automação em grandes empresas desde 1999.


  • alguem sabe com abaixa os aquivos

  • 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.

  • Ó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….

  • 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.

  • 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!!

  • ola gostaria de baixar os arquivos, mas o link esta quebrado, aguardo grato

  • 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!

  • Olá, Marcelo

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

  • 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…

  • 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

  • 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.

  • 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.

  • 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…

  • Fico muito feliz por ter ajudado.

  • 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)

  • nao consigo baixar os arquivos

Your Turn To Talk

Leave a Reply to plvictor Cancel Reply

Your email address will not be published.