Как сделать счетчик импульсов своими руками. Счётчики электрических импульсов

видео работы устройства

Схема собрана на микроконтроллере PIC16F628A. Она может считать входные импульсы от 0 до 9999. Импульсы поступают на линию порта RA3 (кнопка SA1 активный уровень низкий). С каждым импульсом показания индикатора меняются на +1. После 999 импульса на индикаторе высвечивается 0 и загорается точка начала второй тысячи (правая по схеме) и т. д. Так счёт может продолжаться до значения 9999. После этого счёт останавливается. Кнопка SA3 (линия порта RА1) служит для сброса показаний в 0.

Схема счётчика импульсов с памятью на микроконтроллере

Изначально схема была изготовлена для работы с питанием от трёх пальчиковых батарей. Поэтому с целью экономии энергии в схему включена кнопка включения индикации для контроля состояния счётчика SA2 (линия порта RA4). Если в этой кнопке нет необходимости, её контакты можно закоротить. В схеме можно использовать подтягивающие резисторы в пределах от 1к до 10к. Биты конфигурации INTRC I/O и PWRTE установлены. При отключении питания показания счётчика в памяти контроллера сохраняются. При погашенном индикаторе схема остаётся работоспособной при снижении питания до 3,5 вольт. Практика показала, что заряда батареек хватает почти на неделю непрерывной работы схемы.


Печатная плата счётчика


Фото счетчика

Схема, прошивка МК и печатная плата в формате S-layuout в архиве (15кб) .

От администратора . Резисторы R1-R3 можно выбрать номиналом до 10К.

СЧЁТЧИК НА МИКРОКОНТРОЛЛЕРЕ

Во многих устройствах техники и автоматики всё ещё установлены механические счетчики. Они считают количество посетителей, продукцию на конвейере, витки провода в намоточных станках и так далее. В случае выхода из строя найти такой механический счетчик непросто, а отремонтировать невозможно ввиду отсутствия запчастей. Предлагаю заменить механический счетчик электронным с использованием микроконтроллера PIC16F628A.

Электронный счетчик получается слишком сложным, если строить его на микросхемах серий К176, К561. особенно если необходим реверсивный счет. Но можно построить счетчик всего на одной микросхеме — универсальном микроконтроллере PIC16F628A, имеющем в своем составе разнообразные периферийные устройства и способном решать широкий круг задач.

Вот и недавно меня попросил человек сделать счётчик импульсов на много разрядов. Я отказался от светодиодных индикаторов, так как они занимают много места и потребляют немало энергии. Поэтому реализовал схему на LCD. Счётчик на микроконтроллере может замерять входные импульсы до 15 знаков разрядности. Два первых разряда отделены точкой. EEPROM не использовалась, потому что не было необходимости запоминать состояние счётчика. Так-же имеется функция обратного счёта - реверса. Принципиальная схема простого счетчика на микроконтроллере:

Счетчик собран на двух печатных платах из фольгированного стеклотекстолита. Чертёж приведён на рисунке.

На одной из плат установлены индикатор LCD, на другой — 4 кнопки, контроллер и остальные детали счетчика, за исключением блока питания. Скачать платы и схему счётчика в формате Lay, а так-же прошивку микроконтроллера можно на форуме. Материал предоставил Samopalkin.

Часто при работе микроконтроллерного устройства есть необходимость отсчитывать «антропоморфное» время – сколько долей секунды светиться светодиоду, максимальный промежуток времени double-click и т. д. В общем, отсчитывать не только нано- и микросекунды, но и десятки миллисекунд, а то и секунды, минуты и даже часы (боюсь сказать о сутках…).
В то же время в микроконтроллерах нередко нужно одновременно с этим иметь дело с микросекундами – периоды импульсов, антидребезговое ожидание и т. п.
Есть также устройства, которые работают непрерывно многие часы и даже сутки – авиационная техника, автомобильная, скважинные устройства (там речь идет иной раз о непрерывной работе несколько дней). В этих случаях недопустимо переполнение таймеров и 8-битных переменных.
Хотелось бы это все объединить в одно изящное и универсальное решение – иметь средство измерения времени с точностью до микросекунды, не переполняющееся несколько дней.
Почему бы и нет? Помучился я некоторое время и родил решение для 8-битных микроконтроллеров AVR. Для этого я задействовал 8-битный таймер-счетчик и 4х-байтную переменную. С PIC-ами и AT89 я сейчас не работаю, а с другими embedded-платформами не дружу. Впрочем, если читатели помогут – сделаю и для них.
Достоинства – код в высшей степени повторяемый (я уже 5-ое устройство с ним делаю); простота в работе (не используются прерывания для клиентской части работы); клиентская часть кода условно платформенно-независимая; в прерывании – одна операция суммирования (но, правда, для 4-хбайтной величины); нет внешнего устройства - таймера реального времени.
Недостаток я нашел один – занят один такой полезный и всегда нужный таймер…
Статья будет интересна в первую очередь начинающим - Америку я тут не открыл.

Теория

Итак, я имею в своем распоряжении устройство на основе Atmega16A с кварцем 12MHz. Берем его таймер-счетчик 0. Это восьмиразрядный таймер – нам и хватит. Почему? Считаем:
  1. берем 12 MHz от кварца и берем коэффициент деления на 8 – получаем частоту 1500 KHz;
  2. берем режим CTC (сброс при совпадении) и ставим прерывание на совпадение с 150 – получаем частоту срабатывания прерывания 10 KHz;
  3. на этом самом прерывании инкрементируем переменную (получается инкремент каждые 0.1 миллисекунды);
  4. если это беззнаковая 32х-битная величина, то она переполнится приблизительно после
    • 429496729.6 миллисекунд;
    • 42949.7 секунд;
    • 7158.3 минут;
    • 119.3 часов;
    • 4.97 суток.
Другими словами, такое решение мне создает таймер с точностью до 0.1 миллисекунды на (почти) 5 суток (надо тут, правда, учитывать, что реальные кварцы имеют погрешность - об это далее). А если еще анализировать значение собственно таймера 0 – он инкрементируется каждые 2/3 микросекунды – то можно получит счетчик с точностью до 0.67 микросекунды.
Хватит? Мне – за глаза. Используя счетчик по 0.1 миллисекунды, я в своих проектах:
  • считаю длительности свечения и пауз между ними светодиодов;
  • учитываю timeouts при работе с UART, USB;
  • задаю всевозможные ситуации в тестовом оборудовании – сложные пространственно-временнЫе комбинации;
  • выдерживаю заданные промежутки времени при опросе АЦП и прочих датчиков;
  • сообщаю компьютеру время своей (устройства) работы и с заданным интервалом времени передаю информацию;
  • с учетом счетчика до микросекунды я осуществляю антидребезговый контроль при нажатии клавиш, анализ импульсов в протяженных линиях.
И все это спокойно влазит В ОДИН КОНТРОЛЛЕР ATmega16! Причем это не Ассемблер, а межплатформенный Си! И никакого внешнего счетчика реального времени!
Неплохо, да?

Настройка для AVR

Как это все сделать в AVR?
Прежде всего, заводим внешнюю переменную, которую я называю «ДециМиллиСекунда»:
// в main.h typedef unsigned long dword; // беззнаковое 32х-битное целое extern volatile dword dmsec; // 0.1msec // в main.c volatile dword dmsec;
Как верно подметил @no-smoking, эта переменная должна быть volatile, чтобы ее компилятор не попытался оптимизировать.
Инициализацию этой переменной я делаю в функции:
dmsec = 0;
Далее я задаю режим работы таймера 0:
// . таймер 0 – 0.1msec Timer0_Mode (TIMER_Mode_CTC | TIMER0_Clk_8); Timer0_Cntr (149); Timer_Int (Timer0_Cmp);
При этом в каком-нибудь MCU_init.h объявляю все, что надо:
// в mcu_init.h #include // . TIMSK #define Timer0_Cmp (1 << 1) // совпадение таймера 0 // . TCCRn #define WGM1 (1 << 3) #define CS1 (1 << 1) // . источник сигнала для таймера 0 #define TIMER0_Clk_8 CS1 // предделитель 8 // . режим работы таймера #define TIMER_Mode_CTC WGM1 // CTC (сброс при совпадении) // . настройка таймера #define Timer_Int(Mode) TIMSK = (Mode) #define Timer0_Mode(Mode) TCCR0 = (Mode) #define Timer0_Cntr(Cntr) OCR0 = (Cntr)
Ну и далее, когда можно, разрешаю прерывания:
#asm ("SEI")
Осталось описать прерывание. Это проще, чем все предыдущее:
#include interrupt Timer0_Compare (void) { ++dmsec; }
Все, таймер описан, настроен и запущен!

Настройка для PIC

Вот что мне подсказали уважаемые PICоманы:

На пиках это легко повторяется при помощи модуля Timer2. Именно в нем есть аналогичная функция прерывания по совпадению.

PR2 = 75 - значение, при котором таймер обнулится и сгенерирует прерывание
T2CON.T2CKPS = 2 - прескалер 1:16
T2CON.T2OUTPS = 0 - без постскалера
T2CON.TMR2ON = on - таймер включен

IPR1.TMR2IP = 1 --высокоприоритетное прерывание
PIR1.TMR2IF = off --сбрасываем флаг прерывания
PIE1.TMR2IE = on --включаем прерывание по совпадению TMR2 и PR2
INTCON.GIE = on --включаем обработку прерываний

Как видно, прескалер тут в 2 раза больше, потому PR2 в 2 раза меньше.
Данные настройки будут генерировать прерывания с частотой 10 kHz при системной частоте в 48 MHz (на таймер идет Fosc/4) - стандартная частота для USB Full Speed.

Использование

Код для клиента этого таймера получается кросс-платформенным (если не считать обращения к значению таймера 0 в AVR).
Вот фрагмент кода обмена по USB:
#include "main.h" // тут переменная dmsec, next_USB_timeout #include "FT245R.h" // тут функции работы с модулем USB #include "..\Protocol.h" // тут протокол обмена микроконтроллер - компьютер // ** // ** Анализ пакетов по USB // ** void AnalyzeUSB (void) { #define RECEIVE_BYTE(B) while (!FT245R_IsToRead)\ { if (dmsec > end_analyze) return; }\ B = FT245_ReadByte (); #define RECEIVE_WORD(W) // аналогично для 2х байт #define RECEIVE_DWORD(W) // аналогично для 4х байт dword end_analyze, d; NewAnalyze: if (!FT245R_IsToRead) // нет пакетов? return; end_analyze = dmsec + max_USB_timeout; // timeout для текущего анализа next_USB_timeout = dmsec + MaxSilence_PC_DEV; // timeout для общего обмена RECEIVE_BYTE (b) // заголовок пакета switch (b) { case SetFullState: RECEIVE_DWORD (d); // читаем слово is_initialized = 1; // обрабатываем ChangeIndicator (); break; } // switch (pack) goto NewAnalyze; #undef RECEIVE_BYTE // отменяем #define #undef RECEIVE_WORD #undef RECEIVE_DWORD }
Макрофункции RECEIVE_BYTE, RECEIVE_WORD, RECEIVE_DWORD реализуют процедуры чтения с учетом timeout для данной фазы обмена. В итоге, если чего зависло на другой стороне, то микроконтроллер не впадет в «спячку». Обратите внимание – WatchDog не понадобился! И все благодаря переменной/константе max_USB_timeout, которая задает timeout с точностью до 0.1 миллисекунды.
Точно также реализуется анализ «тишины в эфире» переменной next_USB_timeout. Это позволяет микроконтроллеру 1) узнать, что компьютер куда-то исчез, 2) как-то об этом сигнализировать (в моем случае загорается светодиод «ошибка»). Константа/переменная MaxSilence_PC_DEV позволяет варьировать понятие «тишины» в широчайших пределах – от доли миллисекунды до нескольких суток.
Аналогично реализуются все остальные моменты.
Если же вам нужно использовать счетчик микросекунд, то там появляется функция сравнения:
#define GetUSec(A,B) { #asm ("CLI"); A = dmsec; B = TCNT0; #asm ("SEI"); } // ** // ** Разница во времени между событиями с точностью до 2/3usec // ** dword Difference (dword prev_dmsec, byte prev_usec) { dword cur_dmsec; byte cur_usec; dword dif; // . засекаем текущее время GetUSec (cur_dmsec, cur_usec); // вычисляем разницу dif = cur_dmsec - prev_dmsec; dif <<= 8; if (cur_usec < prev_usec) dif += 255 + (dword) cur_usec - prev_usec; else dif += cur_usec - prev_usec; return dif; }
Функции передается предыдущий момент времени – предыдущее значение dmsec и таймера 0.
Вначале мы макросом GetUSec останавливаем прерывания, чтобы в момент копирования не испортилось значение dmsec и счетчика. И копируем текущее время.
Далее мы приводим разницу во времени к формату 2/3 микросекунды с учетом переполнения.
Ну и возвращаем это время.
А далее мы это используем в обычном if для контроля антидребезга и прочих мероприятий. Только не забудьте также приостановить прерывания при засекании текущего момента времени – а лучше используйте макрос GetUSec.

Результаты

Этот таймер оказался для меня в высшей степени удобным решением. Думаю, он и вам пригодится. А применил я его в следующих своих проектах:
  • Коммутатор фехтовальных ситуаций . Это здоровенная плата пол на пол метра с тремя контроллерами - ATmega128 как центральный и ATmega64 как два вспомогательных (правая и левая стороны). Между тремя контроллерами и их компонентами нет гальванической связи - питание на основе ионисторов, связь через опторазвязки. Центральный контроллер заряжает группы одних ионисторов и питает в это время обе стороны от других ионисторов. Тут пришлось сделать многоступенчатый алгоритм коммутации всего этого с тем, чтобы минимизировать взаимосвязь. В частности, речь идет о слаженной работе 8 реле - тут работают таймеры на 3.3мсек (гарантированное время срабатывания реле). Ну и, собственно, обе стороны управляют 10 реле и еше с пол сотни мультиплексоров. Все это хозяйство работает с четко заданными временнЫми характеристиками (с точностью до 1 мсек, максимальные длительности - 6 секунд). Ну и, в конце концов, банальные timeout для USB, UART.
  • Датчик глубины . Здесь я решаю другую задачу (проект в работе). Имеются два проводника (многометровые), задающие ситуацию «сдвиг вверх на 1 см» и «сдвиг вниз на 1 см». Способов задания направления множество. В любом случае это определенные комбинации импульсов. С помощью этого таймера я определяю дребезг, длительность устойчивого импульса. С компьютера задается максимально допустимое время дребезга (10 микросекунд тут хватает), антидребезговое ожидание, минимальная/максимальная длительность импульса. Ну и есть режим отладки - датчик становится логическим анализатором. Это позволяет отлаживать работу линии и корректировать коэффициенты. Ну и опять же timeout, светодиоды.
  • Датчик аналоговых сигналов . Банальное 8-ми канальный АЦП. Здесь я использую таймер для выдерживания необходимых пауз.
Уважаемые хабрапользователи с других платформ могут мне подсказать код инициализации соответствующего таймера, а также правила доступа к нему - я это тут добавлю. Возможно, что для других платформ будет необходимо подобрать другие времена. Но в любом случае это должно быть нечто в пределах нескольких единиц микросекунд для самого таймера и нечто кратное 100 микросекунд для переменной-счетчика. Ибо, как оказалось, иногда одной миллисекунды не хватает.

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

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

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

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

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

Принцип действия

В качестве исходного состояния принят нулевой уровень на всех выходах триггеров (Q 1 – Q 3), т. е. цифровой код 000. При этом старшим разрядом является выход Q 3 . Для перевода всех триггеров в нулевое состояние входы R триггеров объединены и на них подается необходимый уровень напряжения (т. е. импульс, обнуляющий триггеры). По сути это сброс. На вход С поступают тактовые импульсы, которые увеличивают цифровой код на единицу, т. е. после прихода первого импульса первый триггер переключается в состояние 1 (код 001), после прихода второго импульса второй триггер переключается в состояние 1, а первый – в состояние 0 (код 010), потом третий и т. д. В результате подобное устройство может досчитать до 7 (код 111), поскольку 2 3 – 1 = 7. Когда на всех выходах триггеров установились единицы, говорят, что счетчик переполнен. После прихода следующего (девятого) импульса счетчик обнулится и начнется все с начала. На графиках изменение состояний триггеров происходит с некоторой задержкой t з. На третьем разряде задержка уже утроенная. Увеличивающаяся с увеличением числа разрядов задержка является недостатком счетчиков с последовательным переносом, что, несмотря на простоту, ограничивает их применение в устройствах с небольшим числом разрядов.

Классификация счётчиков

Счетчиками называют устройства для подсчёта числа поступивших на их вход импульсов (команд), запоминания и хранения результата счёта и выдачи этого результата. Основным параметром счётчика является модуль счёта(емкость) Kс. Эта величина равна числу устойчивых состояний счётчика. После поступления импульсов Kс счётчик возвращается в исходное состояние. Для двоичных счётчиков Kс = 2 m, где m – число разрядов счётчика.

Кроме Kс важными характеристиками счётчика являются максимальная частота счёта fmax и время установления tуст, которые характеризуют быстродействие счётчика.

Tуст – длительность переходного процесса переключения счётчика в новое состояние: tуст = mtтр, где m – число разрядов, а tтр – время переключения триггера.

Fmax – максимальная частота входных импульсов, при которой не происходит потери импульсов.

По типу функционирования:

– Суммирующие;

– Вычитающие;

– Реверсивные.

В суммирующем счётчике приход каждого входного импульса увеличивает результат счёта на единицу, в вычитающем – уменьшает на единицу; в реверсивных счётчиках может происходить как суммирование, так и вычитание.

По структурной организации:

– последовательными;

– параллельными;

– последовательно-параллельными.

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

В параллельном счётчике с приходом очередного счётного импульса переключение триггеров при переходе в новое состояние происходит одновременно.

Последовательно-параллельная схема включает в себя оба предыдущих варианта.

По порядку изменения состояний:

– с естественным порядком счёта;

– с произвольным порядком счёта.

По модулю счёта:

– двоичные;

– недвоичные.

Модуль счёта двоичного счётчика Kc=2, а модуль счёта недвоичного счётчика Kc= 2m, где m – число разрядов счётчика.

Суммирующий последовательный счётчик

Рис.1. Суммирующий последовательный 3х разрядный счётчик.

Триггеры данного счетчика срабатывают по заднему фронту счетного импульса. Вход старшего разряда счетчика связан с прямым выходом (Q) младшего соседнего разряда. Временная диаграмма работы такого счетчика приведена на рис.2. В начальный момент времени состояния всех триггеров равны лог.0, соответственно на их прямых выходах лог.0. Это достигается посредством кратковременного лог.0, поданного на входы асинхронной установки триггеров в лог.0. Общее состояние счетчика можно охарактеризовать двоичным числом (000). Во время счёта на входах асинхронной установки триггеров в лог.1 поддерживается лог.1. После прихода заднего фронта первого импульса 0-разряд переключается в противоположное состояние – лог.1. На входе 1-разряда появляется передний фронт счетного импульса. Состояние счетчика (001). После прихода на вход счетчика заднего фронта второго импульса 0-разряд переключается в противоположное состояние – лог.0, на входе 1-разряда появляется задний фронт счетного импульса, который переключает 1-разряд в лог.1. Общее состояние счетчика – (010). Следующий задний фронт на входе 0-разряда установит его в лог.1 (011) и т.д. Таким образом, счетчик накапливает число входных импульсов, поступающих на его вход. При поступлении 8-ми импульсов на его вход счетчик возвращается в исходное состояние (000), значит коэффициент счета (КСЧ) данного счетчика равен 8.

Рис. 2. Временная диаграмма последовательного суммирующего счетчика.

Вычитающий последовательный счётчик

Триггеры данного счетчика срабатывают по заднему фронту. Для реализации операции вычитания счетный вход старшего разряда подключается к инверсному выходу соседнего младшего разряда. Предварительно триггеры устанавливают в состояние лог.1 (111). Работу данного счетчика показывает временная диаграмма на рис. 4.

Рис. 1 Последовательный вычитающий счетчик

Рис. 2 Временная диаграмма последовательного вычитающего счетчика

Реверсивный последовательный счётчик

Для реализации реверсивного счетчика необходимо объединить функции суммирующего счетчика и функции вычитающего счетчика. Схема данного счетчика приведена на рис. 5. Для управления режимом счета служат сигналы «сумма» и «разность». Для режима суммирования «сумма»=лог.1, «0»-кратковременный лог.0; «разность»=лог.0, «1»-кратковременный лог.0. При этом элементы DD4.1 и DD4.3 разрешают подачу на тактовые входы триггеров DD1.2, DD2.1 через элементы DD5.1 и DD5.2 сигналов с прямых выходов триггеров DD1.1, DD1.2 соответственно. При этом элементы DD4.2 и DD4.4 закрыты, на их выходах присутствует лог.0, поэтому действие инверсных выходов никак не отражается на счетных входах триггеров DD1.2, DD2.1. Таким образом, реализуется операция суммирования. Для реализации операции вычитания на вход «сумма» подается лог.0, на вход «разность» лог.1. При этом элементы DD4.2, DD4.4 разрешают подачу на входы элементов DD5.1, DD5.2, а соответственно и на счетные входы триггеров DD1.2, DD2.1 сигналов с инверсных выходов триггеров DD1.1, DD1.2. При этом элементы DD4.1, DD4.3 закрыты и сигналы с прямых выходов триггеров DD1.1, DD1.2 никак не воздействуют на счетные входы триггеров DD1.2, DD2.1. Таким образом, реализуется операция вычитания.

Рис. 3 Последовательный реверсивный 3-х разрядный счетчик

Для реализации данных счетчиков также можно использовать триггеры, срабатывающие по переднему фронту счетных импульсов. Тогда при суммировании на счетный вход старшего разряда надо подавать сигнал с инверсного выхода соседнего младшего разряда, а при вычитании наоборот – соединять счетный вход с прямым выходом.

Недостаток последовательного счетчика – при увеличении разрядности пропорционально увеличивается время установки (tуст) данного счетчика. Достоинством является простота реализации.

Рис. 3 – Реверсивный счетчик

Для счетных импульсов предусмотрены два входа: “+1” – на увеличение, “-1” – на уменьшение. Соответствующий вход (+1 или -1) подключается ко входу С. Это можно сделать схемой ИЛИ, если влепить ее перед первым триггером (выход элемента ко входу первого триггера, входы – к шинам +1 и -1). Непонятная фигня между триггерами (DD2 и DD4) называется элементом И-ИЛИ. Этот элемент составлен из двух элементов И и одного элемента ИЛИ, объединенных в одном корпусе. Сначала входные сигналы на этом элементе логически перемножаются, потом результат логически складывается.

Число входов элемента И-ИЛИ соответствует номеру разряда, т. е. если третий разряд, то три входа, четвертый – четыре и т. д. Логическая схема является двухпозиционным переключателем, управляемым прямым или инверсным выходом предыдущего триггера. При лог. 1 на прямом выходе счетчик отсчитывает импульсы с шины “+1” (если они, конечно, поступает), при лог. 1 на инверсном выходе – с шины “-1”. Элементы И (DD6.1 и DD6.2) формируют сигналы переноса. На выходе >7 сигнал формируется при коде 111 (число 7) и наличии тактового импульса на шине +1, на выходе <0 сигнал формируется при коде 000 и наличии тактового импульса на шине -1.

Все это, конечно, интересно, но красивей смотрится в микросхемном исполнении:

Рис. 4 Четырехразрядный двоичный счетчик

Вот типичный счетчик с предустановкой. СТ2 означает, что счетчик двоичный, если он десятичный, то ставится СТ10, если двоично-десятичный – СТ2/10. Входы D0 – D3 называются информационными входами и служат для записи в счетчик какого-либо двоичного состояния. Это состояние отобразится на его выходах и от него будет производится начало отсчета. Другими словами, это входы предварительной установки или просто предустановки. Вход V служит для разрешения записи кода по входам D0 – D3, или, как говорят, разрешения предустановки. Этот вход может обозначаться и другими буквами. Предварительная запись в счетчик производится при подаче сигнала разрешения записи в момент прихода импульса на вход С. Вход С тактовый. Сюда запихивают импульсы. Треугольник означает, что счетчик срабатывает по спаду импульса. Если треугольник повернут на 180 градусов, т. е. задницей к букве С, значит он срабатывает по фронту импульса. Вход R служит для обнуления счетчика, т. е. при подаче импульса на этот вход на всех выходах счетчика устанавливаются лог. 0. Вход PI называется входом переноса. Выход p называется выходом переноса. На этом выходе формируется сигнал при переполнении счетчика (когда на всех выходах устанавливаются лог. 1). Этот сигнал можно подать на вход переноса следующего счетчика. Тогда при переполнении первого счетчика второй будет переключаться в следующее состояние. Выходы 1, 2, 4, 8 просто выходы. На них формируется двоичный код, соответствующий числу поступивших на вход счетчика импульсов. Если выводы с кружочками, что бывает намного чаще, значит они инверсные, т. е. вместо лог. 1 подается лог. 0 и наоборот. Более подробно работа счетчиков совместно с другими устройствами будет рассматриваться в дальнейшем.

Параллельный суммирующий счётчик

Принцип действия данного счетчика заключается в том, что входной сигнал, содержащий счетные импульсы, подается одновременно на все разряды данного счетчика. А установкой счетчика в состояние лог.0 или лог.1 управляет схема управления. Схема данного счетчика показана на рис.6

Рис. 4 Суммирующий счетчик параллельного действия

Разряды счетчика – триггеры DD1, DD2, DD3.

Схема управления – элемент DD4.

Достоинство данного счетчика – малое время установки, не зависящее от разрядности счетчика.

Недостаток – сложность схемы при повышении разрядности счетчика.

Счетчики с параллельным переносом

Для повышения быстродействия применяют способ одновременного формирования сигнала переноса для всех разрядов. Достигается это введением элементов И, через которые тактовые импульсы поступают сразу на входы всех разрядов счетчика.

Рис. 2 – Счетчик с параллельным переносом и графики, поясняющие его работу

С первым триггером все понятно. На вход второго триггера тактовый импульс пройдет только тогда, когда на выходе первого триггера будет лог. 1 (особенность схемы И), а на вход третьего – когда на выходах первых двух будет лог. 1 и т. д. Задержка срабатывания на третьем триггере такая же, как и на первом. Такой счетчик называется счетчиком с параллельным переносом. Как видно из схемы, с увеличением числа разрядов увеличивается число лог. элементов И, причем чем выше разряд, тем больше входов у элемента. Это является недостатком таких счетчиков.

Разработка принципиальной схемы

Формирователь импульсов

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

На рисунке 9 приведены схемы формирователей импульсов от механических контактов.

Рис. 9 Формирователи импульсов от механических контактов.

Блок индикации

Для отображения результата счёта необходимо использовать светодиоды. Чтобы осуществить такой вывод информации можно воспользоваться простейшей схемой. Схема блока индикации на светодиодах приведена на рисунке 10.

Рис. 10 Блок индикации на светодиодах.

Разработка КСУ (комбинационной схемы управления)

Для реализации данного счётчика из серии ТТЛШ микросхем К555 я выбрал:

две микросхемы К555ТВ9 (2 JK-триггера с установкой)

одну микросхему К555ЛА4 (3 элемента 3И-НЕ)

две микросхемы К555ЛА3 (4 элемента 2И-НЕ)

одну микросхему К555ЛН1 (6 инверторов)

Данные микросхемы обеспечивают минимальное количество корпусов на печатной плате.

Составление структурной схемы счётчика

Структурная схема – совокупность блоков счётчика, выполняющих какую-либо функцию и обеспечивающих нормальную работу счётчика. На рисунке 7 показана структурная схема счётчика.

Рис. 7 Структурная схема счётчика

Блок управления выполняет функцию подачи сигнала и управления триггерами.

Блок счёта предназначен для изменения состояния счетчика и сохранения этого состояния.

Блок индикации выводит информацию для зрительного восприятия.

Составление функциональной схемы счётчика

Функциональная схема – внутренняя структура счётчика.

Определим оптимальное количество триггеров для недвоичного счётчика с коэффициентом счёта Кс=10.

M = log 2 (Кс) = 4.

M = 4 значит для реализации двоично-десятичного счётчика необходимо 4 триггера.

Простейшие одноразрядные счетчики импульсов

Простейшим одноразрядным счетчиком импульсов может быть JK-триггер и D-триггер, работающий в счетном режиме. Он считает входные импульсы по модулю 2-каждый импульс переключает триггер в противоположное состояние. Один триггер считает до двух, два соединенных последовательно считают до четырех, п триггеров-до 2n импульсов. Результат счета формируется в заданном коде, который может храниться в памяти счетчика или быть считанным другим устройством цифровой техники-дешифратором.

На рисунке показана схема трехразрядного двоичного счетчика импульсов, построенного на JK-триггер ax K155TB1. Смонтируйте такой счетчик на макетной панели и к прямым выходам триггеров подключите светодиодные (или транзисторные - с лампой накаливания) индикаторы, как это делали ранее. Подайте от испытательного генератора на вход С первого триггера счетчика серию импульсов с частотой следования 1 … 2 Гц и по световым сигналам индикаторов постройте графики работы счетчика.

Если в начальный момент все триггеры счетчика находились в нулевом состоянии (можно установить кнопочным выключателем SB1 «Уст.0», подавая на вход R триггеров напряжение низкого уровня), то по спаду первого же импульса (рис. 45,6) триггер DD1 переключится в единичное состояние-на его прямом выходе появится высокий уровень напряжения (рис. 45,в). Второй импульс переключит триггер DD1 в нулевое состояние, а триггер DD2-B единичное (рис. 45,г). По спаду третьего импульса триггеры DD1 и DD2 окажутся в единичном состоянии, а триггер DD3 все еще будет в нулевом. Четвертый импульс переключит первые два триггера в нулевое состояние, а третий в единичное (рис. 45,д). Восьмой импульс переключит все триггеры в нулевое состояние. По спаду девятого входного импульса начнется следующий цикл работы трехразрядного счетчика импульсов.

Изучая графики, нетрудно заметить, что каждый старший разряд счетчика отличается от младшего удвоенным числом импульсов счета. Так, период импульсов на выходе первого триггера в 2 раза больше периода входных импульсов, на выходе второго триггера - в 4 раза, на выходе третьего триггера - в 8 раз. Говоря языком цифровой техники, такой счетчик работает в весовом коде 1-2-4. Здесь под термином «вес» имеется в виду объем информации, принятой счетчиком после установки его триггеров в нулевое состояние. В устройствах и приборах цифровой техники наибольшее распространение получили четырехразрядные счетчики импульсов, работающие в весовом коде 1-2-4-8. Делители частоты считают входные импульсы до некоторого задаваемого коэффициентом счета состояния, а затем формируют сигнал переключения триггеров я нулевое состояние, вновь начинают счет входных импульсов до задаваемого коэффициента счета и т. д.

На рисунке показаны схема и графики работы делителя с коэффициентом счета 5, построенного на JK-триггерах Здесь уже знакомый вам трехразрядный двоичный счетчик дополнен логическим элементом 2Й-НЕ DD4.1, который и задает коэффициент счета 5. Происходит это так. При первых четырех входных импульсах (после установки триггеров в нулевое состояние кнопкой SB1 «Уст. 0») устройство работает как обычный двоичный счетчик импульсов. При этом на одном или обоих входах элемента DD4.1 действует низкий уровень напряжения, поэтому элемент находится в единичном состоянии.

По спаду же пятого импульса на прямом выходе первого и третьего триггеров, а значит, и на обоих входах элемента DD4.1 появляется высокий уровень напряжения, переключающий этот логический элемент а нулевое состояние. В этот момент на его выходе формируется короткий импульс низкого уровня, который через диод VD1 передается на вход R всех триггеров и переключает их в исходное нулевое состояние.

С этого момента начинается следующий цикл работы счетчика. Резистор R1 и диод VD1, введенные в этот счетчик, необходимы для того, чтобы исключить замыкание выхода элемента DD4.1 на общий провод.

Действие такого делителя частоты можете проверить, подавая на вход С первого его триггера импульсы, следующие с частотой 1… 2 Гц, и подключив к выходу триггера DD3 световой индикатор.

На практике функции счетчиков импульсов и делителей частоты выполняют специально разработанные микросхемы повышенной степени интеграции. В серии К155, например, это счетчики К155ИЕ1, К155ИЕ2, К155ИЕ4 и др.

В радиолюбительских разработках наиболее широко используют микросхемы К155ИЕ1 и К155ИЕ2. Условные графические обозначения этих микросхем-счетчиков с нумерацией их выводов показаны на рис. 47.

Микросхему К155ИЕ1 (рис. 47,а) называют декадным счетчиком импульсов, т. е. счетчиком с коэффициентом счета 10. Он содержит четыре триггера, соединенных между собой последовательно. Выход (вывод 5) микросхемы - выход ее четвертого триггера. Устанавливают все триггеры в нулевое состояние подачей напряжения высокого уровня одновременно на оба входа R (выводы 1 и 2), объединенные по схеме элемента И (условный символ «&»). Счетные импульсы, которые должны иметь низкий уровень, можно подавать на соединенные вместе входы С (выводы 8 и 9), также объединенные по И. или на один из них, если в это время на втором будет высокий уровень напряжения. При каждом десятом входном импульсе на выходе счетчик формирует равный по длительности входному импульс низкого уровня. Микросхема К155ИЕ2 (рис.48,б)

Двоично-десятичный четырехразрядный счетчик. В нем также четыре триггера, но первый из них имеет отдельные вход С1 (вывод 14) и отдельный прямой выход (вывод 12). Три других триггера соединены между собой так, что образуют делитель на 5. При соединении выхода первого триггера (вывод 12) со входом С2 (вывод 1) цепи остальных триггеров микросхема становится делителем на 10 (рис. 48, а), работающем в коде 1-2-4-8, что и символизируют цифры у выходов графического обозначения микросхемы. Для установки триггеров счетчика в нулевое состояние подают на оба входа R0 (выводы 2 и 3) напряжение высокого уровня.

Два объединенных входа R0 и четыре разделительных выхода микросхемы К155ИЕ2 позволяют без дополнительных элементов строить делители частоты с коэффициентами деления от 2 до 10. Так, например, если соединить между собой выводы 12 и 1, 9 и 2, 8 н 3 (рис. 48,6), то коэффициент счета будет 6, а при соединении выводов 12 и 1, 11,. 2 и 3 (рис. 48,в) коэффициент счета станет 8. Эта особенность микросхемы К155ИЕ2 позволяет использовать ее и как двоичный счетчик импульсов, и как делитель частоты.

Цифровой счетчик импульсов – это цифровой узел, который осуществляет счет поступающих на его вход импульсов. Результат счета формируется счетчиком в заданном коде и может храниться требуемое время. Счетчики строятся на триггерах, при этом количество импульсов, которое может подсчитать счетчик определяется из выражения N = 2 n – 1, где n – число триггеров, а минус один, потому что в цифровой технике за начало отсчета принимается 0. Счетчики бывают суммирующие, когда счет идет на увеличение, и вычитающие – счет на уменьшение. Если счетчик может переключаться в процессе работы с суммирования на вычитание и наоборот, то он называется реверсивным.