Criando uma saída analógica (0-5V) com Arduino

   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.

Marcadores: , , , , , , , , ,