СЧЁТЧИК НА МИКРОКОНТРОЛЛЕРЕ
Счётчик на микроконтроллере довольно прост для повторения и собран на популярном МК PIC16F628A с выводом индикации на 4 семисегментных светодиодных индикатора. Счётчик имеет два входа управления: «+1» и «-1», а также кнопку «Reset». Управление схемой нового счётчика реализовано таким образом, что как бы долго или коротко не была нажата кнопка входа, счёт продолжится только при её отпускании и очередном нажатии. Максимальное количество поступивших импульсов и соответственно показания АЛС — 9999. При управлении на входе «-1» счёт ведётся в обратном порядке до значения 0000. Показания счётчика сохраняются в памяти контроллера и при отключении питания, что сохранит данные при случайных перебоях питающего напряжения сети.
Принципиальная схема реверсивного счётчика на микроконтроллере PIC16F628A:
Сброс показаний счётчика и одновременно состояния памяти в 0, осуществляется кнопкой «Reset». Следует помнить, что при первом включении реверсивного счётчика на микроконтроллере, на индикаторе АЛС может высветиться непредсказуемая информация. Но при первом же нажатии на любую из кнопок информация нормализируется. Где и как можно использовать эту схему — зависит от конкретных нужд, например установить в магазин или офис для подсчёта посетителей или как индикатор намоточного станка. В общем думаю, что этот счётчик на микроконтроллере кому-нибудь принесёт пользу.
Если у кого-то под рукой не окажется нужного индикатора АЛС, а будет какой-нибудь другой (или даже 4 отдельных одинаковых индикатора), я готов помочь перерисовать печатку и переделать прошивку. В архиве на форуме схема, плата и прошивки под индикаторы с общим анодом и общим катодом. Печатная плата показана на рисунке ниже:
Имеется также новая версия прошивки для счётчика на микроконтроллере PIC16F628A. при этом схема и плата счётчика остались прежними, но поменялось назначение кнопок: кнопка 1 — вход импульсов (например, от геркона), 2 кнопка включает счёт на вычитание входных импульсов, при этом на индикаторе светится самая левая точка, 3 кнопка — сложение импульсов — светится самая правая точка. Кнопка 4 — сброс. В таком варианте схему счётчика на микроконтроллере можно легко применить на намоточном станке. Только перед намоткой или отмоткой витков нужно сначала нажать кнопку «+» или «-«. Питается счётчик от стабилизированного источника напряжением 5В и током 50мА. При необходимости можно питать от батареек. Корпус зависит от ваших вкусов и возможностей. Схему предоставил — Samopalkin
Источник
Микроконтроллер с счетчиком импульсов
16-битный таймер-счетчик 1 (16-bit Timer/Counter1) микроконтроллера ATmega32A позволяет точно вычислять время выполнения программы (может использоваться для обработки событий, event management), генерации звука, измерения длительностей цифровых сигналов.
Упрощенная блочная диаграмма 16-bit Timer/Counter показана на рисунке. Для того, чтобы определить действительное назначение выводов, относящихся к счетчику, см. даташит микроконтроллера, в котором имеется разводка выводов кристалла (Pinout ATmega32A).
Пояснения к диаграмме: буква n в именах регистров и битов может быть заменена на цифру 0, 1 или 2, в зависимости от того, какой счетчик используется — в разных моделях микроконтроллеров AVR может быть разное количество счетчиков с разными номерами. В нашем примере будет использоваться 16-bit Timer/Counter1 микроконтроллера ATmega32A, поэтому n=1.
[Измерение длительности импульсов с помощью 16-bit Timer/Counter1]
Импульсы можно регистрировать аппаратно (и измерять их длительность), если подать цифровой сигнал на вывод ICP1. Регистрация импульсов в даташите Atmel также называется «захватом событий» (capture event) и «захватом по входу» (Input Capture). Отсюда понятна аббревиатура ICP1 — Input Capture Pin 1: ножка захвата, относящаяся к таймеру/счетчику 1.
Для микроконтроллера ATmega32A в корпусе TQFP44 ножкой ICP1 будет порт PD6, ножка 15 корпуса TQFP44, у макетной платы AVR-USB-MEGA16 [2] это будет контакт P21.
Для измерения длительности импульсов нужно сделать следующее:
— Настроить тактирование таймера 1 от внутреннего тактового генератора.
— Создать обработчик прерывания для события захвата (Timer/Counter1 Input Capture Interrupt) и разрешить прерывание по событию захвата.
— Разрешить работу узла захвата по входу ICP1.
Настройка тактирования таймера и разрешение работы узла захвата производится записью в соответствующие регистры (см. раздел «Регистры 16-bit Timer/Counter 1»). В обработчике прерывания Input Capture нужно сохранить или проанализировать значение счетчика, чтобы по нему определить длительность входного импульса.
[Подсчет импульсов с помощью 16-bit Timer/Counter1]
Импульсы можно считать аппаратно, если подать цифровой сигнал на вывод T1. У микроконтроллера ATmega32A это порт PB1, ножка 41 корпуса TQFP44, контакт P9 макетной платы AVR-USB-MEGA16.
Чтобы подсчитывать импульсы, нужно сделать следующее:
— Настроить тактирование таймера/счетчика 1 от входа T1.
— Настроить обработчик прерывания по переполнению таймера/счетчика (Timer/Counter1 Overflow Interrupt).
— Организовать в программе анализ и сброс значения таймера/счетчика 1.
Обычно подсчет импульсов нужен для измерения частоты некоторого цифрового сигнала. В этом случае нужно анализировать и сбрасывать значение таймера/счетчика через равные, заранее определенные интервалы времени. Если произошло переполнение (когда сработало прерывание по переполнению) до истечения интервала времени, то значит входная частота на T1 слишком высокая и для измерения частоты нужно либо подсчитывать переполнения, либо уменьшить интервал времени опроса таймера/счетчика.
Пример измерения частоты на входе T1
[Регистры 16-bit Timer/Counter 1]
Для измерения длительностей и подсчета импульсов нам потребуются следующие регистры (остальные регистры типа TCCR1A, OCR1AH, OCR1AL, OCR1BH, OCR1BL за ненадобностью здесь не рассматриваются, подробное описание всех регистров см. в даташите).
TCCR1B – Timer/Counter1 Control Register B
• Bit 7 – ICNC1: Input Capture Noise Canceler. Установка этого бита в лог. 1 активирует входной подавитель шума, при этом будет фильтроваться входной сигнал Input Capture Pin (ICP1). Функция фильтрации требует 4 последовательных одинаковых значений, поступивших на вывод ICP1, чтобы было зарегистрировано изменение уровня сигнала. Таким образом, захват входных импульсов (Input Capture) будет задержан на 4 такта генератора микроконтроллера, когда возможность фильтрации разрешена.
• Bit 6 – ICES1: Input Capture Edge Select. Этот бит выбирает тип среза (фронт или спад) на входе ICP1, который вызовет событие захвата импульса. Когда в ICES1 записан лог. 0, то спад (отрицательный срез) вызовет срабатывание триггера, и когда в ICES1 записан лог. 1, срабатывание триггера вызовет уже фронт (положительный срез) сигнала.
Когда срабатывает триггер захвата события по входу в соответствии с установкой ICES1, значение счетчика (TCNT1, регистры TCNT1H и TCNT1L) копируется в регистр захвата Input Capture Register (ICR1). Событие также вызовет установку флага Input Capture Flag (ICF1), и это может использоваться для срабатывания прерывания Input Capture Interrupt, если оно разрешено.
• Bit 2:0 – CS12:10: Clock Select. Эти 3 бита задают источник тактового сигнала для счетчика.
CS12 | CS11 | CS10 | Описание |
0 | 0 | 0 | Источник тактов не задан (таймер/счетчик остановлен). |
0 | 0 | 1 | clkI/O (без делителя частоты) |
0 | 1 | 0 | clkI/O / 8 (с выхода делителя) |
0 | 1 | 1 | clkI/O / 64 (с выхода делителя) |
1 | 0 | 0 | clkI/O / 256 (с выхода делителя) |
1 | 0 | 1 | clkI/O / 1024 (с выхода делителя) |
1 | 1 | 0 | Внешний тактовый сигнал, поданный на вход T1. Тактирование происходит по срезу (спаду) уровня сигнала. |
1 | 1 | 1 | Внешний тактовый сигнал, поданный на вход T1. Тактирование происходит по фронту (нарастанию) уровня сигнала. |
Для подсчета импульсов на входе T1 можно выбрать последние 2 варианта в таблице. Если для подсчета выбрана ножка T1, Импульсы будут подсчитываться даже тогда, когда порт T1 настроен как выход. Эта возможность позволяет программно управлять счетом.
ICR1H и ICR1L – Input Capture Register 1
Эти два регистра составляют 16-битный регистр ICR1. Событие захвата по входу (Input Capture, на выводе ICP1 или опционально на выходе аналогового компаратора) вызывает обновление содержимого ICR1 содержимым счетчика (TCNT1). Регистр ICP1 16-битный, поэтому к нему также применяется правило атомарного доступа, как и к другим 16-битным регистрам (см. [1]).
Когда ICR1 используется как значение TOP (см. описание битов WGM13:0, размещенных в регистрах TCCR1A и TCCR1B), вывод ICP1 будет отключен, и следовательно функция захвата Input Capture будет запрещена.
TCNT1H и TCNT1L – Timer/Counter1
Эти два регистра, размещенные в пространстве I/O, совместно образуют 16-битный регистр TCNT1, и предоставляют прямой доступ к содержимому счетчика. Для того, чтобы удостовериться в том, что старший и младший байты будут прочитаны одновременно при доступе CPU к этим регистрам, доступ выполняется с использованием временного 8-битного регистра для старшего байта, High Byte Register (TEMP). Этот регистр является общим для доступа ко всем 16-битным регистрам таймера (подробнее см. [1]).
TIMSK – Timer/Counter Interrupt Mask Register
• Bit 5 – TICIE1: Timer/Counter1, Input Capture Interrupt Enable. Когда этот бит установлен в 1, и установлен флаг I в регистре статуса SREG (прерывания разрешены глобально), то разрешено прерывание захвата таймера/счетчика 1 (Timer/Counter1 Input Capture Interrupt). При срабатывании прерывания (когда произошло событие захвата и установился флаг ICF1 в регистре TIFR) будет вызвана подпрограмма обработчика по соответствующему вектору (см. раздел «Interrupts» даташита).
• Bit 2 – TOIE1: Timer/Counter1, Overflow Interrupt Enable. Когда этот бит установлен в 1, и установлен флаг I в регистре статуса SREG (прерывания разрешены глобально), то разрешено прерывание переполнения таймера/счетчика 1 (Timer/Counter1 Overflow Interrupt). При срабатывании прерывания (когда произошло переполнение и установился флаг TOV1 в регистре TIFR) будет вызвана подпрограмма обработчика по соответствующему вектору (см. раздел «Interrupts» даташита).
TIFR – Timer/Counter Interrupt Flag Register
Примечание: TIFR содержит биты, относящиеся к нескольким таймерам/счетчикам (не только к Timer/Counter1), но здесь рассмотрены только те биты, которые нас интересуют — ICF1 и TOV1.
• Bit 5 – ICF1: Timer/Counter1, Input Capture Flag. Этот флаг устанавливается, когда произошло событие захвата на выводе ICP1. ICF1 автоматически очищается, когда вызывается обработчик прерывания по вектору Input Capture Interrupt. Альтернативно ICF1 может быть очищен записью в этот бит лог. 1.
• Bit 2 – TOV1: Timer/Counter1, Overflow Flag. Установка этого флага зависит от установки битов WGM13:10. В режимах нормального счета и при очистке таймера на сравнении (Clear Timer on Compare, CTC) флаг TOV1 будет установлен, когда таймер переполнится. Обратитесь к таблице «Waveform Generation Mode Bit Description» для определения поведения флага TOV1 в других режимах установки бит WGM13:10. TOV1 автоматически очищается, когда вызывается обработчик прерывания по вектору Input Capture Interrupt. Альтернативно TOV1 может быть очищен записью в этот бит лог. 1.
Источник
Контроллер температуры и влажности, счетчик импульсов с протоколом MODBUS
При разработке устройств промышленной электроники или систем «умный дом» приходится сталкиваться с необходимостью передачи данных на большие расстояния (более 100 метров) в условиях довольно сильных индустриальных помех. Стандарт RS-232 не позволяет в таких условиях обеспечить безошибочную передачу данных, поэтому в качестве физической среды передачи данных используют линии типа «витая пара» по стандарту RS-485. В качестве же протокола передачи данных часто используют протокол MODBUS. Как оказалось в интернете довольно мало информации в этой области. Этой статьей я попробую хоть немного восполнить этот пробел.
У многих интерфейс RS-485 ассоциируется сразу с чем-то промышленным, далеким от любительской электроники. А при слове MODBUS — почти все говорят что это и есть RS-485. На самом деле это совершенно разные области передачи данных. Протокол RS-485 описывает физическую среду передачи данных, то есть провода, их взаимное расположение, уровни сигналов и прочее, прочее, прочее. MODBUS описывает формат передачи данных, то есть логически законченный кадр (фрейм), содержащий в себе как сами данные в определенном порядке, так и информацию о отправителе/получателе, выполненной операции и контрольную сумму для контроля подлинности данных. Сама же среда передачи данных может быть любая (провода, радиоволны, интернет-пакеты и прочее). Если провести аналогию, к примеру, с доставкой посылки от отправителя к получателю, то RS-485 — это дороги (автомобильные, морские, воздушные), а MODBUS — это накладная к грузу, где указаны все содержимое посылки, данные о отправителе/получателе и контрольный вес посылки и печати для подтверждения подлинности посылки.
Реализовать физическую линию передачи данных RS-485 даже проще, чем RS-232. Для этого достаточно использовать микросхему MAX485 и два простых скрученных провода. И это обеспечивает дальность связи свыше 1 км. Для RS-232 необходим преобразователь уровня MAX232 с 4-мя конденсаторами и, желательно экранированная, линия связи с тремя проводами. При этом дальность связи редко превышает 20 метров и должны быть выполнены условия по заземлению и выравниванию потенциалов соединенных устройств.
В данной статье приводится описание упрощенного контроллера, способного отображать на индивидуальном LCD-дисплее температуру и влажность, а также вести подсчет количества поступивших импульсов. Данные с контроллера поступают на центральный управляющий блок по протоколу MODBUS. При минимальной доработке возможно применение данного контроллера для самостоятельного управления электронагревателями и увлажнителями, что позволяет получить автономный контроллер, способный не только контролировать, но и поддерживать заданные параметры.
Для отладки контроллера и работы с компьютером использовался переходник RS-232 RS-485. В принципе эта схема аналогична многим другим, но мне она попалась первой. Переходник собран на односторонней печатной плате, питание осуществляется от блока зарядки для сотового телефона. Поскольку блок зарядки выдает 5,5 Вольт, то оказалось возможным отказаться от установки стабилизатора 78L05, хотя место для него на плате предусмотрено, и вместо него установлена перемычка.
Вид со стороны печатной платы.
Файл печатной платы в формате Sptint-Layout прилагается (файл RS232-485). При работе с данным переходником выяснилось, что переходник отлично работает с физическими COM-портами (грубо говоря — это те, которые встроены на материнской плате), но не работает с адаптером USB-COM на чипе ProLific PL-2003 (В очередной раз получил подтверждение, что для электронщика нужны старые компьютеры, которые приходится дома держать для этих целей).
Для работы с протоколом MODBUS на компьютере был установлен OPC-сервер. В комплекте к данному серверу идет утилита просмотра MODBUS-регистров, которой удобно пользоваться в процессе отладки. Ну и не забываем про терминал. Лично я использовал программу RH_Com — терминал. (Хотя терминал мне понадобился в расширенной версии данного контроллера).
На этом вводную часть заканчиваем и переходим к самому контроллеру и описанию его работы. Схема, как и большинство схема на микроконтроллерах, содержит минимум деталей. Поэтому, а также ввиду отсутствия в PROTEUS модели датчика DHT-11, отдельно принципиальную схему не рисовал. На печатной плате имеются указания на используемые элементы и номиналы резисторов, а конденсаторы ставятся максимально большей емкости из имеющихся. За основу взят микроконтроллер ATTiny2313. Датчик температуры и влажности типа DHT11 подсоединен непосредственно к микроконтроллеру. Для его нормальной работы необходимо только установить подтягивающий резистор (10 кОм) к питанию, поскольку внутреннего подтягивающего резистора микроконтроллера не хватит. Дисплей через разъем также напрямую подсоединен к выводам МК.
Микросхема MAX-485 подсоединена к выводам RX и TX микроконтроллера и дополнительно задействован еще один вывод 4 для переключения режима прием-передача. Можно было-бы и не использовать этот вывод и сделать автоматическое определение направления передачи, как это реализовано в адаптере RS-232 RS-485, но выводов и памяти у МК хватает, так зачем добру пропадать.
Вся схема размещена на плате 40*50 мм. Питание схемы осуществляется от зарядки для сотового телефона через стабилизатор 7805, также размещенном на плате. Правда пришлось подыскать зарядку, выдающую напряжение порядка 7 Вольт.
А вот такую информацию мы видим на табло в работе:
Программа для микроконтроллера написана на BASCOM-AVR. Программа подробно комментирована и, думаю, при желании в ней легко можно разобраться.
При работе совместно с устройством MASTER, в качестве которого может выступать компьютер с установленным на нем OPC-сервером, контроллер при получении запроса со своим номером SLAVE обрабатывает полученную команду и, если в команде указан код выполняемой функции «3» и совпадает контрольная сумма посылки, в ответ контроллер посылает последовательность данных о температуре, влажности и количества импульсов. На компьютере в этом случае отображается следующее:
Также данный контроллер можно прописать и в другом сервере, например AggreGate. (Показания на рисунках немного отличаться, поскольку снимки с LCD и экрана монитора делались в разное время.)
Особо следует отметить, что поскольку используется включение микроконтроллера на работу с внутренним осциллятором, то не все экземпляры микроконтроллера обеспечивают бесперебойной работу при передаче данных по MODBUS (компьютер определяет ошибку контрольной суммы). У меня из 6 микроконтроллеров 3 работали стабильно в комнатных условиях, один начинал давать сбои (ошибка контрольной суммы) примерно через 10 минут работы, а два других сразу передавали данные с ошибкой. Возможно это связано с частотой и стабильностью внутреннего осциллятора. Поэтому желательно использование микроконтроллера либо с внешним кварцем, либо произвести подбор микроконтроллера.
В архиве DHT-11+Impuls.rar расположены: печатная плата в формате Sprint Layout 5, HEX файл для прошивки МК, исходный код в среде BASCOM-AVR. При программировании МК надо выставить fuse-биты следующим образом:
Т.е. на работу от внутреннего тактового генератора на 8 МГц.
Источник