Página 1 de 1

Calibração e calculos com LPC2103 + ADS1232

MensagemEnviado: 09 Dez 2013 10:11
por eng.viniciuspais
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)!
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.

Re: Calibração e calculos com LPC2103 + ADS1232

MensagemEnviado: 09 Dez 2013 15:24
por andre_luis
O processo que voce sugeriu é nada mais que uma interpolação linear, qye de certa forma é uma regra de 3 aplicada á valores intermediarios.

A calibração tem de ser realizada em 2 parametros: Ganho e Offset.
Na figura abaixo são representados pelo parametro M e YA :

Imagem

Ou seja, de um modo simplificado, a equiação geral é a seguinte : Y = m.x + YA
Sendo que os parametros devem ser ajustados da seguinte forma : Y = (m+mc).x + (YA+Yc)

+++

Re: Calibração e calculos com LPC2103 + ADS1232

MensagemEnviado: 09 Dez 2013 18:28
por eng.viniciuspais
Mas não dá para ser deste jeito "Y = m.x + Ya" ou Y = a.x + b (assim que eu aprendi)!!!
Vai terminar em uma divisão!

Ganho = (ValorADC_para_10kg - ValorADC_para_0kg) / (0_kg - 10_kg)
Ganho = (2636964 - 687093) / 10000
Ganho = 1949871 / 10000
Ganho = 194,9871 (admensional)

Offset = ValorADC_para_0kg
Offset = 687093 (admensional)

Peso = (ValorADC - Offset) / Ganho
Peso = (1662896 - 687093) / 194,9871
Peso = 975803 / 194,9871
Peso = 5004,4490
Peso ≅ 5004 (gramas)

Esse é o jeito melhor de processar estes dados???
Desculpe minha ignorancia, mas sou iniciante em ARM, C e o resto!

Valeu!

Re: Calibração e calculos com LPC2103 + ADS1232

MensagemEnviado: 09 Dez 2013 20:45
por andre_luis
eng.viniciuspais escreveu:Esse é o jeito melhor de processar estes dados???


Sim, e no su caso, a calibração já foi feita implicitamente, já que voce usou os pesos de 10Kg como referencia para obter o parametro m.
Porém, para o parametro Ya, esse exibe uma certa disperção, e a sua calibração deve ser feita com mais frequencia ( conhecido como Tara ).

eng.viniciuspais escreveu:Vai terminar em uma divisão!


Mesmo que determinado uC não possua divisão em sua ALU, o C já a realiza nativamente quando se utiliza o operador "/" das fórmulas acima.


+++

Re: Calibração e calculos com LPC2103 + ADS1232

MensagemEnviado: 09 Dez 2013 21:02
por eng.viniciuspais
Positivo... Quanto ao código que eu fiz para ler este ADC, o que tu acha?

Estou começando agora, desculpa se ficou uma porcaria!
Como posso melhora-lo?

Valeu Andre_teprom!

Re: Calibração e calculos com LPC2103 + ADS1232

MensagemEnviado: 10 Dez 2013 09:23
por styg
Vinicius, em vez de ficar somando o valor decimal, para montar o valor do resultado faça em binário e vá deslocando, exemplo abaixo (não testado, apenas para demonstrar o processo)

cpp code
int ler_ADC() { 
char i;
// aguarda o pulso de DOUT (simboliza dados prontos)
do { } while(!(IOPIN0 & DOUT));
do { } while((IOPIN0 & DOUT));

// Limpa a variável que recebe o valor do ADC
valorADC = 0;

// faz a leitura dos dados ADC (MSB primeiro)
for(i=0; i<n_bits; i++)
{
IOSET0 = CLOCK;
if (IOPIN0 & DOUT)
valorADC += 1;
IOCLR0 = CLOCK;
valorADC << 1;
}

return(valorADC);
}

Re: Calibração e calculos com LPC2103 + ADS1232

MensagemEnviado: 10 Dez 2013 09:38
por eng.viniciuspais
Positivo.... vou testar aqui...

cpp code
// aguarda o pulso de DOUT (simboliza dados prontos)
do { } while(!(IOPIN0 & DOUT));
do { } while((IOPIN0 & DOUT));


Vou colocar uma interrupção para não precisar ficar aguardando as bordas!

Re: Calibração e calculos com LPC2103 + ADS1232

MensagemEnviado: 10 Dez 2013 16:48
por eng.viniciuspais
styg escreveu:Vinicius, em vez de ficar somando o valor decimal, para montar o valor do resultado faça em binário e vá deslocando, exemplo abaixo (não testado, apenas para demonstrar o processo)

Código: Selecionar todos
int ler_ADC() {
   char i;
   // aguarda o pulso de DOUT (simboliza dados prontos)
   do { } while(!(IOPIN0 & DOUT));
   do { } while((IOPIN0 & DOUT));

   // Limpa a variável que recebe o valor do ADC
   valorADC = 0;

   // faz a leitura dos dados ADC (MSB primeiro)
   for(i=0; i<n_bits; i++)
   {
   IOSET0 = CLOCK;
   if (IOPIN0 & DOUT)
      valorADC += 1;
   IOCLR0 = CLOCK;
   valorADC << 1;
   }

   return(valorADC);
}


Funcionou!!! Agora estou usando LPC1768... o LPC2103 deve ter dado problema na UART0.... fica entre 8 e 10 volts oscilando mesmo sem programa, energizou ela fica doida!
Agora vou testar a calibração e calculos!
Valeu

Re: Calibração e calculos com LPC2103 + ADS1232

MensagemEnviado: 13 Dez 2013 18:41
por Andre_Cruz
Olá eng.viniciuspais

Já pensou em levantar alguns pontos e fazer uma regressão linear ? Você consegue fazer isso no excel veja


Abraço