Монітор частоти на основі Arduino

Я хочу зібрати простий монітор частоти мережі на платформі Arduino. Електромережа тут 250 В @ 50 Гц, але, очевидно, ці коливання дещо змінюються, що є суттю вправи. (Я не зацікавлений у захопленні коливань напруги, тільки коливання частоти).

Я ніколи раніше не використовував ніяких продуктів Arduino, але я знайомий з мікроконтролерами на основі ПОС. Я розумію, що Arduino має бути дещо простішим. Крім того, я не інженер-електронік.

Мабуть, Arduino буде пробувати мережеву частоту на секунду або дві, а потім повідомити про результат. Думаю, найпростіший спосіб для комп'ютера, підключеного до Arduino за допомогою USB, отримувати результат і діяти відповідним чином. В іншому випадку інші варіанти включають додавання модуля Ethernet до Arduino і отримання HTTP POST результату на веб-сервер.

(Я вважаю, що робити цей наївний метод краще запису часових рядів, а потім виконувати перетворення Фур'є?)

Розмір не є великим занепокоєнням, але компактний пристрій є кращим, ніж більший, оскільки я буду 3D-друк спеціального корпусу для нього. Тому я хотів би використовувати Arduino Nano, якщо він підходить.

Ось що я досі маю:

  1. Електрична мережа 250V буде наполовину виправлена ​​транзистором IN4004 (?) (разом з резистором 1K і ковпачком 0,22 мкФ), і це буде включено в оптопар 4N35.
  2. Цифровий (?) гнізд GPIO від Arduino виходить на базу 4N35, а емітер переходить до GND.
  3. Arduino на короткий час відбирає кількість імпульсів на цьому виводі, виконує простий розрахунок і повідомляє результат.

Ось мої невизначеності:

  1. На основі моїх досліджень, я вважаю, що Arduino може надійно працювати на USB. Якщо це правильно, це було б ідеально, як це було б уникнути мені, що для створення низьковольтного джерела живлення постійного струму для нього.
  2. Наскільки стабільним є годинник на Arduino? Скільки десяткових знаків на частоті я можу реально досягти?
  3. Я припускаю, що мені доведеться дебютувати результат від оптрон? Чи буде якийсь шум як транзисторні переходи між станами? Чи існують вбудовані функції викриття або мені потрібно буде написати власні? Як це може вплинути на наявні тактові та циклічність вимірювань?
  4. Я бачив PIC-проекти, де він взаємодіє з комп'ютером, емулюючи клавіатуру. Хоча це просто, це не буде ідеальним, оскільки комп'ютер, до якого він підключений, також повинен залишатися придатним для використання. Обробка результатів програмного забезпечення повинна працювати у фоновому режимі, коли користувач може продовжувати користуватися комп'ютером. Наскільки просто написати деяке програмне забезпечення (у C #), яке розпізнає Arduino, підключене через USB, і спілкуватися з цим пристроєм зокрема?

Я також вітаю будь-які інші коментарі та пропозиції. Дякую.

Edit: Following these helpful comments and suggestions, I've made some revisions and asked a follow-up question.

5
Стабільність електромережі перевищить точність годин Arduino на кілька порядків. Arduino зазвичай використовує керамічний резонатор, і вам буде пощастило, якщо це точно до 1%. Якщо ви хочете контролювати короткострокові відхилення частоти мережі, то спочатку потрібно використовувати стабільну посилання (атомний годинник або GPS).
додано Автор ray, джерело
@EdgarBonet Я не заперечую наявність короткострокових змін частоти мережі. Більшість мереж (принаймні у розвинених країнах) регулюють частоту мережі, тому загальна кількість циклів є постійною протягом тривалих періодів (зазвичай 24 години). Мій досвід роботи інженером з телекомунікацій підтвердив це (принаймні, в Австралії). Керамічні резонатори можуть бути стабільними (якщо не точні) ПОВЕРНЕНІ температура підтримується постійною. Ваша друга посилання (одне вимірювання), що стверджує, що МОСТ використовує кристал, просто неправильно. Я впевнений, що є більше Unos, ніж всі інші разом.
додано Автор ray, джерело
@Milliways: [цитата необхідна] ;-) Неточність годинника Arduino не є проблемою, якщо ви відкалібруєте його. І мережа не може бути такою ж стабільною, як ви, здається, вірите. Ось вимірювання стабільності мережі , показуючи відхилення Аллана вище 1 -4 протягом 40 с ≤ τ ≤ 1 год. У тому ж діапазоні τ було виміряно Arduino з керамічним резонатором . -6, тоді як на основі кварцу краще, ніж 1e-8, більш ніж на чотири порядки краще , ніж мережа.
додано Автор Sprogz, джерело
@Milliways: Друге посилання старе: нині більшість Arduinos використовують керамічні резонатори, як я вказав у своїй відповіді. Але це не призводить до недійсності вимірювань, які, до речі, не проводилися з контрольованою температурою.
додано Автор Sprogz, джерело
Занадто багато питань для відповіді в коментарі. Див. Мій відповідь.
додано Автор Sprogz, джерело
У будь-якому випадку, я хочу найвищу роздільну здатність і найкращу толерантність. Враховуючи, що мережа в Австралії повинна бути 50Hz +/- 0.5Hz, я, ймовірно, хочу 4 десяткових знаків, якщо це можливо. Я намагаюся знайти спосіб визначити, які плати Arduino використовують кристали для годин MCU і які використовують керамічні резонатори. З того, що я бачу, всі вони мають кристал, але, мабуть, це для інтерфейсу USB? Як отримати список Arduinos, які використовують кристали? В іншому випадку я просто брухт ідеї Arduino і зробити все це сам з ПОС.
додано Автор Mathew Paret, джерело

5 Відповіді

Я розумію, що Arduino має бути дещо простішим (ніж PIC).

Вся платформа Arduino (плати, основна бібліотека та IDE) робить її супер легко розпочати роботу і зробити прості речі. Однак, якщо хочете «Просунути межі» і використовувати весь потенціал MCU, можливо, доведеться копатися в низькорівневому програмуванні, і це має круту криву навчання.

250V мережа буде наполовину виправлена ​​транзистором IN4004 (?)   (разом з 1K резистором і 0.22uF шапкою), і це піде в a   Оптрон 4N35.

1 kΩ seems way too low to me: your resistor will dissipate on average 31 W, and it will burn unless it is a heavy-duty power resistor. You should choose a resistor that limits the current to a value low enough to avoid overheating, but still high enough to reliably turn on the optocoupler. If these two constraints end up being incompatible, you will need a step-down transformer in addition to (not instead of) the optocoupler.

Цифровий (?) гнізд GPIO від Arudino виходить на базу 4N35   і випромінювач переходить до GND.

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

      
  1. На мою думку, Arduino надійно може працювати на USB.
  2.   

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

      
  1. Наскільки стабільним є годинник на Arduino?
  2.   

Страшно. Більшість Arduinos відключають керамічний резонатор . Це зазвичай визначаються з толерантністю до 0,5%, але їх частота постійно коливається, а також сильно залежить від температура навколишнього середовища. Це робить ці Arduinos грубо непридатними для будь-якого робота, що вимагає точних таймінгів. Я рекомендую вам отримати Arduino спортуючий справжній кварцовий кристал, як Леонардо або Мікро. Кварц Кристал може бути досить неточним, але принаймні його частота стабільна. Це порядки більш стабільний, ніж керамічний резонатор . C.f. наприклад, ця стаття про частоту годин Arduino точність .

      
  1. Я припускаю, що потрібно об'явити результат від оптрон?
  2.   

Якщо конденсатор після півхвильового випрямляча добре розрахований, Ваш сигнал повинен бути чистим і не потребуватиме оприлюднення. Цифровий Arduino всі входи мають тригери Шмітта , які очищають вхідний шум як якщо це не надмірно. Якщо ви дійсно потребуєте debouncing (перевірте з рамки, якщо ви можете), ну ... немає положень для цього Основна бібліотека Arduino, але є Debounce підручник із приклади поставляються з Arduino IDE, і є кілька третіх осіб бібліотеки debounce, що плавають у мережі.

      
  1. Наскільки просто написати деяке програмне забезпечення (у C #), яке буде розпізнано   Arduino підключений через USB, і спілкуватися з цим пристроєм в   зокрема?
  2.   

Як зазначено в інших відповідях, ваш Arduino буде видно на вашому комп'ютері як віртуальний послідовний порт. Я не знаю C#, але будь-який гідний програмування Мова повинна дозволити вам легко читати дані з послідовного порту.

Метод вимірювання:

Ви виконаєте один або кілька періодів вхідного сигналу. Існує кілька способів зробити це. У приблизно зростаючому порядку складності і точність:

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

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

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

The methods using micros() have a resolution of 4 µs. Both will give you some software-induced jitter because they depend on the timing of your program execution. The advice given by GuitarPicker: “Keep your code predictable, using as few conditional branches as possible that might alter how long your code takes to run each cycle” is relevant only to the first method. The interrupt method is immune to your main loop timing, but it is still affected by the CPU processing other interrupts.

Метод input capture надасть вам роздільну здатність в один цикл і точність, з нульовим програмно-індукованим тремтінням. Це моє перше Вибір, але він вимагає копання в таблиці даних MCU і робити деякі програмування на низькому рівні.


Addendum: Here are some tentative answers to a comment posted by Ozzah to his own question:

Я, можливо, хочу, якщо це можливо, з 4 десятковими знаками

If you want 10−4 absolute accuracy, you may need to calibrate your clock, even if it is a crystal. If you only require 10−4 stability (variations of the frequency), then even a ceramic resonator may be (barely) up to the task, if you don't mind recalibrating it every few weeks, and assuming your indoor temperature doesn't vary by more than ≈ 10°C.

Я хочу мати найвищу роздільну здатність і найкращу толерантність.

Then a quartz crystal is definitely a plus. It's roughly 100 times more stable than the ceramic resonator.

Але якщо ви дійсно бажаєте "кращого", ви можете також слідувати за Milliways поради і отримати посилання на GPS. Деякі варіанти, в порядку зростання ціна і точність:

  1. Простий модуль GPS для Arduino. Переконайтеся, що ви отримали одне з Вихід 1PPS (опорний сигнал "один імпульс на секунду"). Ви можете захотіти зовнішня антена для кращого прийому.
  2. GPSDO (осцилятор GPS). Як правило, це лабораторна оцінка стандарт частоти, що складається з OCXO (печі з контрольованим кристалом осцилятор) дисциплінований за допомогою петлі зворотного зв'язку у відстеження часу GPS. Це дає таку ж довгострокову стабільність, як і простий модуль GPS, але має набагато краща короткострокова стабільність.
  3. GPSDO на основі рубідію. Це схоже на вище, але має також a посилання на атомну частоту рубідію. Ще краще короткострокові стабільність. Тепер мова йде про стабільності в Росії 10 −11 до діапазону 10 −12 . Переконливо для у вашому випадку використання.

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

Відзначимо також, що Arduinos базується на ATmega32U4 (Leonardo і Micro щонайменше) два 16-розрядних таймера з можливістю захоплення вхідного сигналу. ти потім може паралельно вмикати як мережний сигнал, так і посилання на 1PPS. Якщо Ваш Arduino має тільки один 16-розрядний таймер (наприклад, нано), ви б до часу одного з сигналів методом переривання.

Я намагаюся знайти спосіб визначення плати Arduino   кристали для годинника MCU, які використовують керамічні резонатори. З чого   Я бачу, всі вони мають кристал, але, мабуть, це для USB   інтерфейс?

Так, USB/послідовний інтерфейс частіше відключається від кристала основний MCU. У Arduinos, які не мають окремий USB/послідовний Мост (як і на основі ATmega32U4), здається, має головний MCU вимикають кришталь.

Як отримати список Arduinos, які використовують кристали?

Це часто вказано на сторінці продукту. Наприклад, сторінка Arduino Мікро (акцент мій): «Він має 20 цифрових входів/виходів (з яких 7 може бути використовується як ШІМ виходи і 12 як аналогові входи), 16 МГц кристал осцилятор , підключення micro USB, заголовок ICSP і скидання ".

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

4
додано
@Ozzah: Заміна керамічного резонатора кварцом не виглядає легким завданням. Це крихітний компонент SMD, вам знадобиться знайти кварц, який достатньо малий, щоб поміститися в ньому, і більшість кристалів кварцу вимагають пари конденсаторів, які вам також доведеться підігнати разом з кристалом до площі резонатора.
додано Автор Sprogz, джерело
Велике спасибі за ваш глибокий відповідь. Я пізніше переглянув його до 6K резистора, а потім, нарешті, вирішив, що краще всього перетворити вниз на більш низьку напругу, ймовірно, 5V. Я розгляну моделі з кварцовими кристалами. Чи легко замінити керамічний резонатор на кварц? Це лише питання заміни деяких компонентів?
додано Автор Mathew Paret, джерело

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

Замість того, щоб підрахувати кількість імпульсів змінного струму за певний період часу, ви можете отримати кращі результати, бачачи, скільки годинників Arduino ви отримуєте між вибірковими імпульсами (50). Це дасть вам більше можливостей для роботи. Робити протилежне (бачачи, скільки імпульсів за певний період часу) не дасть такої ж точності. Якщо ви отримали лише 49 імпульсів за секунду, ви просто не випустили 50-й, або це було всього 2%? Оскільки годинник Arduino може розраховувати набагато швидше, краще замість цього розраховувати.

  1. Arduinos можна надійно живити за допомогою USB-пристрою, якщо ви не намалюєте занадто багато струму. Ваша програма звучить так, ніби вона взагалі не повинна малювати.
  2. Годинник на Arduino не буде порівнюватися з використанням окремої схеми годин реального часу, але вона повинна бути достатньою для вимірювання тенденцій і відмінностей. Тримайте код передбачуваним, використовуючи якомога менше умовних гілок, які можуть змінити тривалість коду для запуску кожного циклу.
  3. У цій ситуації, можливо, дуже хороша ідея. Є декілька бібліотек для Arduino, або ви можете самостійно згорнути. Ще раз, бібліотека повинна писати так, щоб не вводити непослідовних затримок у коді. З цієї причини, можливо, краще написати власний, спеціально підходить для цієї програми. Можливо, вам доведеться зайняти осцилограф і подивитися, як довго імпульси з вашої схеми оптрон. Чим ближче ви можете змусити їх бути квадратною хвилею 0V/5V, тим краще.
  4. Arduinos поставляється в багатьох ароматах. Деякі можуть емулювати клавіатури, але більшість з них діють як послідовні порти. Якщо ви можете читати дані з послідовного порту, то ви можете прочитати вихідний сигнал з Arduino. Це має бути тривіальним у C#, або просто використовувати емулятор терміналу або послідовну консоль Arduino IDE для перегляду результатів. Знову ж таки, якщо ви виводите дані під час вимірювання, ви повинні використовувати вихідний сигнал з фіксованою шириною, щоб програма зайняла стільки ж часу для запуску кожного циклу. Це було б набагато більш точно, замість того, щоб взяти ваші вимірювання мовчки, і вивести результати пізніше пізніше, так що вам не доведеться враховувати затримки буфера послідовного порту. Знову виконайте іншу затримку перед очищенням.
2
додано

It's a safety issue at the very least. A catastrophic failure of the opto & everything is gone. At least with a "wall bug" style transformer, you've given yourself & your device a large safety margin.

I assume your opto will be triggered at line voltage & frequency to subsequently switch a 3.3 or 5v bus to an Arduino input pin at the 50hz line rate.

The opto you've chosen turns ON at ~1 volt & it needs a current limit of ~10ma thru it. You'll need to calculate a dropping resistor value to bring the rectified peak voltage down so that the opto isn't overloaded in either category. You'll need to also compensate for the eventual surge/peak voltages well above the typical line voltages.

Існує, ймовірно, достатньо постійного "шуму", що в'їжджає на лінію, що перешкоджає тому, щоб опто регулярно бачив момент "перетину нуля", на який працює ваш лічильник імпульсів.

Transforming that line voltage to a much lower level decreases ambient line noise by the same transformer ratio, increases safety & makes it easier for the opto to detect the zero crossing in the presence of line noise etc. bc

1
додано
Це не зашкодить, щоб зробити як трансформатор і опто. Я бачив стіни трансформаторів не з вищими напругами, ніж їх звичайний вихід. Я думаю, до дешевого USB-концентратора я зіткнувся, що тримав флеш-накопичувачі (коли вони були новими і дорогими).
додано Автор discotech, джерело
Дякую. Я думаю, що я впаду до ~ 5V з трансформатором, як ви пропонуєте.
додано Автор Mathew Paret, джерело

Я хотів би використовувати понижуючий трансформатор з діодом випрямляча 1N4004, щоб обмежити пік випрямлених напруг до менш безпечної вхідної напруги Arduino. Я також буде схильний до додавання стабілітрон на землю на вхід Arduino в "затиск" або обмежити, що вхідна напруга на будь-який ваш Arduino безпечної верхньої межі.

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

Низький поточний запобіжник там десь не був би поганою ідеєю.

1
додано
Так що я не інженер-електронник, але я не розумію, чому мені потрібно доводити напругу до діапазону Arduino? Хіба це не вся справа в оптрон? Вхідний кінець працює на частоті 250В, а вихідний - на будь-яку напругу, на яку працює Arduino?
додано Автор Mathew Paret, джерело

На підставі своїх досліджень, я вважаю, що Arduino надійно може працювати на USB.

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

Наскільки стабільним є годинник на Arduino? Скільки десяткових знаків на частоті я можу реально досягти?

залежно від вашого правління. кристали зазвичай визначаються до 20 ppm, але зазвичай в межах 10 ppm при кімнатній температурі. резонатори, які використовують деякі arduino, становлять 0,1 - 1%.

if you are n't too picky, even the internal oscillators will do -> you can average the measurement over a long period of time to minimize jitter.

Я припускаю, що мені доведеться дебютувати результат від оптрон?

взагалі немає.

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

Це дозволяє обчислювати частоту до кількох десяткових точок: ви повинні в середньому приблизно 8M підрахунок на половину циклу.

це дуже багато ефективних цифр.

0
додано