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;
}
}
}
}