Каталог
|
Працюємо за даташитом: тензометр2020-07-17 Все статьи →Антон Царіцинський Тензометри застосовуються для вимірювання величини механічного навантаження. В побуті найбільш відомим пристроєм, в якому можемо знайти тензометри, є електронні ваги ( рис. 1 ):
Рис. 1A - Тензометри з підлогових ваг
Рис. 1В - Тензометри з ручних ваг Серед датчиків для ARDUINO також є тензометри ( рис. 2 ):
Рис. 2 – Популярний тензометр для ARDUINO Цей датчик працює за резистивним принципом. На ньому розташовані тонкі провідники, які міцно скріплені з його поверхнею, по яких тече слабкий струм. Прикладена механічна сила призводить до виникнення деформацій, в тому числі й на вказаній поверхні, через що провідник розтягується або стискається: змінюється його довжина і площа перетину. Через це змінюється електричний опір, параметри струму, які можна виміряти і, таким чином, судити про ступінь навантаження. До ARDUINO тензометр підключають через аналогово-цифровий перетворювач ( АЦП ). Популярним і дешевим АЦП є HX711 у вигляді готового модуля ( рис. 3 ).
Рис. 3 – Модуль на базі HX711 Даташит за посиланням: https://cdn.sparkfun.com/datasheets/Sensors/ForceFlex/hx711_english.pdf Модуль має два канали А і В, які відрізняються коефіцієнтом посилення: 64 або 128 – для каналу А; 32 ( фіксовано ) – для каналу В. З мікроконтролером модуль спілкується через контакти DT ( лінія передача даних, вихідний ) і SCK ( лінія тактування, вхідний ). Варіант підключення показаний на ( рис. 4 ). Для чого там кнопка, стане зрозуміло згодом.
Рис. 4 – Схема підключення Тестовий стенд можна побачити на ( рис. 5 ).
Рис. 5 – Тестовий стенд
Спілкування з HX711Розберемося з протоколом передачі даних, бо тут немає рідних SPI або I2C. На сторінці 4 даташиту дізнаємось, що результатом вимірювання є 24-бітне число. Спосіб його отримання наступний: 1) заводимо 32-бітну змінну для зберігання 24-бітного результату (на сторінці 8 даташиту можна знайти приклад коду на мові C, в якому використовують беззнаковий unsigned long; я ж надав перевагу знаковому long, оскільки при подальшому калібруванні результати обчислень можуть бути від’ємними, а примусово приводити типи мені лінь); 2) аналізуємо стан сигналу на DT: високий рівень свідчить про те, що дані ще не готові, тож нам залишається чекати, поки рівень не зміниться на низький; 3) починаємо читати результат вимірювання окремими бітами. Загальна схема процесу показана на ( рис. 6 ) ( сторінка 5 даташиту ).
Рис. 6 – Протокол взаємодії з HX711 За один такт по SCK читаємо один біт, починаючи зі старшого ( MSB ). Для цього:
Повторюємо цю послідовність 24 рази; 3) Число отримали, але це ще не все. Треба додати ще 1…3 такти для визначення каналу і коефіцієнта посилення для наступного зчитування (табл. 1 ).
Табл. 1 – Вибір каналу і коефіцієнта посилення Таким чином, загалом кожний цикл спілкування з HX711 складається з 25…27 тактів по лінії SCK; 4) Тут треба повернутися на сторінку 4 даташиту. Наше 24-бітне число видається в доповненому коді ( англ. two’s complement ) в діапазоні від 0х800000 ( або 8388608 в десятковій системі ) до 0x7FFFFF ( або 8388607 ). Для вірної інтерпретації над результатом необхідно здійснити операцію XOR, яка фактично підлаштовує старший біт. Виглядатиме це так: результат ^= 0x800000 Те ж саме можна побачити в прикладі з даташиту ( сторінка 8 ). Насамкінець, звертаємо увагу на допустимий час виконання операцій ( табл. 2 зі сторінки 5 даташиту; також дивись рис. 6 ).
Табл. 2 – Допустимі часові проміжки Найбільш важливим для нас є обмеження часу T3 ( перебування лінії SCK у високому рівні ) – 50 мікросекунд. Якщо перетримати, HX711 увійде в режим зниженого енергоспоживання ( при 60 мкс, див. сторінку 5 даташиту ), при поверненні до низького логічного рівня по SCK модуль перезавантажиться і повернеться до нормальної роботи. Оскільки функції digitalWrite() і digitalRead() виконуються кілька мікросекунд, то можемо використати їх при програмуванні протоколу, хоча для збільшення продуктивності доцільно працювати напряму через порти. В скетчі, що додається, це реалізовано у вигляді класу TENZO ( файли tenzo.h і tenzo.cpp ). Основну роботу виконує функція TENZO::readRaw().
КалібруванняПеред «бойовим» застосування тензометра потрібно встановити відповідність його показань реальному навантаженню. Для цього можуть застосовуватися вантажі, маса яких відома, наприклад, еталонні гирі (рис.7).
Рис. 7 – Еталонні гирі Між навантаженням F і показаннями тензометра P можна ввести лінійну залежність (рис. 8) P = calib*F + offset де calib, offset – шукані коефіцієнти.
Рис. 8 – Залежність між навантаженням і показаннями тензометра Коефіцієнт offset можна знайти з умови відсутності навантаження, тобто коли F=0. В цьому випадку тензометр видаватиме деяке умовно-стале ( шум, дрифт ніхто не відміняв ) число P0. Таким чином offset = P0 (1) Коефіцієнт calib знайдемо за допомогою еталонного навантаження Fе і відповідно еталонного показання Pе calib = (Pе – offset) / Fе (2) Навантаження будемо розраховувати за формулою F = (P – offset) / calib (3) Калібрування також реалізовано в класі TENZO за допомогою функцій:
ФільтруванняHX711, як і багатьом іншим АЦП, притаманний шум, який можна зменшити шляхом фільтрування. Я не є спеціалістом з теорії обробки сингалів, тож зазвичай використовую просте експоненційне згладжування: "Wiki: Експоненційне_згладжування" , є й інші назви. Yn = Xn + α*(Xn – Yn-1) (4) Де n – поточна ітерація; X – сигнал, отриманий на поточній ітерації; Y – відфільтрований сигнал; α – коефіцієнт посилення, обирається з інтервалу [0; 1]; чим менше значення, тим сильніше згладжування, і навпаки. Зазвичай α = 0,05…0,1. На кожній ітерації алгоритм потребує дві величини: за поточну і попередню ітерації, тож на першій ітерації приймаємо: Y1 = X1 (5) Робота алгоритму показана на рис. 9.
Рис. 9 – Експоненційне згладжування: синя лінія – нефільтровані дані; червона лінія – фільтровані дані Видно, як фільтровані дані відстають від нефільтрованих через мале значення коефіцієнта посилення ( рис. 10; на тензометр послідовно встановлюються і знімаються гирі 100г і 50г. ).
Рис. 10 – Запізнення експоненційного згладжування: синя лінія – нефільтровані дані; червона лінія – фільтровані дані Зважаючи на наявність різких перепадів вимірюваного навантаження ( становили або зняли гирю ), можна внести корективу щодо коефіцієнта посилення: якщо дані міняються незначно ( наприклад, до 1 грама ), то α = 0,05; якщо ж змінення значне ( більше 1 грама ), то α = 0,95. Таким чином, на різкі стрибки алгоритм буде реагувати швидко. Така модифікація експоненційного фільтра підглянута в AlexGyver "адаптивний коеффіцієнт" Роботу нового алгоритму в тих же умовах показано на рис. 11.
Рис. 11 – Експоненційне згладжування з адаптивним коефіцієнтом: синя лінія – нефільтровані дані; червона лінія – фільтровані дані В скетчі фільтр реалізовано у вигляді класу EFILTER ( файли efilter.h і efilter.cpp ). Основні функції:
Додатково…В скетчі також є класи кнопки ( BUTTON, для ручного тарування ) і таймера ( TIMER, для забезпечення рівних проміжків часу між зчитуваннями показань тензометра, виведення результату через Serial ). Основні методи:
Інтервал таймера ( в мілісекундах ) встановлюється при виклику його конструктора. Посилання:
Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
Vova
13.06.2023 18:45:58
Вижу разборы даташитов - ставлю лайк)
Анатолій
29.03.2023 17:18:19
Відмінно
|