Calibração e calculos com LPC2103 + ADS1232

Bom dia Rapaziada...
Estou desenvolvendo uma balança e cheguei a um problema.... como fazer a calibração desta balança???
Primeiro que estou utilizando o LPC2103 de um kit chines, esse uC não possui divisão por hardware, certo???
Ai desenvolvi uma rotina para ler o valor do ADC no Keil, muito pobre, mas está funcionando (aceito criticas)!
Dados lidos:
- Sem peso na plataforma = 0x0A7BEB = 687083
- Com 5 kg na plataforma = 0x195FB0 = 1662896
- Com 10 kg na plataforma = 0x283CA4 = 2636964
OK... agora vem a calibração... eu pensei em fazer o seguinte... utilizar a técnica de equação termométrica... mas não funcionou porque quando esta processando estoura a variável long e fode o resultado!
Pensei em fazer da seguinte forma... pega valor do adc com 10 kg e subtrai o valor do adc sem peso (2636964 - 687083 = 1949881), ai eu vou ter o valor de 10.000 gramas, então eu divido por 10.000 para ter o valor de uma grama (1949881 / 10000 = 194,9881) e salvo na memória externa o valor referente a uma grama, calibração stored.
Ai eu preciso exibir o peso, pego o valor do ADC, por exemplo o valor de 5kg e subtraio o valor sem peso (1662896 - 687083 = 975813), divido pelo valor de 1 grama (975813 / 194,9881 = 5004,5) ... o que vocês acham?? alguem já desenvolveu algo parecido???
Escolhi o uC e o ADC porque acho que são mais baratos para a aplicação, alguém pensa o contrário ou diferente?
Valeu.
Estou desenvolvendo uma balança e cheguei a um problema.... como fazer a calibração desta balança???
Primeiro que estou utilizando o LPC2103 de um kit chines, esse uC não possui divisão por hardware, certo???
Ai desenvolvi uma rotina para ler o valor do ADC no Keil, muito pobre, mas está funcionando (aceito criticas)!
- Código: Selecionar todos
int ler_ADC() {
// Limpa a variável que recebe o valor do ADC
valorADC = 0;
// aguarda o pulso de DOUT (simboliza dados prontos)
do { } while(!(IOPIN0 & DOUT));
do { } while((IOPIN0 & DOUT));
// faz a leitura dos dados ADC (MSB primeiro)
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 8388608;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 4194304;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 2097152;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 1048576;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 524288;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 262144;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 131072;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 65536;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 32768;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 16384;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 8192;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 4096;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 2048;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 1024;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 512;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 256;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 128;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 64;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 32;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 16;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 8;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 4;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 2;
IOCLR0 = CLOCK;
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 1;
IOCLR0 = CLOCK;
return(valorADC);
}
Dados lidos:
- Sem peso na plataforma = 0x0A7BEB = 687083
- Com 5 kg na plataforma = 0x195FB0 = 1662896
- Com 10 kg na plataforma = 0x283CA4 = 2636964
OK... agora vem a calibração... eu pensei em fazer o seguinte... utilizar a técnica de equação termométrica... mas não funcionou porque quando esta processando estoura a variável long e fode o resultado!
Pensei em fazer da seguinte forma... pega valor do adc com 10 kg e subtrai o valor do adc sem peso (2636964 - 687083 = 1949881), ai eu vou ter o valor de 10.000 gramas, então eu divido por 10.000 para ter o valor de uma grama (1949881 / 10000 = 194,9881) e salvo na memória externa o valor referente a uma grama, calibração stored.
Ai eu preciso exibir o peso, pego o valor do ADC, por exemplo o valor de 5kg e subtraio o valor sem peso (1662896 - 687083 = 975813), divido pelo valor de 1 grama (975813 / 194,9881 = 5004,5) ... o que vocês acham?? alguem já desenvolveu algo parecido???
Escolhi o uC e o ADC porque acho que são mais baratos para a aplicação, alguém pensa o contrário ou diferente?
Valeu.