Básico - Projeto 80

Interrupção por timer no Arduino - gerando sinal de saída PWM

Objetivo

Neste projeto vamos mostrar como gerar um sinal de saída PWM (Pulse Width Modulation) diretamente em um pino do Arduino através de interrupção por timer. No exemplo, ao tocarmos em um sensor de toque (touch), acionaremos por interrupção externa um led que irá piscar e um buzzer que irá emitir som em um determinado tempo definido por uma onda PWM gerada por uma interrupção por timer. Desta forma, podemos receber o sinal PWM diretamente dos pinos de saída do Arduino sem a necessidade da função anogWrite() - referência Arduino - função analogWrite().

PWM (Pulse Width Modulation) - Modulação por Largura de Pulso

Refere-se ao conceito de pulsar rapidamente um sinal digital em um condutor. Quando geramos a modulação através da largura do pulso em uma onda quadrada podemos controlar a potência ou a frequência de um circuito.

  PWM signal with its two basic time periods | Download Scientific ...

A técnica de PWM é empregada em diversas áreas da eletrônica e, por meio da largura do pulso de uma onda quadrada, é possível o controle de potência ou velocidade nas aplicações de motores elétricos, aquecedores elétricos, leds e luzes nas diferentes intensidades e frequências. O Projeto 14 - Led com efeito dimmer usando potenciômetro é um ótimo exemplo de como utilizar o PWM para controlar a intensidade luminosa de um led utilizando a função analogWrite(). Veja abaixo um gráfico que mostra alguns exemplos de PWM de acordo com a razão cíclica (duty cycle) entre 0% e 100%.

Domine o PWM com Wagner Rambo - Embarcados

 

Interrupção externa (External Interrupts)

É quando o programa do Arduino está instruído para reagir à mudança de um sinal externo, por exemplo, mudança do nível lógico de um sinal gerado por um botão ou por um sensor qualquer (Referência Arduino). Faça o projeto Projeto 78 - Como realizar interrupção externa no Arduino usando sensor de toque para entender melhor como funciona a interrupção externa.

  • A ideia de utilizar a interrupção externa no Arduino em certos projetos, é quando precisamos realizar duas ou mais tarefas ao mesmo tempo.

Interrupção por timer (Timer Interrupts)

Semelhante à interrupção externa, a interrupção por timer ocorre através do tempo e não por uma ação externa do hardware, como um toque no sensor, por exemplo. Assim, a cada período podemos executar uma função independente, sem que a contagem do tempo seja interferida pelos demais comandos do programa. A interrupção por timer substitui as funções: delay(), millis() e o controle de loop for, gerando um intervalo de tempo independente. Faça o projeto Projeto 79 - Interrupção por timer no Arduino - disparo de alarme com sensor de toque e conhecer o recurso de interrupção por timer.

Obs.: Para gerarmos uma onda PWM e utilizarmos o recurso da interrupção por timer no Arduino precisaremos instalar a biblioteca TimerOne, conforme mostraremos durante o tutorial do projeto.

Aplicação

Para fins didáticos e projetos gerais.

Componentes necessários

Protoboard Protoboard 830 pontos 1 Resultado de imagem para protoboard 830v

No mínimo utilizar protoboard com 400 pontos

Jumpers Kit cabos ligação macho / macho 1  
Sensor de toque capacitivo Sensor touch TP223B
1

Tensão de Operação: 2 a 5V

Saída estado Alto (HIGH): 0,8V

Saída estado Baixo (LOW): 0,3V

Tempo de resposta: 220ms (LOW) e 60ms (HIGH)

datasheet

Led 5mm Led 5mm
1

1 LED alto brilho ou difuso de qualquer cor

Você poderá utilizar também LEDs de 3 mm e na cor que desejar.

Resistor Resistor 1

1 Resistores 150Ω ou maior

Se precisar usar outros valores, calcule o resistor apropriado para o led utilizado - Calcular Resistor.

Arduino UNO R3 Arduino UNO 1

Você poderá utilizar uma placa Arduino UNO original ou similar

Montagem do Circuito

Conecte os componentes no Protoboard como mostra a figura abaixo. Verifique cuidadosamente os cabos de ligação antes de ligar seu Arduino. Lembre-se que o Arduino deve estar totalmente desconectado da força enquanto você monta o circuito.


Atenção

1. Antes de montarmos o led e o buzzer é importante entendermos que ao usarmos o recurso de interrupção por timer, através da biblioteca TimerOne, a função analogWrite() não funcionará corretamente. Para resolver isto, podemos substituir a função analogWrite() pela método pwm() da biblioteca TimeOne, desde que utilizarmos os seguintes pinos:

 

1.1. Como vimos na tabela acima, podemos utilizar o pinos 9 e 10 do Arduino Uno, por exemplo, para gerarmos um sinal PWM através do recurso de interrupção por timer. No nosso exemplo vamos conectar o led no pino 9 e o buzzer no pino 10, garantindo-se assim a funcionalidade do método pwm() da biblioteca TimeOne.

2. Lembre-se que o LED tem polaridade: O terminal maior tem polaridade positiva e o lado do chanfro tem polaridade negativa.

2.1. Portanto, faça a conexão do Arduino no terminal positivo do led (anodo) e o GND no terminal negativo (catodo).

2.2. Para evitar danos ao led é necessário a inclusão de um resistor no circuito. Como o resistor é um limitador da corrente elétrica, ele poderá estar conectado no anodo (terminal maior) ou no catodo (terminal menor) do led, tanto faz.

3. Determinamos o valor do resistor através da tabela prática: Tabela prática de utilização de leds 3mm e 5mm. Entretanto, o mais correto é sempre verificar o datasheet do fabricante do LED para você ter os exatos valores de tensão e corrente do mesmo - leia Como calcular o resistor adequado para o led. (Obs.: Resistores superiores a 250 Ω poderão ser utilizados em LEDs de todas as cores para um circuito com tensão igual ou inferior a 5V).

3.1. Valores utilizados para nossos projetos: LEDs difusos ou de alto brilho: Vermelho, Laranja e Amarelo: 150 Ω | Led Verde e Azul: 100 Ω

4. O buzzer tem polaridade. Portando, cuidado para não ligar o buzzer invertido. Se você retirar o adesivo superior do buzzzer poderá ver um sinal de positivo (+). Este sinal mostra onde está o pino positivo do componente que deverá estar conectado ao potenciômetro (neste projeto) ou a uma porta digital do Arduino e o polo negativo ao GND.