| 
 Каталог
 
  
 | 
	
Працюємо за даташитом: тензометр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 
	
    Відмінно 
 
        
 | 
        








                                        	                 	