Зробіть тахометр з дошкою Arduino Genuino, щоб зчитувати швидкість обертання d; a

Тиша, крутиться.

arduino

від skywodd | 1 жовтня 2016 р. | Ліцензія (див. Нижній колонтитул)

Ця стаття деякий час не оновлювалась, її зміст може бути застарілим.

У цьому підручнику ми разом побачимо, як зробити спрощений тахометр з дошкою Arduino/Genuino. Мета: виміряти швидкість обертання комп'ютерного вентилятора. В якості бонусу ми побачимо, як виміряти період сигналу змінного робочого циклу за допомогою нашого внутрішнього тахометра.

Резюме

  • Вихід сигналу з вентилятора ПК
  • Демонстраційне зібрання
  • Вимірювання за допомогою функції pulseIn ()
  • Вимірювання переривань
  • Бонус: Вимірювання повного періоду за допомогою pulseInCycle ()
  • Додаток: Перевірте вимірювання швидкості
  • Висновок

Привіт всім !

Кілька днів тому читач зв’язався зі мною із цілком конкретним питанням: як виміряти швидкість обертання двох комп’ютерних вентиляторів за допомогою плати Arduino/Genuino? Відмінне питання, ми це побачимо відразу

Перш ніж розпочати, я хочу пояснити, що мета цього посібника полягає не лише у вимірюванні швидкості обертання вентилятора комп’ютера, а у вимірюванні частоти будь-якого періодичного сигналу.

Цей підручник цілком дійсний, якщо ви використовуєте датчик ефекту Холла, фототранзистор або будь-який тип датчика, що генерує логічний сигнал частоти, пропорційний виміряній величині.

Вихід сигналу з вентилятора ПК

Вихід сигналу з комп'ютерного вентилятора

Комп’ютерні вентилятори зазвичай мають датчик Холла в корпусі вентилятора і невеликий магніт у рухомій частині.

Щоразу, коли магніт проходить датчик Холла, стан вихідного сигналу змінюється. Таким чином, вимірюючи тривалість високого стану (або низького, це не має значення), можна визначити швидкість обертання вентилятора. Ось як материнські плати комп’ютерів можуть знати швидкість роботи вентиляторів ПК.

Демонстраційне зібрання

Щоб мати можливість протестувати фрагменти коду трохи нижче, ми збираємось реалізувати невеличку демонстраційну збірку з «класичним» вентилятором комп’ютера.

Для проведення цієї першої збірки нам знадобиться:

Плата Arduino UNO (та її USB-кабель),

Три- або чотирипровідний вентилятор комп’ютера,

Резистор 10 Км - колірний код коричневий чорний помаранчевий,

Діод для малих сигналів типу 1N4148,

Випробувальна пластина та дроти для кріплення нашої збірки.

Вид прототипу збірки

Схематичний вигляд збірки

Висновок роз'єму вентилятора комп’ютера

Комп’ютерні вентилятори доступні у двох версіях: 3-контактний та 4-контактний.

3-контактні версії, що називаються "версії постійного струму", призначені для материнських плат комп'ютера з аналоговим контролером напруги. В основному, для регулювання швидкості обертання вентилятора материнська плата збільшує або зменшує напругу живлення вентилятора від 5 до 12 вольт.

4-контактні версії, що називаються "версії ШІМ", призначені для материнських плат комп'ютера з ШІМ-контролером напруги. У цьому випадку вентилятор все ще забезпечується 12 вольтами, а материнська плата контролює швидкість вентилятора через четвертий штифт роз'єму за допомогою ШІМ-сигналу.

Для цілей нашого підручника тип вентилятора не має значення. Обидва роз'єми однакові, за винятком четвертого проводу у 4-контактній версії.

Перший провід - це завжди маса. Другий провід - це живлення. Третій провід - це сигнал на виході датчика Холла вентилятора (це те, що нас цікавить). І нарешті, у випадку з 4-контактними версіями, четвертий провід є сигналом управління швидкістю.

N.B. Використання четвертого проводу з 4-контактних версій не є предметом цього посібника, і тому не буде розглядатися

Почнемо проводку збірки з вентилятора. Блок живлення вентилятора повинен бути підключений до зовнішнього джерела живлення, що подає напругу від 5 до 12 вольт. Якщо ви просто хочете перевірити принцип, ви можете підключити блок живлення вентилятора до 5-контактного виводу плати Arduino.

Потім заземлення вентилятора повинно бути підключене до заземлення зовнішнього джерела живлення, а також до заземлення плати Arduino. Дві маси повинні бути з'єднані. Це дуже важливо.

Ми продовжуємо з резистором 10 КОм, який підключений між 5-контактним штифтом плати Arduino і D2 штирком плати Arduino.

Зверніть увагу: я використовую штифт D2, оскільки його можна використовувати з функцією attachInterrupt (), яку ми побачимо далі в навчальному посібнику. Якщо ви використовуєте код із pulseIn (), замість D2 можна використовувати будь-який штифт .

Готова збірка

Останнім кроком складання є підключення діода 1N4148 між виводом D2 плати Arduino та виходом датчика холу вентилятора.

Діод 1N4148 є упередженим. Він повинен бути підключений катодом (білою або чорною кольоровою смужкою) збоку штифта вентилятора. Якщо ви не впевнені, що розумієте, подивіться на ілюстрацію вище.

Цей діод необхідний для нормального функціонування збірки. Це запобігає поверненню напруги на виході вентилятора (яка може сягати до 12 вольт) до плати Arduino і руйнування її.

В ідеальному світі, де виробники повністю відповідають стандартам, цей діод був би марним. Тільки тут реальний світ не такий ідеальний, і деякі виробники дозволяють мати пряму вихідну напругу замість відкритого колекторного виходу на датчику обертання.

Ілюстрація виходу з відкритим колектором (джерело: Вікіпедія)

Вихід відкритого колектора поводиться як кнопка, підключена до землі. Коли вихід не працює, вихід не підключений. Але коли вихід активний, він підключається до землі.

Додаючи підтягуючий резистор до напруги живлення його логічної схеми (5 вольт у випадку з платою Arduino), ми отримуємо логічний вихід з достатніми напругами.

У разі виходу прямої напруги напруга живлення вентилятора отримується, коли вихід знаходиться в стані спокою. Без діода, який блокує цю напругу, до побачення плата Arduino.

Технічно, якщо катод діода знаходиться на стороні вентилятора, струм може надходити лише від плати Arduino до вентилятора, а не навпаки. Якщо вихідна напруга вентилятора перевищує напругу на платі Arduino, діод блокується, і плата Arduino в безпеці.

Вимірювання за допомогою функції pulseIn ()

Перший спосіб вимірювання сигналу на виході комп'ютерного вентилятора - використання функції pulseIn (), передбаченої фреймворком Arduino.

Це наївне рішення, але цілком функціональне, яке передбачає, що високий і низький стан сигналу мають однакову довжину. Це стосується більшості любителів комп’ютерів, але не всіх. Тому доцільно перед використанням цього методу перевірити форму сигналу за допомогою осцилографа.

Для цього методу вимірювання ми починаємо з декларування штифта для вимірювання, потім налаштовуємо цей вхідний штифт з опором витягування у функції setup () .

Ми користуємось можливістю ініціалізувати послідовний порт, що дозволить нам мати зворотний зв’язок щодо послідовного монітора.

Потім у функції loop () ми викликаємо функцію pulseIn () для вимірювання тривалості низького стану (LOW) сигналу. Ми вказуємо час очікування в одну секунду (1 000 000 мікросекунд), щоб уникнути застрягання, якщо вентилятор вимкнений або заблокований.

В обмін на функцію pulseIn () ми отримуємо тривалість низького стану в мікросекундах, яку множимо на два, щоб отримати тривалість повного періоду.

Ми закінчуємо код відображенням швидкості обертання в об/хв (обертів в хвилину).

Повний код із коментарями:

Вищезазначений фрагмент коду доступний для завантаження на цій сторінці (за посиланням для завантаження .zip проект Arduino готовий до використання).

Перевага цього рішення полягає в простоті, але воно залишається дуже наївним. Якщо сигнал не симетричний (високий час = низький час), вимірювання хибне.

Справжня перевага цього методу (крім простоти) полягає в тому, що для вимірювання можна використовувати будь-який штифт. Тому ми можемо підключити кілька вентиляторів на одній і тій же платі Arduino і виміряти їх один за одним.

Я рекомендую використовувати цей метод, якщо вимірюваний сигнал сумісний (логічний сигнал, з високим часом = низьким часом).

Вимірювання переривань

Другим способом вимірювання вихідного сигналу вентилятора є використання переривання. Принцип простий: коли сигнал переходить з певного логічного рівня на інший, викликається функція в нашому коді. Потім можна виконати обчислення, щоб визначити час, що минув між двома перервами.

Це надійне рішення з перевагою запуску паралельно із звичайною програмою. Вимірювання постійно оновлюється через переривання. Будьте обережні, але є підводні камені, яких слід уникати.

Перш за все, для збереження вимірювання потрібно оголосити глобальну змінну. Це має бути мінливим, щоб запобігти компілятору оптимізувати доступ до цієї змінної. Пастка n ° 1.

N.B. Будь-яка глобальна змінна, яка використовується в перериванні, повинна бути мінливою. Якщо це не так, час від часу з’являються помилки "привидів" без явного пояснення. Це частина радості розвитку мікроконтролерів

У функції setup () ми додаємо виклик функції attachInterrupt (). Ця функція дозволяє підключити функцію, яка в нашому випадку називається tick (), до зовнішньої події, тут перехід сигналу HIGH to LOW (FALLING) на вказаний контакт.

N.B. Лише кілька штифтів можна використовувати з attachInterrupt (). На платі Arduino UNO в якості переривання можуть використовуватися тільки штифти D2 і D3. Це пастка № 2.

Пастка № 3: необхідно зачекати, доки спрацює перша серія перерв, перш ніж мати змогу отримати життєздатний захід. У більшості випадків достатньо простої затримки ().

Функція tick () викликається в нашому випадку кожного разу, коли сигнал на штифті переходить від HIGH до LOW .

Використовуючи micros () та статичну змінну (яка зберігає своє значення між двома викликами функції), можна розрахувати час між двома перериваннями.

Решта коду схожа на попередню главу.

N.B. Щоб зробити це правильно, вміст змінної "period" слід скопіювати у тимчасову змінну, оточивши доступ до змінної noInterrupts () та interrupts (). Це пов’язано з тим, що переривання може оновити змінну, тоді як код функції loop () читає ту саму змінну. Потім ми отримуємо зіпсоване значення. Пастка № 3.

PS Наведений вище код не керує відключенням або зупинкою вентилятора під час вимірювання. В ідеалі, час останнього переривання слід зберігати у змінній, щоб повернути нульове значення, якщо оновлення вимірювань не проводилось через N секунд. Пастка № 4.

Повний код із коментарями:

Вищезазначений фрагмент коду доступний для завантаження на цій сторінці (за посиланням для завантаження .zip проект Arduino готовий до використання).

Це метод для досвідчених користувачів з дуже специфічними технічними потребами. Ось чому я не вдаюся до більш детальних деталей.

Це рішення підходить для певних типів ситуацій, але воно має багато недоліків, які слід зрозуміти перед його використанням:

Кількість паралельних вимірювань обмежена кількістю можливих переривань,

Багато запобіжних заходів, які слід вжити при доступі до нестабільної глобальної змінної,

Перший набір вимірювань завжди помилковий,

Ми повинні керувати випадком, коли сигнал зупиняється, інакше ми зберігаємо в пам'яті старе вимірювання на невизначений час (кілька можливих рішень цієї проблеми).

Бонус: Вимірювання повного періоду за допомогою pulseInCycle ()

На завершення цього підручника я пропоную варіант методу № 1 із pulseIn (), соусом Carnet du Maker.

Код вище не засвоюється і працює лише з класичними платами Arduino. Це нормально, це «низькорівневий» код, що використовує внутрішні функції фреймворку Arduino, якими користувач зазвичай не повинен користуватися.

Ця функція, яку я назвав pulseInCycle (), працює точно так само, як pulseIn (), але з невеликою різницею: крім вимірювання тривалості зазначеного фронту, вона також вимірює тривалість зворотного фронту відразу після.

Наприклад, pulseInCycle (шпиндель, HIGH, 1000000) використовується для вимірювання тривалості циклу високий час + низький час на вказаному шпинделі з таймаутом в одну секунду. Замінюючи HIGH на LOW, ми вимірюємо тривалість циклу низький час + високий час.

Це найпростіше рішення для вимірювання сигналів, що мають змінний робочий цикл.

Код із коментарями:

Вищезазначений фрагмент коду доступний для завантаження на цій сторінці (за посиланням для завантаження .zip проект Arduino готовий до використання).

Додаток: Перевірте вимірювання швидкості

Деякі вентилятори генерують більше одного імпульсу за обертання. У моєму випадку вентилятор, який я використовую, генерує два імпульси за обертання.

Щоб визначити кількість імпульсів за обертання, я використав стробоскоп. У моєму випадку це силовий привід, підключений до генератора сигналу замість справжнього стробоскопа. Я роблю з підручними засобами.

Змінюючи швидкість блимання стробоскопа, ми в кінцевому підсумку досягаємо частоти блимання, коли вентилятор здається застиглим у часі. Щоб зробити цей візуальний ефект більш помітним, я намалював білу крапку на вентиляторі. Коли біла точка більше не рухається, стробоскоп блимає з точно такою ж швидкістю, як і обертання вентилятора.

У моєму випадку вихідний сигнал вентилятора вказував 50 обертів в секунду, але стробоскоп вказував лише 25 обертів в секунду. 50/25 = 2 імпульси за обертання.

PS Звичайний вентилятор генерує від одного до чотирьох імпульсів за обертання. Універсального стандарту не існує.

В іншому випадку, більш просте рішення і менше "зроби сам", ви можете придбати лазерний тахометр за 25 євро в Інтернеті, щоб перевірити точність вимірювань.

Висновок

Цей підручник тепер готовий.

Якщо вам сподобався цей підручник, не соромтеся коментувати його на форумі, ділитися ним у соціальних мережах та підтримувати сайт, якщо він вам подобається.