A empresa americana SpaceX conseguiu, após 4 tentativas falhadas, realizar a aterragem do seu foguete Falcon 9 pela primeira vez. Este foi um feito inédito na história espacial, motivado pelo desejo de reduzir custos e de transformar os foguetes em naves com possibilidade de reutilização. A SpaceX lançou com sucesso o Falcon 9 com o objetivo de transportar 11 satélites à órbita baixa da Terra e depois conseguiu fazer regressar ao planeta a primeira fase do engenho.

Junto podem vê-se 2 fotos do aspecto final do sistema construído.
De forma breve, pode fazer-se a seguinte legenda:
1 - conversor USB-serie: foi soldado o módulo directamente de modo a tornar a construção mais rápida;
2 - conversor DC/DC: este é o responsável pela obtenção das tensões +15V e -15V para alimentar toda a instrumentação.
3 - conector para a célula de carga: por aqui segue a alimentação e o sinal a medir;
4 - amplificador de instrumentação INA126: responsável pela amplificação diferencial do sinal medido;
5 - dual opamp LM358: responsável pela referencia ao amplificador de instrumentação e pela detecção do zero;
6 - microcontrolador PIC12F1822: responsável pela amostragem, processamento e envio dos valores medidos para um computador.
De frisar, na segunda fotografia, o pormenor da atenção dada na colocação dos condensadores SMD o mais junto possível aos pinos de alimentação e com um desenho sem o recurso a trilhas de sinal demasiado longas e/ou a percorrer caminhos "estranhos". Por isso, e como de costume, não foi utilizado nenhuma ferramenta de auto-routing. 

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.