Подключение к UNO HX711 в режиме 80Гц

Pablos
Pablos аватар
Offline
Зарегистрирован: 18.07.2017

Привет всем!

Подключаю тензодатчики к UNO через АЦП HX711. Использую библиотеку Queuetue HX711 Library version=1.0.2 

В режиме замеров с частотой 10Гц все ОК, но мне это очень медленно. Перепаял перемычку на АЦП в режим 80ГЦ. Все работает как надо, но с периодичностью 10...20 сек приходит кривой замер с явно неверным 1 битом (см. рис.).  Выглядит как ошибка передачи 1 бита данных по последовательной шине. Бороться с ним программно (удалять) - как-то не по феншую. На лицо ошибка передачи данных.

Никто не сталкивался с таким? Может при смене частоты замеров нужно и скорость передачи как-то подправить? Про это в даташите ничего нет... ((((

Выбросы в замерах.

 

П.

Pablos
Pablos аватар
Offline
Зарегистрирован: 18.07.2017

P.S. Там чтение через ShiftIn() идет. Т.е. скорость сама определяется. Выходит наоборот - SCK короток. 
Согласно даташиту частота как-то подозрительно широко может гулять - T3+T4 = 0.4 до 50 мкс
Есть подозрение, что с UNO с 16 МГц просто не успевает. Или кабель слишком длинный у меня - 2 м.

Pablos
Pablos аватар
Offline
Зарегистрирован: 18.07.2017

Кабель исключаем. Проверил без кабеля - та же фигня... (

Pablos
Pablos аватар
Offline
Зарегистрирован: 18.07.2017

Никто не ответил, а я нарыл за день столько, что можно книжку написать - "Как правильно и как НЕправильно работать с АЦП" )))))

Сначала думал, что проблема в самой функции ShiftIn(), т.к. я не вижу, что там внутри происходит. Отказался от всяких левых библиотек. Заменил на рекомендуемый производителем код (и это правильно!):

void Init_Hx711()
{
 pinMode(HX711_SCK, OUTPUT); 
 pinMode(HX711_DT, INPUT);
}

unsigned long HX711_Read(void)  // китайская версия без ShiftIn
                                // на основе примера из datasheet
{
 unsigned long count; 
 byte i;

 digitalWrite(HX711_DT, HIGH); // Зачем не ясно, но есть в даташите
 digitalWrite(HX711_SCK, LOW); // ...Потом от этого отказался
 count=0; 
 while(digitalRead(HX711_DT)); // Ждем начала передачи (пока !READY)
   // Измерения HX711 возможны не чаще 10 или 80 раз/сек (10Hz/80Hz)
    for(i=0; i<24; i++)
      { 
      digitalWrite(HX711_SCK, HIGH); 
      count = count<<1; 
      if(digitalRead(HX711_DT))
         count++; 
     digitalWrite(HX711_SCK, LOW); 
     } 
  
  digitalWrite(HX711_SCK, HIGH); 
  count ^= 0x800000;   // exclusive OR для преобразования 
   // "2's compliment 24-bit" в нормальное "unsigned long"
  digitalWrite(HX711_SCK, LOW); 

  return(count);
} 

 

Потестировав понял, что кто-то или что-то иногда мешают читать данные. Пробовал даже перед считыванием ставить noInterrupts(). Путем долгих экспериментов осознал (наконец), что зависит это от времени выполнения основной части программы. Т.е. когда я не укладываюсь в отведенные 12,5 мс интервала между измерениями, то с некоторой вероятностью с АЦП считывается мусор. Перерыв весь интернет и форумы нашел!!!! Причем это относится не только к HX711, но и к большинству известных АЦП (например AD7798/AD7799).  Но, это достойно отдельной темы с пояснениями и примерами.  Поэтому, тут закрываю, чуть позже постараюсь все описать.

))))

 

JohnR
Offline
Зарегистрирован: 11.07.2017

Ждем подробного решения проблемы! С нетерпением! :)

SAlex_S
Offline
Зарегистрирован: 13.11.2016

Интересно чем всё закончилось? Где продолжение?