A comunicação utilizada pela ADC é I2C, em que neste caso o MCU é o mestre e a ADC é o escravo. Mais informações e detalhes sobre I2C podem ser encontrados AQUI.
O endereço da ADC será o 0x68, pois "Adr0" e"Adr1" por opção minha vão ficar ligados a GND, ou seja em low state.
Para proceder à configuração da ADC, basta enviar o comando de escrita (ultimo bit do endereço == 0) com o endereço 0x68 e em seguida enviar o byte de configuração.
Este pode ser visto na pagina 18 do datasheet.
Para a aplicação pretendida, o primeiro byte de configuração enviado é 0b10010100.
Após isto a ADC fica pronta a fazer amostragens de forma automática, recorrendo ao oscilador interno. A periodicidade de amostragens será de 16.6mS (1/60Hz).
O programa a correr no MCU fica a fazer leituras constantes ao byte de configuração (enviado o comando "read" após o endereço 0x68) para fazer verificação do bit "RDY". Como mostrado na parte anterior (AQUI) quando enviado o comando de leitura, a ADC retorna 3 bytes: 2 primeiros referentes à conversão e o ultimo referente ao byte de configuração (que contém o bit de estado "RDY").
Assim que esse bit mudar de estado e passar a "0", zero, significa que os primeiros 2 bytes já recebidos, correspondem a uma nova conversão.
A próxima verificação feita é a do ganho do PGA. De acordo com o seu valor a interpretação do valor medido, da ADC, terá de ser diferente também. Na parte anterior este procedimento já foi explicado e o bloco em baixo penso que se "auto-explica"...
switch (gain)
{
case 0: //ganho 1
if(adc < 1023)
MCP3428_config(3); //ganho 8
else if(adc < 2047)
MCP3428_config(2); //ganho 4
else if(adc < 4095)
MCP3428_config(1); //ganho 2
uA_temp = 12.327 * adc; //valor de calibração - fluke 724
pga_gain = 1;
break;
case 1: //ganho 2
if(adc >= 8191)
MCP3428_config(0); //ganho 1
else if(adc < 2047)
MCP3428_config(3); //ganho 8
else if(adc < 4095)
MCP3428_config(2); //ganho 4
uA_temp = 12.389 * adc; //valor de calibração - fluke 724
pga_gain = 2;
break;
case 2: //ganho 4
if(adc >= 8191)
MCP3428_config(1); //ganho 2
else if(adc < 4095)
MCP3428_config(3); //ganho 8
uA_temp = 12.518 * adc; //valor de calibração
pga_gain = 4;
break;
case 3: //ganho 8
if(adc >= 8191)
MCP3428_config(2); //ganho 4
uA_temp = 12.644 * adc; //valor de calibração
pga_gain = 8;
break;
}
Por fim é actualizada uma variável global com o valor da corrente medida em uA. Essa variável contem sempre o valor válido mais recente e é expectável que seja actualizada a 60 vezes por segundo.
Um timer com interrupções a 50Hz (20mS), ligeiramente mais lento que a actualização da ADC para haver margem na alteração de ganhos do PGA, dá a ordem de partida dos dados (via USART) para o computador.
Os dados são então visualizados num terminal como mostra a imagem:
Assim se concluo mais um parte, mas as seguintes já vêm a caminho ;).