DIY 100MHz Frequency Meter and tachometer (ATTINY814).
- Частотомер
- Тахометр
- Тестер кварцев.
Начало истории — Недорогой самодельный тахометр для газонокосилок и прочих двигателей на ATTINY13A .
Как указал в той статье, мне не хватило 1 килобайта памяти для реализации всего желаемого функционала, поэтому я решил сделать новый тахометр на ATtiny814 с 8 килобайтами памяти (недавно я купил их аж 5 штук — так было дешевле). Микроконтроллер этот относительно современный, и примеров на него мало, но, по удивительному совпадению мне попалась статья, в которой David Johnson-Davies сделал частотомер и тестер для кварцев на ATtiny414 (по сути тот же 814, только с 4 килобайтами памяти). Ссылка на статью, и ее перевод:
http://www.technoblogy.com/show?20B4
https://habr.com/ru/companies/ruvds/articles/572914/
Идея мне понравилась, и я решил взять этот проект за основу своего прибора. Только как тахометр для газонокосилки это не совсем подходит, так как замер происходит частотным методом подсчета в целых герцах — это когда микроконтроллер считает количество импульсов за определенное время (в нашем случае за 1 секунду). Этот метод работает хорошо на высоких частотах, но не очень точно на низких (меньше 5 герц вообще показывает ерунду). Да и показания могут прыгать на один герц вверх или вниз, то есть в переводе на обороты двигателя газонокосилки это 60-120 RPM погрешности, что многовато. В самом конце своей статьи автор рекомендует для измерения низких частот использовать интервальный метод измерения — то есть подсчет времени между импульсами, что позволяет измерять частоты даже меньше 1 герца (если есть желание ждать больше одной секунды). В моем варианте прибор при наличии частоты более 1 Гц использует замер в течение 1 секунды, но при исчезновении частоты временно переключается на 3-секундное ожидание импульсов, что позволяет обнаружить и более редкие импульсы. При использовании 64-битной математики можно получить достаточно точную частоту даже с двумя знаками после запятой, что дает более точный расчет RPM, чем при целочисленном вычислении (увы, но не в 100 раз, так как при моем алгоритме показания все же немного плавают, и я не сумел это полностью победить). В принципе, меня устраивает, но стоит упомянуть, что я не считаю себя проогаммистом микроконтроллеров, это у меня что-то вроде хобби, так что если сделаете лучше — присылайте ссылку на Ваш код в комментариях.
Сборка и компиляция.
Для программирования ATtiny814 в среде Arduino IDE установите ядро megaTinyCore. Я заменил millis() на свою rtc_millis(), поэтому в Arduino IDE нужно установить millis()/micors() timer: «Disabled», вместо указанного в оригинале millis()/micros(): «TCA0 (default on 0-series)». Остальные настройки: Chip: «ATtiny814», Clock: «20 MHz Internal». Для успешной компиляции нужно положить шрифт font6x8_tol_minimal.h в директорию «/home/<username>/Arduino/libraries/Tiny4kOLED/src/» (или в ту, куда у Вас установлена библиотека Tiny4kOLED).
Что изменено в железе: у меня никогда не было 128×32 OLED экранов, потому что 128×64 стоят почти столько же, но помещают в 2 раза больше информации, поэтому я всегда покупал большие. В этом проекте тоже использован «большой» дисплей. Авторский код для работы с OLED я заменил на библиотеку Tiny4kOLED — памяти занимает ненамного больше, но функционал и удобство работы заметно расширяется.
ВНИМАНИЕ: не подключайте прибор к программатору, когда он запитан от самодельного USB разьема! Провода VCC, GND и UPDI подключаются напрямую от программатора (USB-UART) к микроконтроллеру, таким образом, во время прогаммирования прибор должен получать питание только от программатора. В качестве программатора используется обычный USB-UART адаптер. Провод TX подключается к контакту UPDI через 4.7k резистор, провод RX подключается к UPDI напрямую.
Прибор собирается «навесным монтажом» по размеру коробки, потом фиксируется в ней шурупами 2×5 мм. Все это можно очень недорого купить у китайцев, например на AliExpress. Провод для программирования по UPDI я сделал отдельным, так как после сборки он не понадобится и будет только вносить путаницу, если вывести его на верхний торец вместе с остальными контактами.
Схема для сборки как у оригинального прибора от David Johnson-Davies, я только убрал светодиод, так как он полезен разве что только для отладки, но из кода я светодиод не выкорчевывал, поэтому можете подключать его по схеме, управление PORTA.OUT |= PIN4_bm для включения и PORTA.OUT &= ~PIN4_bm для выключения. Кнопка в моем варианте подключается к PA5 (3 контакт на ATTINY814) и вторым контактом к GND. Резистор и конденсатор на дисплей я не ставил.
Настройки.
Кроме функционала оригинальной версии, добавлены новые настройки, не зря же у нас в 2 раза больше памяти и большой экранчик 🙂
Для входа в меню настроек:
- Вариант 1 — прибор выключен: зажать кнопку, подать питание, не отпускать кнопку до появления меню.
- Вариант 2 — прибор работает: зажать кнопку на 3+ секунды, отпустить, зажать снова и удерживать до появления меню (без удержания — просто перезагрузка).
Навигация в меню одной кнопкой:
Если не нажимать кнопку в течение 3 секунд, курсор переходит на следующий пункт настроек.
Если нажать кнопку — циклически изменяется значение текущего пункта и таймаут продлевается еще на 3 секунды.
После всех четырех пунктов настройки сохраняются в EEPROM и прибор перезагружается.
Список настроек:
- MODE — режим по умолчанию при подаче питания: 0 = freqency (оригинальный), 1 = interval (тахометр). Я не делал сохранения последнего использованного режима, чтобы не протирать EPROM до дыр. Когда прибор работает обычным образом, то для смены режима достаточно нажать на кнопку.
- EDGE — возможность изменения фронта замера — rising edge и falling edge. Не думаю, что для обычных применений это имеет значение, так как мы измеряем частоту, а не длительность высокого или низкого уровня, а при измерении частоты количество высоких и низких уровней всегда одинаково. Я делал это с той точки зрения, что если, например, цеплять к прибору датчик Холла NJK-5002C, он создает низкий уровень при соприкосновении с магнитом, соответственно, логично замерят обороты на falling edge. А, например, NJK-5002D при соприкосновении с магнитом создает высокий уровень, соответсвенно, логично с ним использовать rising edge. Хотя по факту никакой разницы при вычислении частоты не должно быть, но раз сделал — пусть будет.
Как установить edge: в настройках EDGE, 0 — rising, 1 — falling. - DIV/MUL — Делитель и множитель (работает в обоих режимах, но имеет смысл только для тахометра).
Когда использовать делитель:
* Используется биполярный датчик Холла (реагирует на оба полюса магнита), соответственно, за один оборот двигателя датчик получает 2 импульса. Для получения правильной частоты нужно разделить рассчетную на 2.
* Используется униполярный датчик, но на двигателе установлены два или более магнитов. В этом случае нужно разделить результат на количество магнитов.
Как установить делитель: в настройках DIV/MOD установить число, от 2 до 10, на которое надо делить результат. При замере в нижней правой части экрана будет написано, например, «: 2».
Когда использовать множитель:
* Есть несложный, но и не очень точный метод измерения оборотов двигателя замером магнитного поля на проводе свечи зажигания. Дешманские китайские тахометры за 300-500 рублей в основном используют этот метод. Поверх провода свечи зажигания вешают датчик-трансформатор или просто обкручивают 5-6 витками проволоки, и при зажигании свечи на этот датчик идет сигнал. Но, в 4-тактном двигателе полный цикл требует двух оборотов двигателя, таким образом получаем 1 искру и 1 импульс на датчик на каждые 2 оборота двигателя. Чтобы посчитать правильное количество оборотов, нужно умножить результат с датчика на 2.
Как установить множитель. В настройках DIV/MOD установить число от 12 до 20, которое рассчитывается как 10+множитель, например, чтобы умножить на 2, нужно установить 12. При замере в нижней правой части экрана будет написано, например, «X 2». - SCREEN INVERSE — чисто косметическая функция — инвертирование экрана. В настройках SCREEN INV. — 0 — белые буквы на черном фоне, 1 — черные буквы на белом фоне. Напомню, что OLED экран потребляет значительно меньше энергии, когда экран черный, но при питании от розетки это не имеет особого значения, так что тут дело вкуса. У меня экран с белым фоном малозаметно полосит вокруг текста, это потому что включена функция oled.setInternalIref(true); Она делает экран ярче и контрастнее обычного состояния — на черном фоне это прямо очень помогает. Но если белый фон предпочтительней, oled.setInternalIref(true) лучше убрать из кода (хотя проверяйте, может у меня просто такой экран, а на Вашем все будет нормально и с белым фоном).
Как замерять.
- ПРЯМОУГОЛЬНЫЙ СИГНАЛ. Сигнальный провод — в IN, земля — GND. Напряжение сигнала должно быть меньше 5 Вольт! Прибор успешно определяет сигнал от 2.58 до 5 вольт, меньше не проверял. Примеры измерений разных частот в разных режимах:


- КВАРЦ (freqency mode). Один вывод — XTAL (любое отверстие по размеру кварца), второй вывод — IN.

- ТАХОМЕТР (interval mode). Подайте на датчик питание с VCC и GND, а сигнал принимайте на IN. Значение PPM — Pulses Per Minute — более общая аббревиатура, равная RPM для вращающихся объектов, таких как вал двигателя. Если используете датчик Холла, лучше сразу припаять к его проводу трехштырьковый вывод для быстрого вставления в частотомер и извлечения из него.

На многих ДВС уже имеется магнит, который управляет зажиганием, предпочтительнее испольховать его. Если же магнита нет, его можно временно приклеить или примотать скотчем или изолентой. Имейте в виду, что на скорости в несколько тысяч RPM даже скотч не может удержать магнит, он отваливается от вала двигателя и летит со скоростью пули, и очки могут не спасти Ваши глаза — для высоких оборотов используйте иной тип датчика, например, лазерный со светоотражающей наклейкой на валу. Если все же необходимо приклеить магнит, выбирайте место с меньшим радиусом на валу — там скорость вращения меньше. Желательно использовать самый легкий магнит из имеющихся. После настройки оборотов магнит рекомендую удалить, так как он разбалансирует двигатель (появляются вибрации, которые увеличивают его износ).
Замеченные недостатки:
- Точность измерений сильно зависит от качества кварца 32768Hz, и емкость конденсаторов тоже влияет. Я купил набор из 20 кварцев, они все работают по-разному, причем некоторые сильно хуже других — надо подбирать. Я, например, выставил на геренаторе сигнала 1 мегагерц и смотрел, с каким кварцем показания будут точнее. На низкой частоте типа 10 килогерц калибровать не получится — они все будут показывать правильно. Чем выше тестовая частота, тем сильнее будет отклонение от идеала и тем точнее можно подобрать кварц. Не советую калибровать, подключая дешевый китайский высокочастотный кварц, например, на 20 мегагерц — я много перепробовал, и у них у всех очень большая погрешность. Лучше использовать для калибровки проверенный генератор на максимально доступной частоте.
- Я проверял измерение кварцев на 8, 12, 16, 20 и 32.7 МHz (большего номинала не было) — они определяются нрмально. Кварцы на 4 МHz и часовые кварцы на 32768Hz не определяются. Не знаю, реально ли это исправить (проблема имеется и на оригинальной версии от David Johnson-Davies). При измерении высокочастотных кварцев показываемая частота немного плавает — возможно, требуется экранирование.
- В режиме interval mode на частоте выше 26 килогерц прибор задыхается от вычислений — выше — переходите на frequency mode. Можно снизить нагрузку на процессор, перейдя с 64-битных вычислений на 32-битные (измерять миллисекунды вместо микросекунд), при этом прибор сможет измерять в interval mode сотни килогерц, но значительно менее точно (мне не понравилось, я вернулся на 64 бит). Учитывая, что interval mode — изначально делался как тахометр для газонокосилки с оборотами 2800 в минуту (47 Герц), то для меня это не проблема. Возможно, Вам будет интересно замерить обороты мотоцикла, но и тут 10-15 тысяч RPM — это не более 250 Герц. Самый смелый эксперимент — замерить обороты дремеля, которые могут доходить до 35000 RPM, что всего лишь олоко 587 Герц, так что прибор отлично справится с любой задачей для тахометра.
- Все 8 килобайт памяти заполнены под завязку, пришлось даже поудалять некоторые украшательства. В начале статьи я жаловался, что мне было мало 1 килобайт на ATtiny13A, кто ж мог подумать, что теперь и 8 килобайт уже мало! Чтобы добавить новые функции или исправлять баги, придется что-то оптимизировать или удалять. 64-битные вычисления много жрут, ну и работа с OLED и шрифты. Возможно, паковка шрифта даст выигрыш в несколько десятков байт, но мне было лень этим заниматься — работает, и ладно…
Еще раз повторяю — я не профессиональный программист — если Вы можете оптимизировать код, сделать его лучше, найти и исправить баги — ссылку на Вашу версию присылайте в комментарии.








Leave a Reply