Em seu Application Note 5074 de maior de 2012, a Maxim (WWW.maximintegrated.com) sugere uma maneira simples de se implementar um conversor analógico-para-digital usando componentes comuns e um microcontrolador. O documento, de autoria de Gordon Lee, pode ser acessado na seção de documentação do site da Maxim e baixado na íntegra em sua versão em inglês,

A idéia básica, mostrada na figura consiste em se implementar um ADC de 8 bits com um amplificador operacional comum, resistores de precisão e um microcontrolador que, no caso, foi o MAXQ2000.

 


 

Os resistores de R3 a R18 formam a rede R/2R que determina a conversão, obtendo-se uma tensão que é aplicada ao amplificador operacional U1.

O amplificador operacional é usado como comparador, comparando a saída do CAC e a entrada analógica.

A saída de dados do microcontrolador varia ciclicamente numa ordem decrescente, aplicando o sinal nas entradas DAC. Cada saída instantânea do DAC é comparada com a tensão analógica. O circuito trava quando a saída e menor que a entrada analógica, obtendo-se então na entrada DAC a saída ADC.

Abaixo a listagem da Maxim para o microcontrolador usado:


#include "bitbanging_iomaxq200x.h"

void main(void)
{ 
  int wait;
  char DAC_out;

  PD0=0xFF;  //Sets IO port 0 to output (This port shows the ADC result)

  PD3=0xFF;  //Sets IO port 3 to output (This port connects to the DAC input)

  PD6_bit.bit2=0; //Sets IO port 6, pin 2, to input
		   //This pin connects to the output of the comparator

  while(1)
  {
    //Set DAC output to the MAX (DAC output = 3.3v) at the beginning
//Then decrease the DAC output 1 LSB at a time, 
//until the output of the comparator toggles low
    for(DAC_out=0xFF; DAC_out>=0; DAC_out--)
    {
      PO3=DAC_out;  //Sets the value of the output port 3 to DAC_out

      //wait for the output of the comparator to settle
      for(wait=0; wait<500; wait++); 

      //if the DAC output = 0V, and the output of the comparator is still 1
      if(PI6_bit.bit2==1 && DAC_out==0)
        PO0=0;  //Sets the ADC result = 0
      else if(PI6_bit.bit2==1)
        continue;
      else  //if the output of the comparator becomes 0
      {
        PO0=PO3;  //the ADC result = the value of the output port 3
        break;
      }
    }
  }
}