Arduino лічильник імпульсів. ATmega

Arduino лічильник імпульсів. ATmega

Реалізував сигнал ШИМ 25 кГц. Осцилограф не володію, але перевірити результат хочеться. Робимо лічильник імпульсів, перевіряємо роботу.

Завдання

На базі ATmega 328Pреалізувати лічильник імпульсів для перевірки ШИМ 25 кГц, Точність вимірювань до імпульсу не потрібна, але порядок потрібно знати.

Рішення

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

Для зчитування імпульсів скористаємося зовнішніми перериваннями, вони описані на сторінках 87-96 документації від виробника. У Atmega 328Pє два входи, якими ми можемо відстежувати зовнішні переривання INT0(PD2)і INT1(PD3), для вирішення задачі скористаємося INT0.

Налаштування зовнішніх переривань

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

Для визначення яких подій буде викликатися обробник переривання потрібно налаштувати регістр ERICA. Біти ISC00і ISC01відповідають за INT0, а ISC10і ISC11за INT1.Налаштування подій, що відстежуються, ідентична, за різницею в бітах:

00 - Низький рівень сигналу;
01 - Будь-яка логічна зміна сигналу;
10 - Східний фронт сигналу;
11 - Висхідний фронт сигналу.

Для безпосереднього включення входів переривань служить регістр EIMSK, біти INT0і INT1відповідають за однойменні виходи. За вищевикладеним пишемо код

Void int0_initial(void) (DDRD = 0x00; // Порт D як вхід PORTD = (1<< 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Обробка зовнішніх переривань

Переривання налаштував, тепер треба їх опрацювати. Для цього існує функція обробки переривання ISR(), якій необхідно вказати тип переривання, в моєму випадку INT0_vect. У функції робитимемо інкремент змінної Tic_Count:

ISR(INT0_vect) ( Tic_Count ++; )

Висновок результату

Для полегшення виведення результату, щоб не прикручувати дисплей, скористався не чистою. ATmega 328P, а Arduino UNOі Arduino NANO, на борту яких той самий МК.

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

Нижче повний код вирішення задачі з коментарями:

#define F_CPU 1600000UL #include #include volatile unsigned int Tic_Count = 0; // Обробник зовнішнього переривання INT0 ISR(INT0_vect) ( Tic_Count ++; ) void setup() ( int0_initial(); Serial.begin(9600); ) void loop() ( cli(); // Забороняємо переривання Serial.println( Tic_Count), Tic_Count = 0; sei(); // Дозволяємо переривання delay(1000);<< 2); // Включение подтягивающего регистра EICRA = (1 << ISC00) | (1 << ISC01); // Восходящий фронт сигнала EIMSK = (1 << INT0); // Включение входа прерывания sei(); // Разрешаем прерывания }

Тепер залишається підключити сигнал ШІМ до ніжки PD2 і відкрити монітор послідовного порту. Так само можна сформувати та перевірити сигнал на одному МК.

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

У цій статті зібрані всі дані про лічильник електрики на основі Ардуїно, в тому числі наведені схеми, прошивки, коментарі щодо доопрацювання поточної версії прошивки та конструкції.

Ось так воно виглядає зрештою.

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

Частина 1. Ідея, проектування та думки вголос.

Якийсь час тому я встановив двозонний лічильник електроенергії, щоб скористатися вигіднішим нічним тарифом (50% з 2300 до 0800). Виявилось, що 45% електрики ми споживаємо вночі. Але відповіді, як відбувається споживання в розрізі місць споживання. звичайно цей пристрій не дає.

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

  1. Поточна потужність навантаження
  2. Споживання від початку доби
  3. Споживання з початку місяця
  4. Відсоток нічного споживання у %

Також пристрій повинен передавати, на настроювану інтернет-адресу, дані про споживання за останні 24 години, у вигляді 24 відліків. Інтервал передачі встановлюється в хвилинах 1...120.

Параметри, що задаються в меню:

  1. Година в RTC
  2. Хвилину в RTC
  3. День у RTC
  4. Місяць у RTC
  5. Рік у RTC
  6. Інтервал відліку 1…120
  7. мережна адреса із зазначенням позиційно символів: «a-z0-9_-/: «.Редагований символ повинен бути виділений, щоб було зрозуміло що саме редагується.

Початковий варіант пристрою буде зроблено на основі наступного набору модулів:

  1. ( уточнення щодо підключення індикатора до мега 2560)

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

Початкова схема підключення вузла виміру.

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

Беру макетну плату, шукаю відповідний трансформатор, для виміру напруги (беру від чергування АТХ), і вперед.

UPD. Вимірювальний вузол

Частина 2.1 Нотатки дивовижні особливості ENC28J60

Дивовижна річ. Почав сьогодні копати модуль роботи з езернетом для проекту «лічильник». Хто б сумнівався, було весело, і все заробило.

За підключенням. Дивимося де знаходити SPI інтерфейс з Ардуїно "Мега", ну чи вашою. Підключаємо. Висновок CS (вибір чіпа) вішаємо куди завгодно, він потім задається окремо в ініціалізації бібліотеки. Я «повішав» його на 42-й висновок, у вас може бути якийсь інший. Інші MOSI/MISO/SS/OV/3.3V підключаються до відповідних висновків Ардуїни.

Виявилося, що для зменшення використання пам'яті розробник чудової бібліотеки EtherCard вирішив, і відправив деякі рядки для GET запиту в пам'ять програми. Тобто, уявіть, програміст-фрілансер вирішив раптом зробити собі лічильник. Щоб все було розумно, він вирішив зробити там редагування рядка-URL, куди відправляються дані. І навіть це зробив сьогодні:

І ось він підключає бібліотеку, і думає що зараз легко зробить запит до зовнішнього сервера. Та ні. Адже сервер він поставив у вигляді рядка. А рядок, на жаль, не пам'ять програми. Гарвардська архітектура. Все поділено.

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

Додаю бібліотеку та приклад роботи із сервером, який працює для рядків. а не тільки для значень, що не змінюються в програмі. Разом із прикладом —

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

Особливість підключення - тільки DHCP, я не збираюся робити завдання статичного IP і вибору, все працює досить коректно, і немає необхідності додавати непотрібний мені функціонал.

Частина 3. Початкове налагодження програмного забезпечення лічильника

Сьогодні трохи повозився з налагодженням лічильника. Справа в тому, що помилково не встановив знижувальний резистор, на СТ-датчик і в результаті на вхід проникало занадто велику напругу, так само як і багато перешкод. Поправив, припаяв 150 ом паралельно СТ-датчику, загалом вийшло близько 100 ом.

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

У результаті замір витрати ЄП на закипання чайника показав те ж саме, що і на китайському ватметрі. Вже добре, але доведеться перевірити і за основним лічильником, якось.

На дисплеї не помістилася буква h після kW, але слід розуміти, що вона там є. Кількість показує витрати з початку поточної години. Наприкінці години передається на сервер і скидається у нуль. Потім, напевно, зроблю щоб скидалося раз на добу.

лічильника, в поточному вигляді -

Частина 4. Робимо першу частину корпусу

Зробив сьогодні корпус, матеріал такий же, як і минулого разу — капролон 11 мм. Кріплення щоправда на імбусних гвинтах М4, минулого разу було м3 скрізь. Це слабко для корпусу.

Для масштабу поклав мишку "ейр" усередину.

Залишається зробити передню панель, закріпити модулі, зробити вифрезерування під USB та живлення 12В. У випадку з цим приладчиком, достатньо, напевно, 0,7А буде, тобто можна застосувати щось малогабаритне.

Частина 5 Робимо передню панель

Частина 9. Оновлено ПЗ за результатами експлуатації пристрою

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

Upd 2015-09-23. Написав сьогодні інтерфейс для перегляду даних моніторингу. Заодно і оптимізував прошивку, знайшов помилок у ній. Підняв внутрішній ДНС сервер, на це хвилини справа.

Просто показав останні 48 годин (потер статистику, тому там менше на графіку) у вигляді загладженого графіка. Сплеск - це початок роботи прання, за У - ціна в гривнях за поточну годину, з урахуванням нічного тарифу, звичайно. По Х - дата/час.

Тепер можна трохи подивитися, що відбувається. Маленький нюанс - розташував усе в домашній мережі для більшої стійкості.

Раніше вже писав, що спробував одне стандартне програмне забезпечення, щоб показувати витрату електрики (emoncms). Незрозуміла мені парадигма та підхід. Там раз на три секунди відсилає на сервер дані і показує щось. Я зробив інакше - пристрій накопичує дані 1 годину, потім відсилає за останні 24 години. Веб=-сервер запустив, це NAS, з низьким енерго-споживанням.

UPD. З'ясувалося, що це не Інтернет у мене такий, пристрій іноді не передає дані. Не зрозуміло, з чим пов'язано, і відловити важко, тому пішов іншим шляхом — підрахунком проміжних показань на підставі поточної витрати. За добу десь 1-2 рази відбувається збій. Така схема дозволяє відмовитися від зберігання погодинних даних у їїпром, яке також чомусь працює не зовсім коректно.

UPD. Доробив трохи ПЗ сайту, що показує дані. Тепер там є вольтаж по годинниках, погодинний та добовий витрати.

Подумую над розміщенням ПЗ на гітхабі. Мабуть. так воно й буде.

Ні, ця стаття не про черговий спосіб обдурити цей злощасний прилад. Тут йтиметься про те, як за допомогою Arduino та середовища LabView перетворити свій лічильник електроенергії на засіб моніторингу споживаної потужності або навіть на амперметр!


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

Однак сьогодні індукційні лічильники здають свої позиції, поступаючись місцем своїм дешевшим електронним побратимам. І саме такий і стане піддослідним:

Принцип роботи не сильно змінився - у цьому випадку диск замінений електронікою, яка генерує імпульси відповідно до величини споживаної електроенергії. Як правило, у більшості приладів ці імпульси показує світлодіодний індикатор. Відповідно, чим швидше блимає ця лампочка – тим більше спалюється дорогоцінних кВт.
Крім того, на лицьовій панелі будь-якого пристрою є передатне співвідношення лічильника А- Число імпульсів на 1 кВт * год. Як видно з фото, у піддослідного А = 12800. З цієї інформації можна зробити такі висновки:

З кожним імпульсом лічильник фіксує споживання, що дорівнює 1/12800 частини від 1 кВт*год. Якщо включити до лічильника навантаження і почати просто рахувати імпульси, то потім легко отримати спожиту нею кількість електроенергії (кВт * год), розділивши кількість імпульсів на передавальне співвідношення.

Так як індикатор змінює швидкість свого моргання, можна вивести залежність між потужністю (кВт) і часом одного імпульсу лічильника, що дозволить отримати дані про потужність/струму.
Не завантажуватимемо статтю розрахунками, але якщо потрібно то

ось вони

Воістину, передавальне число лічильника - велика річ, оскільки знаючи її можна висловити як потужність, так і струм:
Складемо пропорцію з нашого передавального співвідношення (А=12800 імп/кВт*ч) та невідомого передавального співвідношення, яке буде при навантаженні X і за час одного єдиного імпульсу (моргання лампочки):

Тут X – невідома потужність, а t – час одного імпульсу. Висловлюємо звідси невідому потужність і ось воно:

Струм рахується із застосуванням наступної пропорції передавальних співвідношень і струмів відомих і невідомих при навантаженні X.:


Що загалом призводить до ідентичної формули, але для струму (струм вимірюється в Амперах, а індекси означають навантаження, при якому буде даний струм):

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


Таким чином, все упирається у вимір часу одного імпульсу (моргання індикатора). У своїх дослідженнях я спирався на цей чудовий проект. Якийсь італієць зробив у середовищі Labview інтерфейс для моніторингу потужності і вигадав схему для вимірювання імпульсів. Але в його проекті красувалася величезна недоробка - він підходив тільки для лічильників з передавальним співвідношенням 1000 імп / кВт * год.

Верхній графік – середня потужність за 5 хвилин, нижній – у реальному часі. Інтерфейс досить гнучкий та легко модифікується під свої потреби. Якщо Ви ще не мали справи із середовищем LabView – рекомендую познайомитись.

Щоб усе запрацювало, виявилося достатньо внести один блок до алгоритму програми, відповідно до формули вище.

Виглядає це так


Здавалося б просто, але до цього треба ще здогадатися!

Отже, якщо Ви таки вирішите реалізувати моніторинг потужності, тобто два варіанти:

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

Схема для безконтактного зняття імпульсів


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

2. Ви маєте доступ до імпульсного виходу лічильника. На багатьох моделях є імпульсний вихід, який дублює блимання лапочки. Це зроблено для того, щоб була можливість підключати пристрій до системи автоматизованого обліку. Являє собою транзистор, що відкривається при індикаторі, що горить, і закривається при згаслому. Підключитися безпосередньо до нього не складає труднощів - для цього буде потрібно лише один підтягуючий резистор. Однак перш ніж робити це, переконайтеся, що це саме імпульсний вихід, а не щось інше! (У паспорті завжди є схема)

Схема для підключення до телеметричного виходу


У моєму випадку – доступ повний, тому морочитися я особливо не став. Встановлюємо LabView та вперед вимірювати! Всі графіки є потужністю (Вт) у реальному часі.
Першим під роздачу потрапив багатостраждальний чайник. Кришка свідчить, що потужність у нього 2,2 кВт, проте судячи з графіку, справно споживає лише 1700 Вт. Зверніть увагу, що споживання більш-менш завжди у часі. Це означає, що нагрівальний елемент (скоріше за все ніхром) дуже слабко змінює свій опір протягом всього процесу скип'ячування.

Зовсім інша справа клейовий пістолет – заявлена ​​потужність 20 Вт. Він веде себе відповідно до законів фізики – при нагріванні опір нагрівача збільшується, а струм відповідно зменшується. Перевіряв мультиметром – все так і є.

Старий радіоприймач "Весна". Тут графік пішов на початок через те, що я запустив вимір під час імпульсу, відповідно це вплинуло на дані. Гірки на графіку показують, як я крутив ручку гучності. Чим голосніше – тим більше радіо їсть.

Перфоратор із заявленою потужністю 700 Вт. Натиснув кнопку до упору, трохи почекав і відпустив, але не плавно. На графіку добре видно кидок струму під час пуску двигуна. Саме тому моргає світло, коли добрий сусід починає довбати свою улюблену стіну.

А тепер найцікавіше. Я провів невеликий експеримент зі своїм старим ноутбуком, результат якого наведено на зображенні:

Помаранчевою точкою відзначено час, коли я запустив одразу кілька «важких» програм. Як бачите, графіки завантаження процесора і зростання споживання мають щось спільне між собою. Нещодавно була

Для додаткового завдання

Принципова схема

Схема на макетці

Зверніть увагу

    У цьому експерименті ми вперше використовуємо мікросхему, в даному випадку - вихідний регістр зсуву 74HC595. Мікросхеми корисні тим, що дозволяють вирішувати певне завдання, не збираючи щоразу стандартну схему.

    Вихідний зсувний регістр дає можливість «заощадити» цифрові виходи, використавши всього 3 замість 8. Каскад регістрів дозволив би давати 16 тощо. сигналів через ті ж три піна.

    Перед використанням мікросхеми потрібно уважно вивчити схему її підключення в datasheet'і. Щоб зрозуміти, звідки вважати ніжки мікросхеми, ними з одного боку є полукруглая выемка. Якщо ми розташуємо нашу 74HC595 виїмкою вліво, то нижньому ряду будуть ніжки 1-8, а у верхньому 16-9.

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

    Нагадаємо, що на зображенні семисегментного індикатора підписано номери його ніжок та їх відповідність сегментам.

Скетч

Для того, щоб передати порцію даних, які будуть відправлені через зсувний регістр далі, нам потрібно подати LOW на latch pin (вхід ST cp мікросхеми), потім передати дані, а потім відправити HIGH на latch pin, після чого на відповідних виходах 74HC595 з'явиться передана комбінація високих та низьких рівнів сигналу.

Для передачі ми використовували функцію shiftOut(dataPin, clockPin, bitOrder, value) . Функція нічого не повертає, а як параметри їй потрібно повідомити

  • пін Arduino, який підключений до входу DS мікросхеми (data pin),

3

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

Atmel AVR, що більшість Arduinos засновані на обладнанні лічильника/таймера, яке вважатиме імпульсним у вхідному штирі безпосередньо. Все, що вам потрібно зробити, це налаштувати апаратне забезпечення для роботи лічильника та прочитати регістр лічильника. Існує невелика складність для 16-бітних лічильників на 8-бітному пристрої, але це легко подолати. Arduino налаштовує таймери для операцій PWM за замовчуванням, але це можна перевизначити, як описано (докладніше див. Посібник користувача AVR) - вам потрібно використовувати таймер/лічильник у режимі CTC.

ARM на базі Arduninos та майже будь-який інший мікроконтролер матимуть аналогічні апаратні засоби; деякі з них мають більшу гнучкість, завдяки чому штирі можуть використовуватися для підрахунку обладнання.

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

У вашому випадку вам, ймовірно, необхідно прочитати кількість імпульсів у регулярний період, який менше часу, протягом якого лічильник переповнюватиметься з максимальною очікуваною частотою пульсу. Так, наприклад, якщо ви використовували 8-бітний лічильник, а максимальна частота пульсу становила 1 кГц, вам потрібно було б опитати кожні 256/1000 секунд або менше, але найбільшу точність можна отримати, зробивши цей період якнайдовше. Так, наприклад, ви могли б мати щось подібне до наступного (це не реальний код, і тільки фрагмент):

For(;;) ( delayMS(250) ; frequency = 4 * readCounter() ; )

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

For(;;) ( int start = getMillisec() ; while(!counterOVF()) ( // Do nothing (або деякий useful but quick) ) int t = getMillisec() - start ; frequency = 256 * t/1000 ; )

0

Дуже дякую за ваше запитання. Якщо я правильно зрозумів, ваша перша ідея полягає в тому, щоб відключити імпульси за допомогою апаратного забезпечення, а другий – весь час, коли процесор зайнятий. Проблема в тому, що мій мікроконтролер повністю завантажений (тому простий ISR, що збільшує лічильну змінну, не буде працювати) і не може бути опитуванням, оскільки він повинен виконувати інші завдання. Крім того, у мене більше немає апаратних лічильників. Чи є інші альтернативи? Я чув, що це можливо, використовуючи аналогові порти (покладаючись на подібність до PWM). Велике дякую - manatttta 28 серп. 14 2014-08-28 08:16:36

0

В обох випадках лічильник апаратних засобів виконує підрахунок, у другому прикладі моє опитування перевіряє прапор переповнення, але це просто для демонстрації принципу, це не є фундаментальним рішенням; він може однаковою мірою бути обробником переривань - перевага полягає в тому, що ви отримуєте одне переривання для кожних 256 імпульсів (за умови 8 біт лічильника), а не кожен імпульс, тому накладні витрати переривання набагато нижчі. - Clifford 28 серп. 14 2014-08-28 11:10:07

0

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



© 2023 globusks.ru - Ремонт та обслуговування автомобілів для новачків