Motor DC com PWM no Arduino: o pino comanda, quem empurra é a fonte
Monte o driver de um sentido com MOSFET de nível lógico, diodo e fonte separada, dimensione pela corrente de partida e controle a velocidade com rampa sem resetar a placa.
O ventilador de mesa improvisado tem um motor de 6 V, um potenciômetro e um Arduino Uno. Você liga o motor direto no pino 9, gira o potenciômetro, e o eixo treme sem girar, ou a placa reinicia cada vez que o motor tenta partir. A resposta curta: o pino do Arduino só fornece alguns miliamperes, e o motor pede centenas, às vezes mais de um ampere na partida. O PWM decide quanto tempo o motor fica ligado; quem fornece a corrente é uma fonte própria, através de um transistor que o pino comanda, com um diodo para absorver o pico que o motor devolve ao desligar.
Se você quer entender o PWM em si, o guia PWM não abaixa a voltagem explica o liga e desliga. Aqui o foco é o circuito que deixa um motor usar esse sinal sem queimar a placa.
Por que o pino não aguenta o motor
A folha de dados do ATmega328P dá 40 mA por pino como limite absoluto, e o recomendado para uso contínuo é bem menos. Um motorzinho DC de brinquedo puxa 100 a 300 mA girando livre e pode passar de 1 A com o eixo travado, que é exatamente o que acontece no instante da partida. Ligar isso no pino é pedir ao pino dez ou trinta vezes o que ele suporta.
Mesmo com transistor, alimentar o motor pelo 5 V do Arduino ligado no USB costuma dar errado. A porta USB padrão entrega cerca de 500 mA e o Uno tem um fusível rearmável nessa faixa. O pico da partida derruba a tensão, o microcontrolador sai da faixa de operação e reinicia. Você vê isso como "o Arduino trava quando o motor liga". O guia de como alimentar o Arduino trata das fontes da placa em detalhe.
Tem ainda o pico ao desligar. O motor é uma bobina. Quando o transistor corta a corrente, a bobina tenta manter a corrente circulando e gera uma tensão alta no sentido contrário. Sem um caminho para essa energia, ela passa pelo transistor e, aos poucos ou de uma vez, ele morre. Com PWM isso acontece centenas de vezes por segundo.
Dimensione antes de comprar peças
Duas medidas definem o circuito: a tensão nominal do motor e a corrente com o eixo travado. Se o fabricante não informa a corrente de travamento, meça: multímetro na escala de corrente em série com o motor, fonte na tensão nominal, segure o eixo por um ou dois segundos. Não mais que isso, porque o enrolamento esquenta rápido.
No exemplo do ventilador:
- Motor de 6 V, 0,25 A girando livre, 1,2 A travado (medido).
- Fonte: 6 V com folga de corrente, pelo menos 2 A. Quatro pilhas AA novas também servem para teste, mas a tensão cai conforme elas descarregam.
- Transistor: MOSFET de canal N de nível lógico, que conduz bem com 5 V no gate. O IRLZ44N é o exemplo mais comum. O IRFZ44N, sem o L, precisa de mais tensão no gate e esquenta com 5 V.
- Diodo: Schottky, que comuta rápido o bastante para PWM. Um 1N5819 serve para motores de até cerca de 1 A; para correntes maiores, um de 3 A como o 1N5822.
A conta da tensão média ajuda a ajustar a expectativa. Com 6 V e analogWrite(9, 128), o motor fica ligado cerca de metade do tempo, e o multímetro mostra perto de 3 V de média. Mas a velocidade não cai pela metade de forma linear: abaixo de certo duty o motor nem parte, porque não vence o atrito.
Como montar o driver de um sentido
- Positivo da fonte de 6 V em um terminal do motor.
- Outro terminal do motor no dreno do MOSFET (pino do meio no IRLZ44N, olhando de frente para a face com escrita: gate, dreno, fonte).
- Fonte (source) do MOSFET no negativo da fonte de 6 V.
- Negativo da fonte de 6 V ligado ao GND do Arduino. Sem terra comum, o gate não tem referência e o MOSFET não liga direito.
- Resistor de 150 Ω entre o pino 9 e o gate, para limitar o pico de corrente que carrega o gate a cada pulso.
- Resistor de 10 kΩ entre gate e GND, para manter o motor desligado enquanto o Arduino reinicia e o pino ainda não foi configurado.
- Diodo em paralelo com o motor, com a faixa (catodo) no positivo da fonte. Invertido, ele vira curto-circuito na fonte.
- Capacitor cerâmico de 100 nF soldado nos terminais do motor, para reduzir o ruído elétrico das escovas.
- Capacitor eletrolítico de 470 µF entre positivo e negativo da fonte do motor, perto do driver, respeitando a polaridade.
- Potenciômetro com as pontas em 5 V e GND do Arduino e o cursor em A0.
Confira a pinagem do seu MOSFET na folha de dados do fabricante antes de soldar. O encapsulamento é o mesmo entre vários modelos, a ordem dos pinos nem sempre.
O código com rampa e duty mínimo
Duas coisas melhoram muito o comportamento: subir o duty aos poucos, para a partida não puxar o pico inteiro de uma vez, e pular a faixa em que o motor só zune sem girar. Descubra o seu duty mínimo subindo devagar até o eixo girar sozinho e some uma pequena folga.
const uint8_t PINO_MOTOR = 9;
const uint8_t PINO_POT = A0;
const int DUTY_MINIMO = 70; // abaixo disso este motor não parte
const unsigned long PASSO_MS = 8; // tempo entre degraus da rampa
int dutyAtual = 0;
unsigned long ultimoPasso = 0;
void setup() {
pinMode(PINO_MOTOR, OUTPUT);
analogWrite(PINO_MOTOR, 0);
}
void loop() {
int alvo = map(analogRead(PINO_POT), 0, 1023, 0, 255);
if (alvo < DUTY_MINIMO) {
alvo = 0;
}
if (millis() - ultimoPasso >= PASSO_MS) {
ultimoPasso = millis();
if (alvo > 0 && dutyAtual < DUTY_MINIMO) {
dutyAtual = DUTY_MINIMO;
} else if (dutyAtual < alvo) {
dutyAtual++;
} else if (dutyAtual > alvo) {
dutyAtual--;
if (dutyAtual < DUTY_MINIMO) {
dutyAtual = 0;
}
}
analogWrite(PINO_MOTOR, dutyAtual);
}
}
Com passo de 8 ms, ir de 70 a 255 leva cerca de um segundo e meio. Para um ventilador é suave; para um carrinho que precisa reagir rápido, diminua o passo.
O chiado que vem do motor
No Uno, o PWM do pino 9 fica perto de 490 Hz, e nos pinos 5 e 6, perto de 980 Hz. Essas frequências são audíveis, e o motor pode chiar em velocidade baixa. É normal. Mudar a frequência exige reprogramar timers, o que pode quebrar outras bibliotecas, como o receptor infravermelho e o servo. Só faça isso sabendo qual timer cada biblioteca usa.
Quando precisa inverter o sentido
Esse circuito gira o motor num sentido só. Para ir e voltar, você precisa de uma ponte H, com quatro chaves ou um módulo pronto. Não tente inverter trocando o pino de sinal ou ligando o motor entre dois pinos: o pino continua sem corrente para isso. O guia de sentido e velocidade do motor DC mostra a ponte H com o mesmo raciocínio de fonte separada.
Erros comuns
- Motor direto no pino. A corrente passa muito do limite do pino; o resultado vai de reset constante a pino queimado sem aviso.
- Esquecer o terra comum. O MOSFET recebe sinal sem referência, liga pela metade, esquenta e o motor gira de forma errática.
- Diodo ausente ou invertido. Sem diodo, o pico de desligamento destrói o transistor com o tempo; invertido, ele coloca a fonte em curto no primeiro teste.
- MOSFET que não é de nível lógico. Com 5 V no gate ele conduz mal, dissipa calor e entrega menos força ao motor.
- Alimentar o motor pelo USB ou pelo 5 V da placa. O pico da partida derruba a tensão e o Arduino reinicia justamente quando o motor arranca.
- Ignorar o calor. Transistor que queima o dedo em poucos segundos está mal escolhido ou mal ligado. Desligue e revise antes de pôr dissipador por cima do problema.
Checklist
- Você mediu ou leu a corrente do motor travado, e a fonte entrega mais que isso.
- O motor tem alimentação própria, separada do 5 V do Arduino.
- O negativo da fonte do motor está ligado ao GND do Arduino.
- O MOSFET é de nível lógico e a pinagem foi conferida na folha de dados.
- Há diodo em paralelo com o motor, com o catodo no positivo.
- Há resistor de gate e resistor de 10 kΩ entre gate e GND.
- O código usa rampa e respeita o duty mínimo do seu motor.
- Depois de cinco minutos em velocidade máxima, transistor e motor estão mornos, não quentes.
Olhe o seu circuito agora: se você desligar o Arduino da tomada, o motor perde a única fonte que tem? Se sim, ele ainda está pendurado no pino.