Ler tensões analógicas com microcontroladores é relativamente simples, a maioria dos microcontroladores de baixo custo têm periférico para leitura de tensão. Já obter valores analógicos (saídas) a partir destes mesmos processadores é bem mais específico, e merece um pouco mais de estudo para sua execução.
A maneira mais direta de se obter um valor analógico a partir de um microcontrolador é utilizando um periférico conhecido com DAC (
Digital-to-Analog converter) que se encarrega de converter sinal digital em analógico de forma independente; microcontroladores como o Arduino DUE e Arduino ZERO possuem módulos de DAC integrados, porém
outros como o Arduino UNO, Nano, Micro, Leornardo e Mega Não possuem este módulo.
A maneira mais direta e fácil de se criar uma saída analógica em microcontroladores que não a possuem é através de sinais PWM (Pulse-width modulation, ou
"modulação por largura de pulso"), pois o PWM é um sinal digital pulsante cuja característica é variar o período em nível alto ou baixo, e não a frequência de oscilação.
Obsevando a figura acima é possível concluir que a primeira onda é quadrada, está 50% do tempo em nível baixo e 50% em nível alto; isto faz com que a tensão media deste sinal seja 50% da tensão total. Já o sinal de baixo (retangular) está apenas 20% do tempo em nível alto, fazendo com que sua tensão média seja apenas 20% da tensão total.
Este efeito de variação de período (e não frequência) é a base para geração de um sinal analógico, porém não pode ser utilizado sem uma filtragem do sinal: uma saída analógica geralmente é em tensão contínua, não variando igual á imagem acima. Para resolver este problema é preciso utilizar um filtro
passa-baixas, que deixa "passar" apenas frequências baixas (abaixo de um certo valor).
A tensão "V average" (ou tensão média) na imagem acima é obtida após o sinal retangular mostrado ter passado pelo filtro passa-baixas. Na imagem abaixo é mostrado este filtro, que depende apenas de dois componentes: um resistor e um capacitor.
Você não precisa ser expert em eletrônica para calcular os valores do resistor e capacitor do filtro acima, basta utilizar Esta ou Esta ferramenta online e gratuíta. Uma informação básica solicitada nas duas ferramentas é a frequência do PWM, que no caso do
Arduino uno é 490 Hz na maioria dos pinos, porém os pinos 5 e 6 funcionam á 980 Hz.
A forma como os filtros passa-baixas funcionam é atenuando o sinal de saída, então quanto maior a frequência aplicada, maior a atenuação; porém calcular um filtro para uma frequência muito próxima á frequência que se deseja atenuar faz com que o filtro não seja tão eficaz. Um dos segredos do cálculo do filtro PWM para Arduino (por experiência própria) é calcular o filtro para em torno de 300Hz, ao invés de 490 Hz (que é a frequência do PWM do Arduino UNO).
A imagem acima demonstra a utilização
desta ferramenta, onde foram entrados os valores de Fc (frequência de corte) e C (capacitância), e o valor do resistor R sugerido (abaixo da imagem á esquerda) é de 5.1k ohm, dando uma frequência de corte de exatamente 312.06 Hz.
Isto significa que utilizando um Capacitor de 100nF e um resistor de 4.7k ohm (valor comercial de resistor 5% mais próximo de 5.1k ohm) é possível obter um sinal de 0 á 5V utilizando PWM no Arduino.
Na imagem acima a tensão analógica é obtida sobre o capacitor cerâmico de 100nF, onde o fio vermelho é a tensão analógica filtrada e o fio preto é o GND. O Arduino UNO pode ser configurado para ter 6 saídas PWM (pinos 3, 5, 6, 9, 10, 11), sendo que cada saída PWM deve ter um resistor em série com um capacitor para que o valor obtido seja analógico.
O código para teste do circuito acima se chama "fade.ino" e está disponível na IDE do Arduino, em "Arquivo > Exemplos > Básicos > Fade". O que ele faz é incrementar e decrementar (aumentar e diminuir) o valor analógico no pino 9 do Arduino, de pouco em pouco e continuamente.
/*
Fade
This example shows how to fade an LED on pin 9
using the analogWrite() function.
This example code is in the public domain.
*/
int led = 9; // the pin that the LED is attached to
int brightness = 0; // how bright the LED is
int fadeAmount = 5; // how many points to fade the LED by
// the setup routine runs once when you press reset:
void setup() {
// declare pin 9 to be an output:
pinMode(led, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
// set the brightness of pin 9:
analogWrite(led, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if (brightness == 0 || brightness == 255) {
fadeAmount = -fadeAmount ;
}
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
Obter uma saída analógica a partir de PWM é relativamente simples em qualquer microcontrolador, bastando para isso gerar e filtrar um PWM com um circuito passa-baixas (Resistor-Capacitor) calculado da forma correta.