Тахометр на атмега8 своими руками
Предлагаю вариант тахометра на AVR микроконтроллере с большими цифрами на символьном дисплее. Цифры выстраиваются из отдельных сегментов на всю высоту дисплея, что делает показания прибора более читабельными. Рассчитывался на диапазон измерения от 300 до 9999 оборотов в минуту. Но получилось так, что при более высоких (от 10000) об/мин, младший разряд сдвигается за пределы экрана и прибор показывает количество оборотов в минуту, делённое на 10, что тоже неплохо.
Схема построена на микроконтроллере ATmega8. Для вывода показаний тахометра используется распространённый дисплей WH1602 на базе контроллера HD44780 (KS0066).
Для более точного подсчета частоты вращения коленчатого вала, микроконтроллер тактируется от внешнего кварцевого резонатора на 8 MHz. Фьюзы выставляются соответствующие:
Если высокая точность измерения не сильно важна, то можно обойтись без внешнего кварца, при этом фьюзы нужно будет выставить на тактирование от внутреннего RC генератора на 8 МГц. Так как печатная плата разведена для МК в корпусе TQFP-32, на ней, для удобства, предусмотрен ISP разъём для внутрисхемного программирования. В прикрепленном архиве находятся несколько прошивок с различными временными интервалами обновления показаний тахометра на дисплее: 50, 100, 150, 200, 250, 333 и 500 мс (период указан в имени файла прошивки), а также для сигналов входа 1 импульс на оборот и 2 импульса на оборот. Также в архиве находятся файл печатной платы и проект Proteus. После сборки схемы и прошивки микроконтроллера получается такое вот устройство:
На видео показана работа тахометра с прошивкой 1 импульс на оборот и периодом обновления показаний дисплея 50 мс
Данное устройство предназначено для измерения частоты вращения электродвигателей и главным преимуществом является бесконтактный метод измерения, основанный на стробоскопическом эффекте, где яркие световые импульсы производит светодиод высокой мощности. Для измерения необходимо установить частоту вспышек в соответствии с частотой вращения (при освещении стробоскопом объект кажется неподвижным), используя энкодер. Измерение может быть сделано без остановки вращающегося механизма. Тахометр построен на микроконтроллере ATmega8, а результат измерения отображается на ЖК-дисплее. Кроме того, система также показывает ошибку, которая появляется в результате некоторых временных процессов в программе. Управление осуществляется с помощью поворотного энкодера и небольшой клавиатуры. Все устройство может питаться от батарей, так как из-за импульсного характера генерации потребление энергии является незначительным. Весь прибор успешно уместился в популярном корпусе KM35, где также есть место для 9В батареи.
Схема устройства
Сердцем прибора и ее наиболее важной частью является микроконтроллер U1 (ATMEGA8-16AU), который работает от кварцевого резонатора частотой 16 МГц (X1). Дополнительные конденсаторы С1(22pF) и С2(22pF) необходимы для правильной работы резонатора. Предусмотрен интерфейсный разъем программирования Prog, который содержит набор контактов для последовательного программирования. Разъем требуется, поскольку микроконтроллер выполнен в SMD корпусе. С5 (100 нФ) фильтры питания микроконтроллера. Конденсаторы С6(100 nF) и С7(100 nF) смягчают крутизну сигнала, генерируемого энкодером, что облегчает его бесперебойную работу в программе. Кнопки S1 - S6 (uSwitch) являются дополнительным клавиатурным блоком. Светодиод мощностью 0,5 W излучает вспышки света, рабочий ток ограничен резистором R4(30R / 2W) и управляется с помощью транзистора Т2(BC337) и резистора R3(330R). Светодиод подключается непосредственно к источнику питания без стабилизатора, чтобы минимизировать воздействие импульсов тока на микроконтроллер и уменьшить нагрузку на стабилизатор U2(78L05). Конденсаторы С3(220uF) и С4(47uf) необходимы для правильной работы стабилизатора. Индикация результатов измерения осуществляется на ЖК-дисплее (W1, 16x2). Контраст устанавливается потенциометром P1(10k), подсветка включается программно с помощью T1(BC556), R1(47R) и R2(3,3k).
Сборка
Прибор может быть успешно построен на основе печатной платы, которая доступна в архиве внизу страницы. Также доступа плата в зеркальном отображении. Плата проста в сборке, но включает в себя компоненты для пайки SMD, которые могут вызвать проблемы для начинающих радиолюбителей. Сборка должна быть начата с пайки двух перемычек. Далее должны быть установлены SMD конденсаторы и резисторы, они используются в популярных корпусах 0805(2x1.2mm). Далее, припаивается на место микроконтроллер U1, обратите внимание на правильность установки ключа. Кнопки должны иметь длину 15 мм и слегка выступать над ЖК дисплеем, это будет важно при установке платы в корпус. Точно так же и в случае с энкодером. Потенциометр Р1 установлен таким образом, чтобы его можно было регулировать через отверстие в боковой стенке корпуса. Плата разработана таким образом, что она легко помещается в популярном корпусе KM35.
После того как был написан первоначальный вариант кода и произведен расчет таймера делителя, измерения показали отклонение частоты генерируемых вспышек по отношению к теоретическим расчетам. Эта погрешность появляется из-за работы делителя таймера, равного 1, времени, которое необходимо для обслуживания прерывания, а иногда из-за перезагрузки значения таймера в регистрах. В приведенной ниже таблице, включены измерения частот, генерируемых на выходе (F_p) по отношению к частоте, которая должна быть теоретически (f_i) и соответствующие значения оборотов (умножаются на 10, чтобы получить точность установки в 0,1 об/мин).
Данные из таблицы делятся на два диапазона, первый от 60 до 480 об/мин и второй диапазон 480-42000 об/мин. Это разделение результат программы, в которой работают два диапазона измерения. Графики ниже показывают зависимость измеренных и теоретических данных:
В качестве калибровочной кривой была принята квадратичная зависимость:
y = a \cdot x^2 + b \cdot x +c
где у - обороты теоретические, х - измеренные обороты, а, b, c - коэффициенты в результате регрессии. Графики были выполнены в программе Gnuplot, и поправочные коэффициенты постоянные для двух областей работы системы представлены ниже:
После вставки параметров устройство становится измерителем, а не только индикатором оборотов. В таблице ниже приведены результаты измерений частот генерируемых прибором в зависимости от набора на дисплее. Частота генерируется с ошибкой, равной доли процента от желаемого:
Рассматриваемый бесконтактный тахометр – это компактное устройство на микроконтроллере ATMega48 производства компании Atmel, позволяющее измерять высокие скорости вращения бесконтактным способом. Для измерения используется ИК сенсор (оптопара, ИК светодиод и ИК фотодиод в одном корпусе). Вывод данных осуществляется на двухстрочный символьный ЖК дисплей на базе контроллера HD44780.
Принцип работы
ИК сенсор (оптопара), представляющий собой миниатюрный компонент с ИК светодиодом и фотодиодом в одном корпусе, посылает ИК излучение на вращающийся механизм (вал, ротор двигателя), на котором должна быть небольшая отражающая наклейка.
Благодаря этой наклейке, каждый оборот вала вызывает появление отраженного импульса ИК излучения. Используемый сенсор производства компании Vishay Semiconductor имеет маркировку TCND-5000.
Данный сенсор был выбран после тестирования эквивалентных продуктов, так как его корпус обеспечивал оптическую изоляцию передающей и приемной части, а ИК светодиод выдерживает большие токи, что позволяет проводить измерения на больших расстояниях.
Таким образом, используя оптопару мы можем подсчитать время полного оборота вала, а далее, зная время (обозначим это время T в секундах), мы можем вычислит количество оборотов в минуту, используя простое выражение 60/T.
Получение данных от сенсора
Для снижения стоимости устройства и сложности сборки, а также для повышения гибкости системы, мы непосредственно подключим ИК сенсор к микроконтроллеру и программно реализуем всю обработку получаемого сигнала. Сразу стоит заметить, что это не так просто, так как получаемый с ИК фотодиода сигнал содержит шумы, а внешнее освещение постоянно оказывает на него влияние. Таким образом, проблема состоит в том, чтобы разработать устройство с автоматической адаптацией к внешней освещенности и расстоянию до объекта измерения.
На рисунке ниже изображена диаграмма аналогового сигнала от ИК сенсора (фотодиода)
Так как сигнал имеет шумы, при каждом определении наличия и отсутствия импульса (наличие импульса говорит о том, что вал вращается и сенсор «видит» отражающую наклейку), большое количество колебаний «вводит в заблуждение» микроконтроллер. Кроме того, эти факторы не позволяют использовать встроенный в микроконтроллер аналоговый компаратор, и нам необходимо ввести обработку аналогового сигнала перед каждой процедурой подсчета циклов.
Решение было найдено в оценке средней интенсивности, основанную на максимальном и минимальном значении интенсивности сигнала от сенсора, и включением гистерезиса в районе средней интенсивности. Гистерезис используется для предотвращения многократного счета циклов зашумленных импульсов. Рисунок ниже поясняет работу такого алгоритма.
Когда сигнал нарастает от низкого состояния (отсутствует отражение от наклейки на валу) к высокому (отражение ИК импульса), алгоритм возьмет в расчет этот импульс высокого уровня лишь после того, как он пересечет «возрастающий уровень» гистерезиса, и примет в расчет низкий уровень лишь после того, как сигнал пересечет «спадающий уровень» гистерезиса. Такой алгоритм позволяет избежать ошибок вычислений, вызываемых шумным сигналом.
Принципиальная схема устройства
Схемотехническое решение очень простое и компактное (благодаря использованию миниатюрного сенсора), не содержит дорогостоящих компонентов. Питание устройства осуществляется от трех батарей типа AAA.
Как вы, наверное, заметили, отсутствует потенциометр регулировки контрастности дисплея (что также позволяет уменьшить размер устройства). Это возможно благодаря программной реализации алгоритма автоматической подстройки контрастности в зависимости от уровня напряжения питания с применением ШИМ и фильтра низких частот на элементах R3, R4 и C2. Пользователи могут ознакомиться с текстом алгоритма в исходном коде ПО микроконтроллера во второй части статьи.
Разъем JP1 предназначен для внутрисхемного программирования микроконтроллера. Разъем JP2 предназначен для подключения дополнительного пользовательского датчика.
Список примененных компонентов
Обозначение в схеме | Наименование, номинал |
IC1 | Микроконтроллер ATmega48 |
Q1, Q2 | Транзистор BCW66G |
C1, C2 | 10 нФ |
C4, C5 | 33 пФ |
X1 | Кварцевый резонатор 20 МГц |
R1, R2, R7 | 470 Ом |
R3 | 1 кОм |
R4 | 1.5 кОм |
R5 | 1 МОм |
R6 | 110 Ом |
R8 | 70 Ом |
LED3 | Светодиод |
IR1 | Оптопара TCND-5000 |
B1 | Кнопка |
B2 | Выключатель питания |
JP1 | Разъем внутрисхемного программирования |
JP2 | Разъем расширения |
Демонстрация работы бесконтактного тахометра на микроконтроллере AVR
Во второй части статьи рассмотрим конструкцию прибора и основные моменты в программном обеспечении микроконтроллера, включая аналого-цифровое преобразование и организацию обмена данными с ЖК дисплеем.
интересные РАДИОСХЕМЫ самодельные
- ELWO
- 2SHEMI
- БЛОГ
- СХЕМЫ
- РАЗНЫЕ
- ТЕОРИЯ
- ВИДЕО
- LED
- МЕДТЕХНИКА
- ЗАМЕРЫ
- ТЕХНОЛОГИИ
- СПРАВКА
- РЕМОНТ
- ТЕЛЕФОНЫ
- ПК
- НАЧИНАЮЩИМ
- АКБ И ЗУ
- ОХРАНА
- АУДИО
- АВТО
- БП
- РАДИО
- МД
- ПЕРЕДАТЧИКИ
- МИКРОСХЕМЫ
- ВОПРОС-ОТВЕТ
- АКУСТИКА
- АВТОМАТИКА
- АВТОЭЛЕКТРОНИКА
- БЛОКИ ПИТАНИЯ
- ВИДЕОТЕХНИКА
- ВЫСОКОВОЛЬТНОЕ
- ЗАРЯДНЫЕ
- ЭНЕРГИЯ
- ИЗМЕРЕНИЯ
- КОМПЬЮТЕРЫ
- МЕДИЦИНА
- МИКРОСХЕМЫ
- МЕТАЛЛОИСКАТЕЛИ
- ОХРАННЫЕ
- ПЕСОЧНИЦА
- ПРЕОБРАЗОВАТЕЛИ
- ПЕРЕДАТЧИКИ
- РАДИОБАЗАР
- ПРИЁМНИКИ
- ПРОГРАММЫ
- РАЗНЫЕ ТЕМЫ
- РЕМОНТ
- СВЕТОДИОД
- СООБЩЕСТВА
- СОТОВЫЕ
- СПРАВОЧНАЯ
- ТЕХНОЛОГИИ
- УСИЛИТЕЛИ
Схема и фотографии импульсного металлоискателя на микроконтроллере ATmega8 с индикацией на светодиодах. Намотка катушки не требует особых навыков и расхода провода: провод 0.6 - 1 мм, диаметр поисковой катушки 21 см, 27 витков с общим сопротивлением 2 ома. При правильно собранной схеме металлоискателя просто подключаем её и без всяких настроек должно заработать. Поисковый датчик можно делать из любого влагостойкого материала - в крайнем случае из фанеры. Только не забудьте хорошенько пропитать фанеру, чтобы влагу не впитывала. Можно и смолой залить - кольцевой датчик не боится коробления и усадки, главное после высушить хорошо, а потом настраивать. Далее
Самодельный аккумулятор на 9 В, литий-полимерный, собранный под стандартный корпус типа Крона.
Тонкомпенсированный регулятор громкости с адаптацией к регулятору тембра - теория и практика.
Кодовая кнопка для ограничения доступа к объектам, простая схема с реле на МК Attiny13.Для тех, кто не знает, тахометр-прибор для измерения частоты вращения.В этой статье я расскажу, как сделать такой прибор на микроконтроллере AVR Attiny2313.Попутно мы разберем такие функции МК, как таймер/счетчик, прерывания по таймеру/счетчику, внешние прерывания и работа с LCD дисплеем и переменными.
Для начала оговорим принцип работы и необходимые для изготовления детали.Прежде всего, нужен собственно датчик, который будет считать обороты.Его я взял из старого принтера.Там он использовался для определения наличия бумаги.
Датчик работает так: внутри него находится оптопара, состоящая из инфракрасного светодиода и фоторезистора.Когда объект(желательно белого цвета для лучшего отражения) находится над оптопарой свет, излучаемый светодиодом, отражается от него и попадает на фототранзистор.Это то же самое, что и обычный транзистор, только база управляется не подаваемым на нее током, а светом.Следовательно транзистор открывается, передавая логическую единицу на МК.
Так выглядит датчик, который использовал я:
Транзистор нужно подключать к питанию с резистором 4,7кОм, можно взять другой номинал, но 4,7кОм оптимальный вариант по току:
Для того чтобы, мы могли считать информацию понадобится дисплей.У меня под руками был однострочный 16-символьный алфавитно-цифровой экземпляр.Для регулировки контрастности дисплея желательно прикрутить переменный резистор.Даташит моего дисплея(ROHM 2034R) гласит, что нужен резистор от 10 до 20 кОм, но традицию использовать не то, что надо, а то что есть никто не отменял, поэтому я откопал резистор от 0 до 33 кОм.Если не найдете нужный переменный резистор или просто не захотите его ставить, можно сделать простой делитель напряжения из двух резисторов.Контрастность у дисплея при этом регулироваться не будет, конечно.На этом скромный список деталек заканчивается, приступаем к составлению схемы.
Дисплей подключается к микроконтроллеру так, как показано на схеме(в данном случае для порта В).
Аналогично для порта С:
Переменный резистор, как уже было сказано используется для регулировки контрастности, подключается к 3му выводу дисплея(обозначен, как LCD HEADER V0).
Схема вышла, в общем, несложная.В архиве выложу ее полностью в формате spl(SPLAN).Подключаем 2 необходимые библиотеки:
После подключения библиотек объявляем переменные.int-целые числа от -32768 до 32767.Для числа оборотов в секунду этого хватит.
Порт D настраиваем на ввод и ставим единицы по умолчанию на все его биты.
Инициализируем дисплей.В скобках пишем число символов в строке.
Дальше надо настроить таймер.Он примечателен тем, что тикает даже во время выполнения программы.В этом его главное отличие от обычной задержки(команды delay).Эта задержка полностью остановит МК, но в данном случае это недопустимо, так как прибор должен считать обороты без остановок.Тут и приходит на помощь таймер/счетчик.
Смысл программы такой: по внешнему прерыванию(от датчика) запускается цикл, в котором прибавляется единица к переменной rps.Таймер в это время продолжает тикать.Как только он доходит до 1 секунды, стартует другое прерывание по таймеру/счетчику.В нем переменная rps выводится на дисплей и обнуляется.Таким образом, частота обновления показаний 1 секунда.В Attiny2313 есть 2 таймера 8 и 16 разрядный.Мы воспользуемся 8-разрядным.Он обозначается, как таймер/счетчик 0. 8 разрядов таймера означает, что в нем 2 в 8 степени позиций = 256.
Настройка таймера начинается с регистра управления TCCR0:
Расчеты таймера основаны на тактовой частоте, а в этом регистре мы выбираем предделитель тактовой частоты, с которой будет тикать таймер.Это очень сильно облегчает расчеты.К примеру, если МК работает с частотой 8 мегагерц, поделив ее на 1024, мы получаем сравнительно небольшое число, работать с которым намного легче.
Программируем биты в соответствии с таблицей:На этом этапе нужно определиться с начальным значением таймера.Оно следует из того, сколько раз должен переполниться таймер для достижения определенного времени в соответствии с тактовой частотой с предделителем.
Расчеты:
8000000/1024=7812,5 (делим тактовую частоту МК на выбранный предделитель)
7812,5/256=30,52 (считаем число переполнений)
Значит потребуется примерно 30 переполнений всего таймера(с 0) для достижения 1 секунды.
Ставим таймер в 0.В регистр TIFR-флаг переполнения таймера.Когда таймер переполнен автоматически устанавливается 1.
Этот регистр нужно сбросить в 0:TIMSK — регистр прерываний по таймеру.
Разрешаем прерывания по таймеру/счетчику 0.Также нам понадобятся и прерывания по внешнему сигналу(в данном случае с датчика).
Они управляются регистром GIMSK.INT1(PD3)-выход микроконтроллера, к которому будем цеплять датчик.
Разрешаем прерывания по внешнему сигналу с порта INT1:Регистр МCUCR управляет видом внешних прерываний.Для тахометра подойдет прерывание по спадающему фронту.Только в этом случае он будет показывать реальное число оборотов.
Программируем регистр в соответствии с таблицей:Ассемблерной командой разрешаем все прерывания:
Чтобы программа никогда не завершалась добавляем бесконечный цикл:
Помимо главной программы в проекте присутствуют еще 2 подпрограммы прерываний-по таймеру и по внешнему сигналу.
По таймеру:
Обозначаем начало подпрограммы прерываний:Нужно снова обнулить таймер, чтобы он начал отсчитывать новую секунду.
Мы посчитали, что для отсчета одной секунды надо, чтобы таймер переполнился 30 раз.
Поэтому, как только счетчик прерываний(отдельная переменная pr, объявленная вначале)станет равен 30, число оборотов в секунду выводится на дисплей, а обе переменные обнуляются.С выводом переменной на экран пришлось повозиться отдельно.Как выяснилось, выводить напрямую переменную нельзя, нужно либо сделать из нее строку, либо преобразовать ее в последовательность номеров из таблицы символов(есть в даташите на любой дисплей):
Первый способ можно устроить с помощью функции sprintf, но она ест слишком много памяти, поэтому на тиньках корректно не работает.
Воспользуемся вторым способом.Будем выводить переменную посимвольно с помощью команды lcd_putchar('код символа в таблице ').Переходим от цифры к коду символа путем деления переменной с остатком на числа кратные 10 и прибавлением числа 48(для совпадения с табличным значением).В этой программе прописан вывод четырех символов, но можно изменить ее для любого другого числа.Недостаток метода-вместо чисел превышающих 9999 будут выводится левые знаки, но вряд ли что-то сможет крутиться с частотой 10 килогерц, да и датчик от принтера потянет максимум 1 килогерц, если верить даташиту.Если таймер переполнился но, счетчик еще не достиг 30, просто прибавляем к нему 1 и ждем следующего переполнения.
Вот и вся программа.Шьем МК и испытываем девайс в действии.
В таком оформлении выглядит не очень красиво, но работает.Можно будет сделать что-нибудь покрасивее, как сделаю, обязательно выложу фотки.
Окончательное оформление. Добавлены 2 конденсатора на питание, кнопка и светодиод(для экспериментов), а также разъем под программатор Громова.
Наконец, видео.В качестве демонстрационного полигона пришлось соорудить из подручных средств «вентилятор»:Еще испытал это изобретение на шуруповерте.Результат порадовал.Показал 4 оборота в секунду, производителем заявлено 250 об/мин.Из целых вариантов показаний 4 самый точный, который прибор мог вывести, т.к. 4*60=240, а 5*60 это уже 300 :).
В архиве: проект CVAVR под 8 мегагерц с исходниками, прошивка, схема(SPLAN), фьюзы для Attiny2313(8 мегагерц от встроенного тактового генератора).
Во втором архиве, на всякий случай, даташиты на дисплей и датчик.Мало ли что, может пригодятся…Читайте также: