- Resistor 120Ω
- LED
- Arduino Uno
- Protoboard
- Jumpers
PWM é a sigla para Pulse Width Modulation ou modulação por largura de pulso, o qual é empregada em diversas aplicações na eletrônica, como por exemplo em fontes chaveadas, no controle de velocidade de motores, controle de servos motores e muitas outras.
Através do controle do tempo entre o pulsar da saída entre ligado e desligado é possível controlar a tensão média entregue a carga, quanto maior o tempo que a saída fica em nível lógico alto, maior a tensão média.
Para o funcionamento do PWM deve-se variar a largura do pulso da onda, ou seja, o tempo que a saída permanece em nível lógico alto. A largura do pulso é o tempo em que a saída está em nivel lógico alto, medido em milissegundos.
Variando-se a largura do pulso, é possível variar também a tensão média entregue a carga, com isso a potência disponibilizada.
O Duty Cycle, ou ciclo de trabalho, é a proporção entre o tempo em que a saída está em nível lógico alto em comparação com o tempo que a saída está em nível lógico baixo, é também expresso como a porcentagem do tempo ligado. Por exemplo, um Duty Cycle de 60%, é um sinal que está ligado 60% do tempo e desligado os outros 40%.
Fig. 1: Gráfico do sinal.
Utilizando o Arduino é possível verificar o comportamento das sáidas PWM. Foi utilizado um Arduino Uno acionando um LED através do pino 3 que é um dos pinos compatíveis com PWM.
O esquema ficou da seguinte forma:
Onde está ligado um LED com o anodo no pino 3 do Arduino e o catodo no GND passando por um resistor de 120Ω.
A programação do Arduino ficou assim:
1: /* 2: Saídas PWM 3: 4: Este é um exemplo utilizando as Saídas PWM (analogWrite). 5: Por Alessandro Silva 6: */ 7: 8: int led_1 = 3; 9: int brilho = 0; // Variável do tipo integer com nome "brilho". 10: 11: 12:
void
setup() { 13: pinMode(led_1, OUTPUT); 14: Serial.begin(19200); 15: Serial.flush(); 16: Serial.println("Digite um valor entre 0 e 5"); 17: } 18: 19: void loop() { 20: if(Serial.available()>0) { 21: brilho=Serial.read(); 22: 23: if(brilho>=48, brilho<=53){ //Valores convertidos de ASCII para DECIMAL 24: 25: switch (brilho) { 26: case 48: //Valor que corresponde a 0 em ASCII 27: analogWrite(led_1, 0); 28: Serial.println("Saída em 0%"); 29: break; 30: case 49: //Valor que corresponde a 1 em ASCII 31: analogWrite(led_1, 51); 32: Serial.println("Saída em 20%"); 33: break; 34: case 50: //Valor que corresponde a 2 em ASCII 35: analogWrite(led_1, 102); 36: Serial.println("Saída em 40%"); 37: break; 38: case 51: //Valor que corresponde a 3 em ASCII 39: analogWrite(led_1, 153); 40: Serial.println("Saída em 60%"); 41: break; 42: case 52: //Valor que corresponde a 4 em ASCII 43: analogWrite(led_1, 204); 44: Serial.println("Saída em 80%"); 45: break; 46: case 53: //Valor que corresponde a 5 em ASCII 47: analogWrite(led_1, 255); 48: Serial.println("Saída em 100%"); 49: break; 50: } 51: } 52: else { 53: Serial.println("Digite um valor válido"); 54: } 55: delay(30); 56: } 57: }
Através do monitor serial altera-se o valor da saída no pino 3. Onde digita-se valores de 0 a 5, em que:
- 0 = Saída desligada (Saída em 0 volts)
- 1 = Saída com duty cycle em 20%
- 2 = Saída com duty cycle em 40%
- 3 = Saída com duty cycle em 60%
- 4 = Saída com duty cycle em 80%
- 5 = Saída ligada (Tensão máxima)
Segue abaixo as imagens do monitor serial para as diferentes possibilidades de saída:
Fig. 5: Saída em 60%.
Fig. 8: Saída desligada.
Fig. 9: Saída ligada.
Fig. 10: Saída em 80%.
Fig. 12: Saída em 40%.
Fig. 13: Saída em 20%.
Fig. 14: Saída desligada.
Com isso é possível definir qualquer nível de tensão na saída PWM do Arduino Uno, com uma resolução de 8 bits (0 a 255).