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