Как откалибровать тензодатчик?

Я работаю с тензодатчиком и HX711. На датчике не было веса, но я продолжал получать странные значения, я думал, что он сломан или что-то в этом роде, поэтому я использовал свой второй тензодатчик, но то же самое произошло снова. Мне интересно, что в этом плохого? Если кто-то работал с этим или у вас есть идеи, как с этим работать, пожалуйста, не стесняйтесь высказывать свое мнение.

 #include "HX711.h"
#include <Wire.h> 

#define DOUT  A0
#define CLK   A1

#define DEC_POINT  2
#define STABLE  1

float offset=0;
float calibration_factor = 1;
//float real_weight = 1.560;//kg
float real_weight = 0.5;//kg

HX711 scale(DOUT, CLK);

unsigned char state=0;
long  FindZeroFactor();
float get_units_kg();
void  ReadWeight();
void  FindCalibrationFactor();

void setup()
{
  Serial.begin(115200);
  Serial.println();
  Serial.println("Auto Calibrate Program");
  Serial.println("Send 'a' to Find Zero Factor (Please Remove all weight from scale)");
  Serial.println("Send 'b' to Find Calibration Factor (Please insert know the weight on the scales)");
  Serial.println("Send 'c' Show weight on the scales");
}
void loop() 
{
  if(Serial.available())
  {
    char temp = Serial.read();
    if(temp=='a')
      state=1;
    if(temp=='b')
      state=2;   
    if(temp=='c')
      state=3;
  }

  switch(state)
  {
    case 0:
    break;
    case 1:
      FindZeroFactor();
   //   ReadWeight();
      state=0;
    break;
    case 2:
     FindCalibrationFactor();
     state=0;
    break;
    case 3:
      ReadWeight();
      delay(200);
    break;
    case 4:

    break;

  }
}

long FindZeroFactor()
{
     Serial.println("Find Zero Factor");
     Serial.println("Please wait .....");
     scale.set_scale();
     scale.tare(); 
     long zero_factor = scale.read_average(20); 
     Serial.print("Zero factor: ");
     Serial.println(zero_factor);
     return(zero_factor);
}

void FindCalibrationFactor()
{
  unsigned char flag_stable=0;
  unsigned int decpoint=1;
  for(unsigned char i=0;i<DEC_POINT+1;i++ )
    decpoint = decpoint*10;
  while(1)
  {
      scale.set_scale(calibration_factor); //Adjust to this calibration factor
      Serial.print("Reading: ");
      float read_weight = get_units_kg();
      String data = String(read_weight, DEC_POINT);
      Serial.print(data);
      Serial.print(" kg"); 
      Serial.print(" calibration_factor: ");
      Serial.print(calibration_factor);
      Serial.println();
      long r_weight      = (real_weight*decpoint);
      long int_read_weight = read_weight*decpoint;
      Serial.print(r_weight);
      Serial.print(" , ");
      Serial.println(int_read_weight);
      long x;
      if(r_weight == int_read_weight)
      {
        flag_stable++;
        if(flag_stable>=STABLE)
        {
          Serial.print("Calibration Factor is = ");
          Serial.println(calibration_factor);
          break;
         }
        }
       if(r_weight > int_read_weight)
          {
            x = r_weight - int_read_weight;
            if(x > 100)
              calibration_factor -= 1000; 
            else if(x > 100)
              calibration_factor -= 10;
            else
              calibration_factor -= 1;
            flag_stable=0;
          }
          if(r_weight < int_read_weight)
          {
            x =  int_read_weight-r_weight;
            if(x > 100)
              calibration_factor += 1000; 
            else if(x > 10)
              calibration_factor += 10;
            else
              calibration_factor += 1; 
            flag_stable=0; 
           }  
  }
}

float get_units_kg()
{
  return(scale.get_units()*0.453592);
}
void ReadWeight()
{
  scale.set_scale(calibration_factor); //Adjust to this calibration factor
  Serial.print("Reading: ");
  String data = String(get_units_kg()+offset, DEC_POINT);
  Serial.print(data);
  Serial.println(" kg");
}

, 👍1

Обсуждение

Может быть, это перепады напряжения или ненадежное заземление?, @Code Gorilla

Или это может быть ваш (неуказанный) контур?, @Majenko

Типичные примеры показывают обнуление при запуске. После обнуления калибровка может быть такой же простой, как известная масса или несколько для проверки линейности. Если у вас есть другие весы, найденные объекты подойдут, в противном случае вы можете получить грубый набор калибровочных грузов. Если у вас есть датчик луча, убедитесь, что он не перевернут. Будьте осторожны, всегда будет шум — вы, вероятно, захотите некоторую фильтрацию в том, что вы отображаете, снова см. типичные примеры., @Chris Stratton

@Matt, я в курсе и все проверил., @geniusme

@Majenko что ты имеешь в виду?, @geniusme

@ChrisStratton Я нашел несколько примеров кода и использую один, но теперь я получаю ноль, даже когда ставлю датчик на ожидание. PS: я использую датчик нагрузки на растяжение и сжатие, @geniusme

@geniusme Я говорю, что, возможно, что-то не так со схемой, которую вы используете для сопряжения вашего тензодатчика с Arduino - однако вы не показали нам эту схему, поэтому мы не можем сказать. Пожалуйста, покажите вашу схему, а также ваш код. Без этого мы не сможем вам помочь., @Majenko

@Majenko Я подключаю свою схему вот так [ссылка](http://www.naylampmechatronics.com/img/cms/Blog/Tutorial%20HX711/Conexiones.JPG), @geniusme

@geniusme Мне это ничего не говорит. Что это за соединения? Куда они идут? Что это за схема у вас там? Я предполагаю, что где-то там должна быть какая-то форма моста Уитстона, да?, @Majenko

@Majenko да, это так, @geniusme

@Majenko Я использую тензодатчик для взвешивания вещей, которые на другой плате представляют собой преобразователь A/N и усилитель (разница очень мала, поэтому нам нужно усилить ее, чтобы получить заметный результат), @geniusme

Не могли бы вы добавить пример вывода к вопросу? В вопросе вы сказали, что получаете странные значения, но в комментариях вы сказали, что получаете только 0., @Gerben

потому что я начал использовать библиотеку, теперь, когда у меня нет ничего на датчике, он показывает ноль, а когда я ставлю известный вес, он дает мне значение, но не вес. Я пытаюсь найти математическую формулу, чтобы получить правильный вес, @geniusme

Является ли значение постоянным? Если это так, и вы находитесь в линейном диапазоне, то математическая формула заключается в умножении на константу. Вы спрашиваете, как вычислить константу? Если да, то каков известный вес и каково отображаемое значение., @Dave X

@DaveX Я нашел математическое уравнение, спасибо! Мне было интересно, если у меня много тензодатчиков, придется ли мне калибровать каждый из них каждый раз?, @geniusme

@genuisme Чтобы получить очень высокий уровень точности, да. Тензодатчики и электроника подвержены механическим, производственным изменениям, ползучести и т. д., и использование общего калибровочного коэффициента сделает ваши системы восприимчивыми к этим факторам. Для достижения наивысшего уровня точности вам следует провести повторную калибровку с известными эталонами веса в интересующем диапазоне перед измерением, а затем повторно проверить дрейф., @Dave X


2 ответа


0
scale.set_scale(calibration_factor); 

необходимо изменить на:

scale.set_scale(calibration_factor/[the reference weight you have used]); 
,

Привет, Реза, и добро пожаловать на Arduino.SE! Хотя твой ответ может быть правильным, он немного краток. Не мог бы ты расширить наш ответ и объяснить, почему требуется это изменение?, @Greenonline


1

Первое, что всегда приходит мне на ум в отношении тензодатчиков, это схема, которая усиливает сигнал тензодатчика. Обычно сигнал тензодатчика изменяется в диапазоне низких мВ, поэтому вам приходится размещать схему с высоким коэффициентом усиления на пути сигнала, которая усиливает сигнал и ШУМ. Для этой цели вам придется использовать инструментальный усилитель, иначе ваш сигнал станет очень шумным.

И попробуйте также реализовать цифровой фильтр нижних частот, он должен компенсировать колебания и даст вам более плавный сигнал.

,