Ola Senhores.
Infelizmente sim.
O AD do PSoC é na verdade um AD de um único bit que utiliza um AmpOp para integrar as medidas em função do tempo, eu dei uma explicação mais detalhada para nosso amigo Hermecildes no tópico “Decimador”, confira no link:
http://asm51.eng.br/phpBB/viewtopic.php?t=1324
Se você observar a curva do AD incremental do PSoC, você poderá observar que ele não é linear em nenhum ponto de sua faixa.
Este erro depende de alguns fatores, tais como:
• Ruído da leitura do AD proveniente da fonte de clock, quanto mais rápido o clock, mais ruído, logo menos precisa sua leitura.
• Se você não estiver usando cristal, logo seu clock depende de um oscilador RC, ou seja você depende de deriva térmica.
O tipo de AD empregado na leitura, se não me engano o AD incremental é o mais ruidoso.
Mas como corrigir este evento?
Tabelar toda a leitura seria a opção mais fácil, mas no entanto é muito trabalhosa e a precisão não é tão boa assim, logo eu resolvi achar a função da curva do AD.
Eu usei o software Origin e plottei os dados neste cara,que me deu a equação da curva do AD.
Y= 85,83672 – 1419,81483X + 694,26523X^2 – 98,36434X^3 + 10,88419X^4 – 1,36877X^5
De posse desse polinômio (incrivelmente um polinômio de 5ª ordem, apesar da ultima expressão ser quase 1 poderia ser desprezada, mas eu precisava de muita precisão), eu o inseri no código de leitura do AD
while(ADCINC14_fIsDataAvailable() == 0);
AD = ADCINC14_iGetData();
ADCINC14_ClearFlag();
TensaoMedida = AD/3276.8;
erro = ( (85.83672) - (1419.81483 * TensaoMedida) + (694.26523 * (TensaoMedida*TensaoMedida)) - (98.36434 * (TensaoMedida*TensaoMedida*TensaoMedida)) + (10.88419 * (TensaoMedida*TensaoMedida*TensaoMedida*TensaoMedida)) - (1.36877 * (TensaoMedida*TensaoMedida*TensaoMedida*TensaoMedida*TensaoMedida)) );
calibrado =erro+AD;
Onde a leitura que eu fizer em “calibrado” esta ainda em bits, mas agora já linearizado em toda a sua faixa.
Espero não ter complicado muito.