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.
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çãopga_gain = 4; break; case 3: //ganho 8 if(adc >= 8191) MCP3428_config(2); //ganho 4 uA_temp = 12.644 * adc;
//valor de calibraçãopga_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