Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

stm32 HX711 тензодатчик

Пт мар 25, 2022 10:37:06

Всем привет. Решил написать программу для весов. Заказал у китайцев плату с HX711 на борту. Датчик рассчитан на 300г. Вообщем, при измерении при нулевом весе датчик выдает число 837613. Что как бы многовато для взвешивания без груза. Также, насколько понял он должен выдавать 7FFFFFh при весе большем 300г. Он же не выдает 16764936 на 339г. Взвешивал разные грузы, взвешивает правильно +- 2-3г, но не могу понять почему без груза выдает дичь. Управляю простейшим ногодрыгом. Потом на SPI перекину управление. Вот код
Код:
uint32_t get_weight(void) {
   uint32_t adc_value = 0;
   TX711_PULSE_RESET();

   while (HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_6)) {} // DOUT падает, когда микросхема готова к работе. Проверяем падение
   delay_us(10); // ожидание после падения


   for (uint8_t i = 0; i < 24; i++) {
      TX711_PULSE_SET();
      delay_us(25);
      adc_value <<= 1;
      TX711_PULSE_RESET();
      if(HAL_GPIO_ReadPin(GPIOG, GPIO_PIN_6) > 0)
      {
         adc_value++;
      }
      delay_us(25);
   }
   TX711_PULSE_SET();
   delay_us(25);
   TX711_PULSE_RESET() ;
   delay_us(25);
   adc_value = adc_value ^ 0x800000;

   return adc_value;
}


Также интересует вопрос. Как обозначить конец преобразования? Т.е. я выдал 24 импульса, получил результат преобразования, выдал еще один импульс. Обозначил канал и коэффициент. И снова подаю 24 импульса. Но ведь из этих 24 первые два импульса пойдут на канал. Например в SPI мы поднимаем ногу CS, когда хотим закончить передачу. А здесь?

Да, китайскую плату немного подкорректировал. Соединил E- и Gnd. перепаял резисторы на одинаковый номинал. Перепаял резисторы на измерительные входы на 100 Ом. Т.к. читал, что китайская плата плохо работает от 3.3В. Может в этом косяк

Re: stm32 HX711 тензодатчик

Сб мар 26, 2022 04:17:27

Я тоже экспериментировал с таким датчиком и также начал с ногодрыга. Ниже моя "библиотека" для датчика. Она практически идентична Вашей. Однако, для ожидания падения линии данных следует предварительно ожидать её подъёма. Как только произойдёт подъём с последующим спадом, данные готовы. Датчик генерирует преобразование непрерывно. Функция setup() вызывается один раз при инициализации. Питал датчик от 3.3В, работает нормально.

Код:
#define HX711_GAIN      25                              // use channel A and x128 gain
#define IGNORE_BITS      4

void HX_delay(void)
{
   for (uint32_t i=0; i<5; i++){}
}

void HX711_setup(void)
{
   uint32_t i;
   (GPIO->P[5]).DOUTSET = HX711_CLK;                  // enter power-down mode
   Delay_ms(1);
   (GPIO->P[5]).DOUTCLR = HX711_CLK;                  // make sure that HX711_CLK is low
//   while (!((GPIO->P[4]).DIN & HX711_DOUT)){}
   while ((GPIO->P[4]).DIN & HX711_DOUT){}            // wait for HX711 ready
   for (i=0; i<HX711_GAIN; i++)
   {
      (GPIO->P[5]).DOUTSET = HX711_CLK;               // generate pulses
      HX_delay();                                       // corresponding to the selected gain
      (GPIO->P[5]).DOUTCLR = HX711_CLK;
      HX_delay();
   }
}

uint32_t HX711_getData(void)
{
   uint32_t val = 0, i;
   while (!((GPIO->P[4]).DIN & HX711_DOUT)){}
   while ((GPIO->P[4]).DIN & HX711_DOUT){}            // wait for data ready
   for (i=0; i<24; i++)
   {
      (GPIO->P[5]).DOUTSET = HX711_CLK;               // generate 24 pulses
      val = val << 1;
      HX_delay();                              
      (GPIO->P[5]).DOUTCLR = HX711_CLK;
      if ((GPIO->P[4]).DIN & HX711_DOUT)
         val++;
      HX_delay();
   }
   for ( ; i<HX711_GAIN; i++)                           // select next measurement
   {
      (GPIO->P[5]).DOUTSET = HX711_CLK;               // generate pulses
      HX_delay();                                       // corresponding to the selected gain
      (GPIO->P[5]).DOUTCLR = HX711_CLK;
      HX_delay();
   }   
   return(val >> IGNORE_BITS);
}


Как обозначить конец преобразования?

Полагаю, я на этот вопрос ответил. Если нет, значит я вопрос не понял и прошу уточнить.

Re: stm32 HX711 тензодатчик

Вт мар 29, 2022 13:10:19

Благодарю, видимо я криво объяснил. Непонятен вопрос. Вот идут импульсы один за другим в количестве 25 шт, потом следующие 25 и т.д. Как микросхема понимает, где конец кадр. Предположим у нас 100 импульсов. 4 посылки по 25. как HX определяет, что именно по 25. Т.е. 25-25-25-25, а не 27-27-27-19. Что нужно сделать после 25ого импульса, чтобы начать следующую передачу?

Re: stm32 HX711 тензодатчик

Вт мар 29, 2022 13:58:34

Опустить тактовый сигнал в ноль и ждать, когда линия выходных данных тоже станет 0. И выдержать паузу.
When output data is not ready for retrieval, digital output pin DOUT is high. Serial clock input PD_SCK should be low. When DOUT goes to low, it indicates data is ready for retrieval.


Изображение

Re: stm32 HX711 тензодатчик

Вт мар 29, 2022 14:04:45

Спасибо. Всё понятно. проглядел эту строчку в даташите :)
Ответить