domingo, 28 de junho de 2015

Hx711 6ª Parte - Média + TARA

 

    Pelo esquema do modulo HX-711 podemos ver que o pino RATE e o pino X1 estão ligados ao terra, ou seja esta configurado para usar o oscilador interno com uma taxa de amostragem próxima a 10 amostras por segundo (10 SPS ).
 Como temos 10 SPS a conversão ocorre a aproximadamente a cada 0,1 segundos ou 100ms (100 mili-segundos). Vamos começar com uma media para 5 amostras ou 500ms a cada pedido de captura! 

Média de cinco amostras.

Para o calculo da media (pequeno filtro) a ideia é criar um código bem simples,  um for (loop) que soma a cada passagem depois divide pelo numero de passagens do loop. 

  unsigned long MEDIA = 0;  
  for (int j=0; j<5; j++){             // loop 5 para media
  ........  // Código captura
  MEDIA += CAPTURA;
  }
   CAPTURA = MEDIA/5;
 return CAPTURA;

Determina o valor de TARA.

    Os valores de amostra sem carga (peso em cima da balança) apresentam uma variação muito alta. Somente a partir de uns 3Kg de carga, que as leituras estão se estabilizando, vamos criar uma media bem maior com 10 (dez) passagens de captura. Totalizando 50 AMOSTRAS para o calculo da media da TARA (50 vezes 0,1 segundos da uns 5 segundos para operação de TARA). 

unsigned long TARA = 0; 

  for (int i=0; i<10; i++) TARA +=CAPTURA();

return TARA/10;



    Depois de uns testes rápidos, decidi que o melhor é criar uma sub rotina MEDIA(x), para ser usada dentro das rotinas TARA e CAPTURA, para facilitar o código.

unsigned long setTARA(){

  // reseta o conversor HX711

  digitalWrite(hxSCK, 1);  

  delay (200);

  digitalWrite(hxSCK, LOW); 

  // -------------------------

 return Media(70);        // Calcula média de 350 AMOSTRAS 35 segundos!

}    


Calculo Geral da Média. 

Como na função CAPTURA foi calculada uma media de cinco amostras e para pequenos valores de peso não ficou adequado, vamos fazer uma rotina que possamos definir o numero de AMOSTRAS para o calculo da média para usarmos de uma forma mais dinâmica posteriormente.





long Media(byte vezes)

{

    long soma = 0;

    for (byte i = 0; i < vezes; i++)

    {

        soma += CAPTURA();

    }



    return soma / vezes;


}


Calcular o valor do peso.

    Para calcular o peso iremos precisar determinar uma serie de constantes kx (tabela) para as faixas de pesos de interesse. Inicialmente faremos para pequenos valores de peso até uns 15 Kg, para isso vamos pesar algo próximo a 10Kg e determinaremos o valor de k0 para esta faixa de pesos. Posteriormente teremos mais alguns fatores kx para aumentar a precisão nas faixas de interesse. 


float Peso()

{

    long peso = (Media(X) - TARA); // X numero  de amostras 

    return (float) peso / kconst;

}



Para pequenos valores de peso o valor de X deve ser alto! O próximo passo e criar uma media móvel para que o tempo entre leituras parecer mais adequado. 



O código para o segundo teste ficou (muito tempo entre as leituras ótima repetibilidade):
const int DOUT = A5;      // Pino DT placa HX711
const int hxSCK = A4;     // Pino SCK placa HX711
unsigned long TARA = 0;
float kconst = 21097.164; // Fator para Kilograma pequenos pesos


void setup() {
  Serial.begin(9600);
  pinMode(hxSCK, OUTPUT);
  pinMode(DOUT, INPUT);
  Serial.println("Aguarde estou zerando!");
  TARA = setTARA();
  Serial.println("Estou pronto!");
}

void loop() {
     Serial.print(Peso());
     Serial.println(" Kg");
     delay (10); //Aguarda 10ms

}


unsigned long CAPTURA(){
  unsigned long CAPTURA = 0;
  unsigned long MEDIA = 0;  
  for (int j=0; j<5; j++){             // loop 5 para media
  CAPTURA = 0;
  digitalWrite(hxSCK, LOW); 
  while (digitalRead(DOUT)==1) ;
  for (int i=0; i<24; i++){             // loop 24 pulsos
        digitalWrite(hxSCK, HIGH); 
        CAPTURA = CAPTURA<<1;
        digitalWrite(hxSCK, LOW);
        if(digitalRead(DOUT) == 1) CAPTURA++;
        } 
   // pulso extra 25 pulsos proxima leitura canal A ganho 128     
   digitalWrite(hxSCK, HIGH); 
   delayMicroseconds(10); 
   digitalWrite(hxSCK, LOW);
   //-------------------------------------------------------
  CAPTURA ^= 0x00800000; 
  MEDIA += CAPTURA;
  }
   CAPTURA = MEDIA/5;
 return CAPTURA;
}



unsigned long setTARA(){
  // reseta o conversor HX711
  digitalWrite(hxSCK, 1);  
  delay (200);
  digitalWrite(hxSCK, LOW); 
  delay (1);
  // -------------------------
 return Media(70);
}    

float Peso()
{
    long peso = (Media(50) - TARA);
    return (float) peso / kconst;
}

long Media(byte vezes)
{
    long soma = 0;
    for (byte i = 0; i < vezes; i++)
    {
        soma += CAPTURA();
    }

    return soma / vezes;
}

  


Nenhum comentário:

Postar um comentário