sábado, 25 de agosto de 2018

Conversor A/D - Explicação e exemplo


Material de referência sobre conversão A/D e o Arduino UNO



Como Conversores Analógico_Digital Funcionam - Clube do Hardware



Arduino.cc - Tutoriais - Analog Read Serial

Arduino UNO - Sensor de temperatura interno
  

Exemplo de leitura analógica





/* 
 * convAd_1_0_0.ino
 *  
 * Conversor A/D - Exemplo
 * Leitura de Pino de entrada analógica (A0) e apresentação no LCD
 *  
 * Conexões com o Arduino UNO
 * LCD I2C – SDA/A4 SCL/A5
 * Potenciômetro - Extremos Vcc e GND - Central/variável A0
 *  
 * Versão: 
 * 0.0.0 -> Uso do exemplo de ligação do LCD por I2C 
 *          https://pilger-arduino.blogspot.com/2018/11/blog-post_80.html
 *          https://www.robocore.net/tutoriais/primeiros-passos-com-modulo-i2c.html
 * 1.0.0 -> Inclusão Pino A0
 *          Exemplo/01.Basics/AnalogReadSerial
 *          https://www.arduino.cc/en/Tutorial/BuiltInExamples/AnalogReadSerial
 * 
 * Data: 20/04/2021
 * Autor: Luiz Oscar Ruschel Pilger
 */

// inclusão de bibliotecas
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

// apelidos
#define pinoAnalogico A0

// variáveis globais
int valorAnalogico;

LiquidCrystal_I2C lcd(0x27,16,2);  // Criando um LCD de 16x2 no endereço I2C 0x27 PCF8574T
//LiquidCrystal_I2C lcd(0x3F,16,2);  // Criando um LCD de 16x2 no endereço I2C 0x3F PCF8574AT

//função setup executa 1 vez no início
void setup(){
  lcd.init(); // Inicializando o LCD
  lcd.backlight(); // Ligando o BackLight do LCD
  lcd.print("Coversor A/D"); // Exibindo no LCD texto
  lcd.setCursor(0,1); // posiciona o cluros no início da 2ª linha
  lcd.print("Valor = "); // imprime o texto
}

// função loop com código principal
void loop(){
  leituraAnalogica();
  atualizaLcd();
}

void leituraAnalogica (void){
  valorAnalogico=analogRead(pinoAnalogico); // Lê o conversor A/D
  delay(1); // atraso para estabilizar o conversor
}

void atualizaLcd (void){
  lcd.setCursor(9,1); // posiciona o cursor
  lcd.print(valorAnalogico); // imprime o valor analógico
  lcd.print("   "); // imprime 3 espaços para "apagar" numeros de 4 dígitos
}




Instabilidade do Conversor A/D


Em um sketch no simulador o código acima é "estável" (as leituras não variam)
Na prática é possível observar que os valores lidos (valor_convertido) variam bastante.

Como solução temos 2 sugestões que ajudam a "diminuir" essa instabilidade.

1) Colocar um capacitor em paralelo a entrada do conversor A/D.

Dentro do conversor A/D existe um capacitor que armazena uma tensão para ser convertida.
Um capacitor na entrada, acaba ficando "em paralelo" com este capacitor interno, e como capacitâncias em paralelo são somadas, isso faz com que o capacitor que forneça o valor a ser convertido tenha maior carga acumulada.






2) Fazer várias leituras (10 por exemplo) e tirar uma média dos valores

Com isso o código de leitura do conversor:

  valorAnalogico=analogRead(pinoAnalogico); // Lê o conversor A/D
  delay(1); // atraso para estabilizar o conversor


 Pode ser substituído por:

  valorAnalogico=0; // zera a variável
  for(int i=0; i<leituras; i++){ // laço com repetição de "leituras"
    valorAnalogico = valorAnalogico + analogRead(pinoAnalogico); // Acumula a nova leitura do Conv.A/D
    delay(1); // atraso para estabilizar o conversor
  }
  valorAnalogico = valorAnalogico/leituras; // faz a média de leituras



Lembrando que nesse código é usado um apelido "leituras" que deve ser criado

#define leituras 10







Nenhum comentário:

Postar um comentário