Eis que se chega à ultima parte, relacionada com o hardware construído - construção do funcionamento global.
A imagem seguinte mostra um pequeno diagrama de blocos com as principais tarefas realizadas pelo PIC12F1822 e que serão brevemente explicadas.
O MCU aguarda que pela USART seja recebido o comando para realizar e enviar uma nova leitura de peso, medido através da célula de carga.
Assim que esse pedido chega e é confirmado como tal, são realizadas 16 leituras da ADC, com a sua referência programada para 5V, posteriormente calculando a sua média. O objectivo, como já descrito na PART3, é determinar qual a melhor referência para a ADC com o intuito de melhorar também a sua resolução. As configurações do periférico são novamente modificadas para corresponder à referencia escolhida.
A função mostrada em seguida, não só aplica a referencia como realiza a medição da ADC e retorna esse valor.
unsigned int ADC_ref_read(unsigned char ref)
{
switch (ref)
{
case 0:
FVRCONbits.FVREN = 1; //enable reference
FVRCONbits.ADFVR = 0b01; //ADC FVR Peripheral output is 1x (1.024V)
while(!FVRCONbits.FVRRDY); //Fixed Voltage Reference output is ready for use
ADCON1bits.ADPREF = 0b11; //V+ = FVR
break;
case 1:
FVRCONbits.FVREN = 1; //enable reference
FVRCONbits.ADFVR = 0b10; //ADC FVR Peripheral output is 2x (2.048V)
while(!FVRCONbits.FVRRDY); //Fixed Voltage Reference output is ready for use
ADCON1bits.ADPREF = 0b11; //V+ = FVR
break;
case 2:
FVRCONbits.FVREN = 1; //enable reference
FVRCONbits.ADFVR = 0b11; //ADC FVR Peripheral output is 4x (4.096V)
while(!FVRCONbits.FVRRDY); //Fixed Voltage Reference output is ready for use
ADCON1bits.ADPREF = 0b11; //V+ = FVR
break;
case 3:
FVRCONbits.FVREN = 0; //disable reference
ADCON1bits.ADPREF = 0b00; //V+=vcc
break;
}
_delay(40); //Wait the required acquisition time(2) - 5uS
ADCON0bits.GO_nDONE = 1; //Start conversion by setting the GO/DONE bit.
while(ADCON0bits.GO_nDONE);
return (ADRESH<<8)+ADRESL;
}
Ultrapassada esta parte, são realizadas 31 medições com uma frequência de amostragem de 10KHz (uma amostra a cada 100uS). Estas são utilizadas para criar um filtro FIR de 30ª ordem com uma frequência de corte de 10Hz. Esta etapa é muito importante para reduzir ao máximo possíveis erros de leitura provocados por ruído ou qualquer outro relacionado. Tudo sobre filtros FIR, incluindo o cálculos dos coeficientes para a multiplicação, pode ser encontrado AQUI.
A particularidade utilizada por mim, nesta parte, consiste na multiplicação dos coeficientes por uma constante que os torne a todos números inteiros de 8 bits, para facilitar os cálculos pelo MCU.
No código acima, o vector x[] armazena os valores resultantes da medição da ADC, o vector h[] contém os coeficientes do filtro (todos multiplicados por 2^12, para os tornar inteiros de 8bits), a variável "filtro" corresponde ao valor de medição obtido pelo filtro e por ultimo a variável "cod" volta a dividir o valor calculado e resultante do filtro por 2^12 de modo a obter um valor na mesma relação que a ADC.
Posteriormente estes dados são organizados em 2 bytes, junto com um checksum de 4bits e enviado pela USART para o computador. Lá são recebidos, "descompactados" convertidos em valores de força (peso) que podem ser mostrados à plateia.
O artigo seguinte deverá conter algumas fotos do circuito construído assim como uma breve explicação da sua utilização.
0 Responses so far.
Enviar um comentário