[Из песочницы] Работа с китайской АЦП Hx711

Причина написания этого поста заключается в желании разобраться с модулем 24 разрядного дельта сигма преобразователя АЦП на основе микросхеме Hx711. Сам преобразователь собран в виде готового модуля по схеме включения рекомендованного производителем (???). Замечания о работе данного модуля есть и на данном сайте в блоге Герасименко Андрея «АЦП НХ711 от 3,3V- не верьте китайской документации и не только…».

Для испытания данного модуля была собрана схема на основе микроконтроллера ATmega16, модуля АЦП, двустрочного жки BC1602, на основе контроллера HD44780, четырех кнопок. В качестве среды разработки использовалась программа Code Vision AVR, version 1.25.9 professional, AVR Studio 4, Version 4.09.0.338, программатор AVR JTAG USB, позволяющий не только программировать кристалл, но и отслеживать пошагово, если это необходимо, выполнение программы в микроконтроллере, практически в режиме реального времени.

dnyihhcg8d2ckj5tzu68ae5f_cg.jpeg
В качестве источника сигнала для АЦП был выбран тензодатчик, китайского производства, с наибольшим пределом взвешивания 40 кг. и стандартным узлом встройки датчика. Следует отметить, что применение «родных» узлов встройки, позволяет получить от тензодатчика типа Single Point, модели CZL A6 все постулируемые выходные данные. Так, тензодатчики типа Single Point, при использовании размера, оговоренной в ТУ платформы для расположения взвешиваемого груза, устроены так, что сигнал разбаланса тензомоста не зависит от положения груза на платформе. Именно МЕХАНИЧЕСКИЕ свойства тела датчика: геометрические размеры, расположение наклеиваемых тензорезисторных пленок, особенно вырез «косточки» посредине тела датчика, размер платформы, влияющий на крутящий момент прилагаемый к телу датчика определяют эту самую независимость.

k1jpzwxmwwbmdko-l2o7tj_bfbc.jpeg

Ну и последний источник это «ГОСТ 29329–92. Весы для статического взвешивания. Общие технические требования.» Этот ГОСТ определяет свойства средств измерения веса. Важно так же работа с офисной программой EXСEL. Я использую EXCEL 2003 XP3. Это позволяет быстро обработать полученные результаты используя готовые методы.

Надеюсь вся информация, необходимая для повторения моих опытов, приведена полно.

Теперь сама программа, используемая мною, для работы с модулем. Программа ориентирована на ПРОВЕРКУ, и вряд ли прямо, т.е. без изменений, может быть применена для каких то прикладных нужд. Хотя, как говорят, «смотря куда прилагать».

Сама программа представляет собой блочную структуру. Состоит из 4 подпрограмм и пятой основной main. Первая подпрограмма: ReadCount, считывает данные с модуля АЦП и формирует их в переменную Count.

CreatInput, формирует входной массив данных преобразования из 32 значений.

CreatOutput, формирует выходной массив данных преобразования АЦП, путем организации скользящего среднего, с размером окна в 16 данных.

Keys, простая программа для реакции на нажатие кнопок.

Ну вот и все. Переменные в основном все глобальные, тем более, что ресурсы меги позволяли.

mdz4xz4rpghbubo4yfc4luas2y4.jpeg

Основная программа начинается с того, что создает входной массив CreatInput, затем происходит фильтрация входных данных методом скользящего среднего. Выбор данного фильтра основан на следующем. При работе программы, данные на дисплее меняют свое значение в достаточно большом диапазоне. Мною были сняты значения АЦП при нулевом усилии на платформу и сведены в таблицу. Снятие значений получалось путем использования JATAG USB отладчика в среде AVR Studio.

8wx7ne82a80fp4ofgryytwhza7s.jpeg

В экселевском файле «Сбор данных», на вкладке «Скользящее среднее», приведен результат фильтрации колеблющихся входных данных InputBuff (размах колебаний 436 единиц) с окном усреднения3,12,16 интервалов. Результат приведен в А37-А40 ячейках. Из которых видно, что наиболее эффективно, в данном случае, это скользящее среднее с окном в 16 отсчетов.

Построенные графики это показывают наглядно. Приведенные данные взяты из работающего контроллера, остановленного в момент перехода к процедуре индикации данных. Наглядные примеры такого снятия данных приведены на картинках.

lid25s7vqelzw_hlumiy2uol9qa.jpeg

Никакие методы фильтрации данных, путем применения всевозможных цифровых фильтров, НИКАК не смогли «укротить» колебания входа. Если посмотреть на график входных данных, то гауссовым распределением здесь даже и не «пахнет». Что подтверждается пользователем Nikopol_86 в блоге »…не верьте китайской документации»

Nikopol_86 5 февраля 2019 в 09:27 0


Если честно, то шума у него хватает на всех коэффициентах. Я проводил небольшие исследования по изучению плотности распределения выдаваемых кодов АЦП при закороченных входных цепях, так вот там разброс до 1000 1_5В и нифига не нормальный закон распределения, что говорит о том, что либо с разводкой платы беда, либо с АЦП, либо все вместе взятое. Так же заметил, что температурной стабилизации у него тоже нет, а заявленный рабочий диапазон температур не соответствует действительности. Хотя бы потому, что при подключении к АЦП тензодатчика на 5 кг изменение температуры в комнате на 1 градус уводят показания на 2 грамма, а если подогреть микросхему банально пальцем, то показания улетают до 5–7 грамм. В общем для себя сделал выводы, о том, что на этом устройстве можно сделать только дозатор для кошачьего корма, где точность в одну трамвайную остановку будет более чем достаточно. А нормальные решения увы, дешевыми не получаются, потому как приходиться использовать качественные АЦП от АО или Т1.

Как видим, выводы подтвердились. Верно, так же и:
jushabrauser 4 февраля 2019 в 12:52
При соотношении сигнал/шум < 1 это ни разу не поможет.
Даже при мостовой схеме.

Поэтому в нормальных условиях (без специальной математики и/или схемотехники) минимум 8 младших бит выдают ерунду (скорее всего).

24 честных китайских бита за 350 рублей? Не смешите мои тапки.
Если само железо «врёт» — что с этим поделать?
Здесь даже нелинейный фильтр 3-го порядка не поможет, потому что исходные данные не торт.

Именно с этого места и захотелось посмотреть на что же способен данный модуль в составе весов. Поиск в сети проблем дрожание последних разрядов АЦП, привел на форум kazus.ru/forums/showthread.php? t=105320&page=4. Здесь целая дискуссия о стабилизации показаний. Однако ни один из предложенных математических методов не «успокоил» входные данные, получаемые мною. Из самого «железа», для стабилизации отсчетов, введено: соединение цифровой и аналоговой земли, а так же закоротка входа В на землю. Применялось полное экранирование и запитка модуля от аккумулятора 6v (с последующим стабилизатором 7805) отдельно от цепей контроллера. Результата нет, входные данные раскачиваются…

Итак, «чистые» 24 разряда, получить не получается и причина здесь мне кажется в некачественной м/схемы. Значит нужно урезать получаемый диапазон преобразования. Именно для этого, в программе ReadCount и введена строка с делением данных на 100. 100 это чуть меньше 2 в 8 степени. Т.о. АЦ преобразование идет в 16 бит. Однако, даже такое ограничение не сделало показания надежно устойчивыми. И причина здесь в свойствах тензодатчика.

Так, после применения процесса калибровки (связывание величины АЦП и веса на платформе), вес индицируется в граммах. 500 грамм он индицирует как цифру 500, один кг как 1000. Цена деления 1 грамм. Т.е. мы получаем с 40 кг датчика 40000 делений. По техническим данным на тензодатчик, мы можем получить с датчик только 3000 делений (символ С3 в наименовании датчика). Стало быть цена деления должна быть (40000/3000)=13,3 грамма. Однако, по ГОСТ 29329, весовая метрология не оперирует цифрой 3. Должны применяться цифры:

2.1.3 Значение цены поверочного деления (e), цены деления шкалы (d) и дискретности отсчета (dd) в единицах массы следует выбирать из ряда: 1×10a; 2×10a; 5×10a, где a — целое положительное, отрицательное число или нуль.

Т.о. цена деления для данного датчика, гарантированная производителем 10 грамм. Т.е формат вывода должен быть 0,0х кг. где х=1,2,3, ….0. Попробуем сделать цену деления в 5 грамм. Соответствующие программные действия приведены в листинге. После ТАКОГО ограничения мы «берем» из датчика 40000/5=8000 делений, что в 2,6 раза больше допустимого. После этих допущений получившиеся весы работают достаточно устойчиво.

Приведенное замечание о примененном тензодатчике и его «разрешающей способности», не позволяют окончательно утверждать, что данный модуль не может выдавать преобразование в 24 бита. Однако, мною проверен данный датчик на работу с разрешением в 1 грамм, на другом устройстве, с другим АЦ преобразователем. На этом устройстве работу датчика и преобразование можно считать удовлетворительным, ибо колебание веса составило не более 3 грамм.

Что, не позволяет использовать данный АЦП в коммерции? Ну первое и самое главное это зависимость измерения от температуры. Второе, использование операций деления и умножения встроенного в ATMEGA, тем более для 8 бит, трудно обеспечить калибровку весов во всем весовом диапазоне при этих условиях. Следует учитывать и то, что программа никак не реагирует на перегруз датчика.

Как преодолеть данные неудобства. Первое, ввести датчик температуры и корректировать показание веса от величины температуры. Что довольно сложно. «Дешевле» это ввести опцию калибровки, для разных грузов и в зависимости от погрешности, вызванной температурой, производить калибровку используемым в работе весом.

Второе сложнее. Заменить процедуру умножения и деления на табличные и сдвиговые операции. Думаю это оптимальный выход в использовании данного модуля на практике построения весов.

Для полноты описания требований к созданию программы для весов, необходимо использовать «Программу метрологической (аттестации) поверки весов, прилагаемой к каждым весам.

Вывод: Создание весов на основе м/с Hx711 возможно при соблюдении всех метрологических требований предъявляемых к весам. Введение поправок на температурную зависимость преобразования, необходимо предусмотреть отдельной процедурой. Использование модуля при разрешении более 16 бит требует отдельного подхода и контроля.

© Habrahabr.ru