Меню Закрыть

Счетчик оборотов на микроконтроллере

Счётчик на микроконтроллере довольно прост для повторения и собран на популярном МК PIC16F628A с выводом индикации на 4 семисегментных светодиодных индикатора. Счётчик имеет два входа управления: «+1» и «-1», а также кнопку «Reset». Управление схемой нового счётчика реализовано таким образом, что как бы долго или коротко не была нажата кнопка входа, счёт продолжится только при её отпускании и очередном нажатии. Максимальное количество поступивших импульсов и соответственно показания АЛС – 9999. При управлении на входе «-1» счёт ведётся в обратном порядке до значения 0000. Показания счётчика сохраняются в памяти контроллера и при отключении питания, что сохранит данные при случайных перебоях питающего напряжения сети.

Принципиальная схема реверсивного счётчика на микроконтроллере PIC16F628A:

Сброс показаний счётчика и одновременно состояния памяти в 0, осуществляется кнопкой «Reset». Следует помнить, что при первом включении реверсивного счётчика на микроконтроллере, на индикаторе АЛС может высветиться непредсказуемая информация. Но при первом же нажатии на любую из кнопок информация нормализируется. Где и как можно использовать эту схему – зависит от конкретных нужд, например установить в магазин или офис для подсчёта посетителей или как индикатор намоточного станка. В общем думаю, что этот счётчик на микроконтроллере кому-нибудь принесёт пользу.

Если у кого-то под рукой не окажется нужного индикатора АЛС, а будет какой-нибудь другой (или даже 4 отдельных одинаковых индикатора), я готов помочь перерисовать печатку и переделать прошивку. В архиве на форуме схема, плата и прошивки под индикаторы с общим анодом и общим катодом. Печатная плата показана на рисунке ниже:

Имеется также новая версия прошивки для счётчика на микроконтроллере PIC16F628A. при этом схема и плата счётчика остались прежними, но поменялось назначение кнопок: кнопка 1 – вход импульсов (например, от геркона), 2 кнопка включает счёт на вычитание входных импульсов, при этом на индикаторе светится самая левая точка, 3 кнопка – сложение импульсов – светится самая правая точка. Кнопка 4 – сброс. В таком варианте схему счётчика на микроконтроллере можно легко применить на намоточном станке. Только перед намоткой или отмоткой витков нужно сначала нажать кнопку "+" или "-". Питается счётчик от стабилизированного источника напряжением 5В и током 50мА. При необходимости можно питать от батареек. Корпус зависит от ваших вкусов и возможностей. Схему предоставил – Samopalkin

Обсудить статью СЧЁТЧИК НА МИКРОКОНТРОЛЛЕРЕ

Для тех, кто не знает, тахометр-прибор для измерения частоты вращения.В этой статье я расскажу, как сделать такой прибор на микроконтроллере AVR Attiny2313.Попутно мы разберем такие функции МК, как таймер/счетчик, прерывания по таймеру/счетчику, внешние прерывания и работа с LCD дисплеем и переменными.
Для начала оговорим принцип работы и необходимые для изготовления детали.Прежде всего, нужен собственно датчик, который будет считать обороты.Его я взял из старого принтера.Там он использовался для определения наличия бумаги.
Датчик работает так: внутри него находится оптопара, состоящая из инфракрасного светодиода и фоторезистора.Когда объект(желательно белого цвета для лучшего отражения) находится над оптопарой свет, излучаемый светодиодом, отражается от него и попадает на фототранзистор.Это то же самое, что и обычный транзистор, только база управляется не подаваемым на нее током, а светом.Следовательно транзистор открывается, передавая логическую единицу на МК.

Так выглядит датчик, который использовал я:

Транзистор нужно подключать к питанию с резистором 4,7кОм, можно взять другой номинал, но 4,7кОм оптимальный вариант по току:

Для того чтобы, мы могли считать информацию понадобится дисплей.У меня под руками был однострочный 16-символьный алфавитно-цифровой экземпляр.Для регулировки контрастности дисплея желательно прикрутить переменный резистор.Даташит моего дисплея(ROHM 2034R) гласит, что нужен резистор от 10 до 20 кОм, но традицию использовать не то, что надо, а то что есть никто не отменял, поэтому я откопал резистор от 0 до 33 кОм.Если не найдете нужный переменный резистор или просто не захотите его ставить, можно сделать простой делитель напряжения из двух резисторов.Контрастность у дисплея при этом регулироваться не будет, конечно.

На этом скромный список деталек заканчивается, приступаем к составлению схемы.
Дисплей подключается к микроконтроллеру так, как показано на схеме(в данном случае для порта В).

Аналогично для порта С:

Переменный резистор, как уже было сказано используется для регулировки контрастности, подключается к 3му выводу дисплея(обозначен, как LCD HEADER V0).
Схема вышла, в общем, несложная.В архиве выложу ее полностью в формате spl(SPLAN).

Читайте также:  Установка microsoft visual c 2015 зависает

Теперь время заняться прошивкой.
Любой проект с дисплеем начинается с того, что мы прописываем микроконтроллеру порт, на котором висит дисплей.Причем, это делается с тэгом #asm(тэг для ассемблерной команды).
Адрес конкретного порта ищем в библиотеке МК, которая валяется в папке с компилятором:

Подключаем 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 килогерц, если верить даташиту.

Читайте также:  Cpu quiet fan что это в биосе

Если таймер переполнился но, счетчик еще не достиг 30, просто прибавляем к нему 1 и ждем следующего переполнения.

Вот и вся программа.Шьем МК и испытываем девайс в действии.
В таком оформлении выглядит не очень красиво, но работает.Можно будет сделать что-нибудь покрасивее, как сделаю, обязательно выложу фотки.
Окончательное оформление. Добавлены 2 конденсатора на питание, кнопка и светодиод(для экспериментов), а также разъем под программатор Громова.


Наконец, видео.В качестве демонстрационного полигона пришлось соорудить из подручных средств «вентилятор»:

Еще испытал это изобретение на шуруповерте.Результат порадовал.Показал 4 оборота в секунду, производителем заявлено 250 об/мин.Из целых вариантов показаний 4 самый точный, который прибор мог вывести, т.к. 4*60=240, а 5*60 это уже 300 :).
В архиве: проект CVAVR под 8 мегагерц с исходниками, прошивка, схема(SPLAN), фьюзы для Attiny2313(8 мегагерц от встроенного тактового генератора).
Во втором архиве, на всякий случай, даташиты на дисплей и датчик.Мало ли что, может пригодятся…

Для тех, кто не знает, тахометр-прибор для измерения частоты вращения.В этой статье я расскажу, как сделать такой прибор на микроконтроллере AVR Attiny2313.Попутно мы разберем такие функции МК, как таймер/счетчик, прерывания по таймеру/счетчику, внешние прерывания и работа с LCD дисплеем и переменными.
Для начала оговорим принцип работы и необходимые для изготовления детали.Прежде всего, нужен собственно датчик, который будет считать обороты.Его я взял из старого принтера.Там он использовался для определения наличия бумаги.
Датчик работает так: внутри него находится оптопара, состоящая из инфракрасного светодиода и фоторезистора.Когда объект(желательно белого цвета для лучшего отражения) находится над оптопарой свет, излучаемый светодиодом, отражается от него и попадает на фототранзистор.Это то же самое, что и обычный транзистор, только база управляется не подаваемым на нее током, а светом.Следовательно транзистор открывается, передавая логическую единицу на МК.

Так выглядит датчик, который использовал я:

Транзистор нужно подключать к питанию с резистором 4,7кОм, можно взять другой номинал, но 4,7кОм оптимальный вариант по току:

Для того чтобы, мы могли считать информацию понадобится дисплей.У меня под руками был однострочный 16-символьный алфавитно-цифровой экземпляр.Для регулировки контрастности дисплея желательно прикрутить переменный резистор.Даташит моего дисплея(ROHM 2034R) гласит, что нужен резистор от 10 до 20 кОм, но традицию использовать не то, что надо, а то что есть никто не отменял, поэтому я откопал резистор от 0 до 33 кОм.Если не найдете нужный переменный резистор или просто не захотите его ставить, можно сделать простой делитель напряжения из двух резисторов.Контрастность у дисплея при этом регулироваться не будет, конечно.

На этом скромный список деталек заканчивается, приступаем к составлению схемы.
Дисплей подключается к микроконтроллеру так, как показано на схеме(в данном случае для порта В).

Аналогично для порта С:

Переменный резистор, как уже было сказано используется для регулировки контрастности, подключается к 3му выводу дисплея(обозначен, как LCD HEADER V0).
Схема вышла, в общем, несложная.В архиве выложу ее полностью в формате spl(SPLAN).

Теперь время заняться прошивкой.
Любой проект с дисплеем начинается с того, что мы прописываем микроконтроллеру порт, на котором висит дисплей.Причем, это делается с тэгом #asm(тэг для ассемблерной команды).
Адрес конкретного порта ищем в библиотеке МК, которая валяется в папке с компилятором:

Подключаем 2 необходимые библиотеки:

После подключения библиотек объявляем переменные.int-целые числа от -32768 до 32767.Для числа оборотов в секунду этого хватит.

Порт D настраиваем на ввод и ставим единицы по умолчанию на все его биты.

Инициализируем дисплей.В скобках пишем число символов в строке.

Дальше надо настроить таймер.Он примечателен тем, что тикает даже во время выполнения программы.В этом его главное отличие от обычной задержки(команды delay).Эта задержка полностью остановит МК, но в данном случае это недопустимо, так как прибор должен считать обороты без остановок.Тут и приходит на помощь таймер/счетчик.
Смысл программы такой: по внешнему прерыванию(от датчика) запускается цикл, в котором прибавляется единица к переменной rps.Таймер в это время продолжает тикать.Как только он доходит до 1 секунды, стартует другое прерывание по таймеру/счетчику.В нем переменная rps выводится на дисплей и обнуляется.Таким образом, частота обновления показаний 1 секунда.

Читайте также:  Monitor audio silver rs6

В 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 мегагерц от встроенного тактового генератора).
Во втором архиве, на всякий случай, даташиты на дисплей и датчик.Мало ли что, может пригодятся…

Рекомендуем к прочтению

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

code

Adblock detector