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.
0x68 == 0b01101000

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 ;).

0 Responses so far.

Enviar um comentário