Controle de Ventoinha PWM 4 Pinos 25 kHz com Arduino Uno – Montagem, Código e Teste
Componentes e Materiais
| Componente | Quantidade |
|---|---|
| Ventoinha Axial, 12 VDC (4 pinos PWM) | 1 |
| Arduino UNO | 1 |
| Cabo USB-A para Mini-USB | 1 |
| Jumpers (genéricos) | 1 conjunto |
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Sempre me perguntei como controlar ventoinhas PWM de 4 pinos. Tinha 5 unidades guardadas e decidi testar. Os valores de frequência podem ser ajustados entre 125 Hz e 8 MHz, bem como ciclo de trabalho variável. O circuito utiliza o modo 10 PWM de fase corrigida no timer 1: OCR1A (pino 9) e ICR1 (pino 10). Foi necessária alguma depuração para descobrir isso, e possuo um osciloscópio portátil que facilitou muito a visualização das frequências e ciclos de trabalho, eliminando a adivinhação.
Recomendo fortemente que você consulte o datasheet da sua ventoinha, pois o pino de controle no meu caso era amarelo (normalmente referido como fio de tacômetro). Certifique-se também de encontrar a faixa de frequência aceitável (ou FREQUÊNCIA CENTRAL) para sua ventoinha. Você pode precisar alterar a frequência no código para atender às suas necessidades. Finalmente, você precisará de uma boa fonte de alimentação (a minha é uma PSU ATX convertida de um PC antigo).
NOTA: Tentei usar outro timer para controlar 2 ventoinhas independentemente. Não funciona. A razão é a resolução do segundo timer ser menor (16 bits vs 8 bits). Isso significa que os passos nos ajustes de frequência e ciclo de trabalho ficam ruidosos e as formas de onda se deformam progressivamente. Também não é tão simples ao inserir valores.
Código
const byte OC1A_PIN = 9;
const byte OC1B_PIN = 10;
const word PWM_FREQ_HZ = 25000; // Ajuste este valor para alterar a frequência (em Hz!) (atualmente 25 kHz)
const word TCNT1_TOP = 16000000 / (2 * PWM_FREQ_HZ);
void setup() {
pinMode(OC1A_PIN, OUTPUT);
// Limpa registradores de controle e contagem do Timer1
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// Configuração do Timer1
// COM1A(1:0) = 0b10 (Saída A clear rising/set falling)
// COM1B(1:0) = 0b00 (Saída B operação normal)
// WGM(13:10) = 0b1010 (PWM fase corrigida)
// ICNC1 = 0b0 (Cancelador de ruído captura entrada desabilitado)
// ICES1 = 0b0 (Seleção de borda captura entrada desabilitada)
// CS(12:10) = 0b001 (Seletor clock entrada = clock/1)
TCCR1A |= (1 << COM1A1) | (1 << WGM11);
TCCR1B |= (1 << WGM13) | (1 << CS10);
ICR1 = TCNT1_TOP;
}
void loop() {
setPwmDuty(0);
delay(5000);
setPwmDuty(25); // Altere este valor 0-100 para ajustar ciclo de trabalho
delay(5000);
// setPwmDuty(50);
// delay(20000);
// setPwmDuty(75);
// delay(20000);
// setPwmDuty(100);
// delay(20000);
}
void setPwmDuty(byte duty) {
OCR1A = (word)(duty * TCNT1_TOP) / 100;
}
Esquemático
Processo de manufatura
- Controle de Brilho de LED com PWM via Botão no Arduino Mega
- Controle seu Ventilador de Teto com Alexa: Guia Passo a Passo
- Relógio em Tempo Real com Arduino para Horários de Oração Islâmica
- Mealheiro Inteligente: Controlar Aceitador de Moedas com Arduino Nano
- Controlar um LED via Bluetooth com Arduino – Guia DIY Simples
- Controle Dois Motores de Passo com Arduino Nano e Joystick – Tutorial Simples
- Como Exibir Imagens em LCD TFT 1.17" com Arduino UNO
- Controlando Matriz de LED 8×8 com Arduino Uno: Guia Passo a Passo
- Construa um Cubo de LED 4x4x4 com Arduino Uno e 1Sheeld – Projeto Interativo de LED
- ThimbleKrox: Controle de Mouse Dedo-Montado com Arduino Micro e MPU-6050