Принцип работы таймера счетчика
КР580ВИ53
КР580ВИ53 — электронный компонент, микросхема программируемого трёхканального таймера счётчика интервалов и внешних событий (количества импульсов), программируемого делителя частоты, одновибратора.
Содержит три идентичных независимых канала счёта, каждый канал является программно настраиваемым 8-ми или 16-битовым счётчиком. Режимы работы каналов настраиваются программно.
Микросхема выпускалась в двух версиях, КР580ВИ53 (аналог i8253) с максимальной рабочей частотой 2 МГц, и КР580ВИ53Д (аналог i8253-5) c максимальной рабочей частотой 2,5 МГц, оформление — пластмассовый корпус DIP24 (широкий) или металлокерамический.
Является функциональной копией микросхемы Intel 8253 (i8253).
STM32: Урок 6.2 — Таймеры общего назначения и продвинутые
Продолжаем тему таймеров в STM32. В прошлый раз мы рассмотрели базовые таймеры, которые довольно-таки просты. Но сегодня мы поиграемся с более крутой игрушкой — таймерами общего назначения, которые на голову выше предыдущих.
- До 4-х каналов для:
- Захвата сигнала (input capture).
- Сравнения вывода (output compare).
- Генерации сигнала ШИМ (выровненного по границе или по центру).
- Генерации одиночных импульсов.
- Обновление: переполнение счётчика.
- Событие-триггер: старт, остановка, инициализация счётчика или его обновление внутренним или внешним триггером.
- Захват сигнала.
- Сравнение (output compare).
- Включение BRK.
Вот как вы думаете, если у таймеров общего назначения так много функций, чем тогда продвинутые (advanced-control) таймеры отличаются от них? o_O
Правильный ответ — почти ничем, это по факту просто таймеры общего назначения, которые не имеют никаких ограничений: в них напихано по 4 канала (с комплементарными) и есть все возможности сразу, без какого-то ни было разброса. Так что остальная часть статьи будет относиться ко всем таймерам выше базовых, а продвинутые таймеры я отдельно упоминать не буду.В даташите на STM32F100xx ( ещё ссылка ) есть сводная таблица возможностей таймеров, в которую тоже удобно поглядывать для справки:
Кстати, обращайте внимание на сноски. Например, там написано, что у МК семейства Low density Value line нет таймера TIM4.
Захват сигнала
В этом режиме с выбранного канала захватываются импульсы, на каждый из них текущее значение счётчика таймера кладётся в регистр TIM_CCRx, где x — номер канала. Таким образом, период следования импульсов равен разнице между текущим значением TIM_CCRx и предыдущим. Ну а для того, чтобы получить период в каких-то внятных единицах измерения, нужно настроить предделитель через функции базового таймера.
При этом можно настроить генерацию прерывания и запроса DMA на приход очередного импульса, и если в это время предыдущее значение TIM_CCRx не было считано, будет сгенерировано так называемое прерывание over-capture, т.е. сигнал о том, что предыдущее значение потерялось.
Ловить можно фронты, спады или и то, и другое вместе. Есть настройка так называемого фильтра — числа выборок, после которого переход уровня будет считаться состоявшимся (полезно для устранения дребезга). Значение фильтра может принимать значения от 0 (фильтр выключен) до 15 (0xF). Также настраивается делитель входной частоты — 2, 4 или 8: будет ловиться каждый 2й, 4й или 8й импульс соответственно.
Примера ради подёргаем вывод PB15 и замерим таймером TIM3 период, подключив PB15 к его каналу 1 (PA6):
Также существует режим захвата ШИМ. На самом деле, это не отдельный режим, а просто особое сочетание настроек с таким эффектом. Таймер настраивается так, чтобы один канал ловил фронты и сбрасывал счётчик таймера, а второй ловил спады — тогда первый будет захватывать период ШИМ, а второй — заполнение. При этом оба канала подключаются к одному и тому же физическому входу. Суть работы этого «режима» показана в даташите следующим образом:
Изменим предыдущий пример, используя захват ШИМ (прокомментированы только изменения):
Режим чтения энкодера
Работу с энкодером я уже как-то описывал , и тогда я считывал и декодировал данные с энкодера программно, здесь же таймер сделает работу за нас (не всю, конечно же). Боковые выводы энкодера надо подключить к двум каналам таймера, а средний вывод — к GND. Таймер в этом режиме сам обрабатывает поступающие с энкодера импульсы, а также увеличивает/уменьшает свой счётчик на 4 при каждом щелчке энкодера, и запоминает направление вращения.
Так как мне захотелось ещё и прерывание заиметь, я сделал период равным 4 и разрешил счёт в обе стороны, так что теперь прерывание будет возникать при каждом щелчке энкодера. Использовал я каналы 1 и 2 таймера TIM3 (PA6 и PA7):
Сравнение вывода (output compare)
В этом режиме выбранный канал таймера будет подключен к соответствующему выводу и будет изменять его (вывода) состояние каждый раз, когда счётчик таймера досчитает до значения регистра TIM_CCRx. Состояние вывода, в зависимости от настройки, будет меняться на ноль, на единицу или на противоположное текущему. У многих таймеров у каналов есть комплементарные выводы, которые по умолчанию являются инверсными: на такой выход подаётся тот же сигнал, что и на обычный, но с противоположным уровнем.
Смотрим в сводную таблицу по таймерам в даташите и видим, что комплементарных выводов у TIM3 нет, но вот у единственного канала таймера TIM16 есть такой вывод — этот таймер я и использую для примера. Вообще, комплементарные выводы есть и у нескольких других таймеров, но вот TIM15 — особенный: у него есть два канала, но комплементарный вывод имеет только 1й канал. Будьте бдительны!
В таблице пинаутов находим выводы канала 1 таймера TIM16 — PB8 (основной) и PB6 (комплементарный). Для иллюстрации работы таймера подключим эти выводы к светодиодам на плате STM32VLDiscovery — PC8 и PC9, которые в коде мы отключим от греха подальше. Таким образом, выводы канала таймера будут напрямую мигать светодиодами:
В это примере я выбрал режим переключения вывода в противоположное состояние (TIM_OCMode_Toggle), а остальные настройки оставил по умолчанию. Кстати, не забывайте вызывать функции типа TIM_OCStructInit() для инициализации соответствующих структур, даже если заполняете все поля структур вручную: copy&paste-ориентированное программирование никто не отменял, но при нём легко забыть заполнить какое-нибудь поле и ловить потом баги.
Для обоих выводов канала можно настроить (поля TIM_OCPolarity и TIM_OCNPolarity структуры) так называемую «полярность» — состояние вывода в промежуток времени от начала отсчёта и до TIM_Pulse. По умолчанию для выводов выставляются значения TIM_OCPolarity_High и TIM_OCNPolarity_High, но комплементарный вывод является инверсным — поэтому, если на нём нужен обычный (не инверсный) сигнал, нужно ему выставить TIM_OCNPolarity_Low.
В режиме сравнения генерируется то же самое прерывание, что и в режиме захвата сигнала — TIM_IT_CCx, но здесь оно было не нужно, поэтому я его не разрешал.
Генерация ШИМ
Вот это куда более интересная и практичная штука. Принципы ШИМ уже неоднократно были описаны — как на нашем сайте , так и у Di Halt’a (уж там разжёвано всё до мелочей), а я сосредоточусь на особенностях реализации в STM32.
Настройка этого режима не слишком отличается от настройки output compare: вместо режима TIM_OCMode_Toggle нужно выбрать один из режимов ШИМ, тогда TIM_Period будет трактоваться как период ШИМ, а поле TIM_Pulse — как заполнение (duty cycle). Режимов ШИМ имеется два — выровненный по границе и по центру (edge-aligned и center-aligned). У микроконтроллеров AVR они называются Fast PWM и Phase Correct PWM, соответственно.
Отличной иллюстрацией крутизны таймеров STM32 для генерации ШИМ будет типичная прикладная задача — управление сервомашинкой : Как известно, сервы управляются импульсами переменной ширины, которые шлются с частотой примерно 50 Гц (каждые 20 мс). У сервы, которая оказалась под рукой (Robbe 4.3 g), ширина управляющего импульса от 500 мкс (0°) до 2250 мкс (175°), судя по замерам — то есть, по 10 мкс на каждый градус поворота:
ΔT = T₂ — T₁ = 2250 — 500 = 1750 мкс
∠A = 175°
ΔT/A = 10 мкс/°- Установить таймеру такой делитель частоты, чтобы отсчёт вёлся каждые 10 мкс.
- Задать период ШИМ в 20 мс, то есть 2000 отрезков времени по 10 мкс.
- Класть в регистр сравнения число, равное 50 (500 мкс / 10 мкс) + задаваемый угол.
- Регистр сравнения лучше обновлять строго в момент окончания периода во избежание дёргания сервы.
Dead-time
Если кто не знает, это задержка фронтов сигналов на основном и комплементарном выводах канала таймера. Эта функция есть у некоторых таймеров (смотрите руководство), и нужна она бывает для исключения сквозных токов при управлении силовыми ключами [полу]мостовых схем. Даже не спрашивайте меня, что это такое — это вне моей компетенции.
Настраивается этот самый dead-time в поле TIM_DeadTime структуры TIM_BDTRInitTypeDef и имеет диапазон значений с 0 по 255 (0xFF). Но смысл этого числа не так уж прямолинеен:
Ага, вот так оно и рассчитывается. Здесь Tdts — это длительность такта генератора dead-time (DTG), зависящая от Tdts — текущей частоты тактирования таймера. Обычно таймеры тактируются системной частотой, и TIM_Prescaler на это никак не влияет, а влияет поле TIM_ClockDivision структуры TIM_TimeBaseInitTypeDef — делитель частоты таймера.
Для примера положим, что таймер затактирован без деления частоты (делитель равен 1, TIM_CKD_DIV1), системная частота F равна 24 МГц, а значение DTG = 150. Тогда:
Tdts = 1/F = 1/24 мкс
DTG = 150 = 100101102 ⇒ DTG[7:5] = 1002
Tdtg = 2⋅Tdts = 1/12 мкс
DT = (64 + DTG[5:0])Tdtg = (64 + 6)/12 = 5.8(3) мкс«Just like that» ☯ ChosunNinja
Я тут для примера набросал код с dead-time попроще для расчёта: DTG=96 ⇒ DT=96.
Для того, чтобы узреть этот самый dead-time на одноканальном осциллографе, нужно подключить PB8 и PB6 через резисторы 1 кОм к его щупу:
Т.к. на эти выводы идут взаимно инверсные сигналы, на экране будут прекрасно видны места, где во время dead-time уровень на обоих входах одинаков из-за задержки фронтов:
Ну, и напоследок — имейте ввиду, что если длительность dead-time превышает длительность импульса на выводе, то соответствующий импульс не будет сгенерирован вообще.
Счётчик повторений
Этот счётчик имеется у нескольких таймеров (TIM15, TIM16 и TIM17) и выполняет он очень простую функцию: генерировать событие (прерывание или запрос DMA) update не на каждое переполнение счётчика, а на каждые N переполнений. То есть, вы задаёте счётчик повторений, таймер его копирует в скрытый регистр и при каждом переполнении уменьшает значение копии на 1. Когда значение достигает нуля, генерируется событие update, таймер снова копирует счётчик повторений и т.д. На самом деле, перечисленные таймеры и так задействуют этот счётчик, просто по умолчанию его значение равно нулю, и событие генерируется на каждое переполнение.
Счётчик может принимать значения от 0 до 255 (0xFF). Описывать тут особо нечего, потому что для использования этой функции достаточно при инициализации таймера написать что-то вроде:
и всё. В этом случае событие update будет генерироваться каждые 8 переполнений (7 повторений).
Вход BRK
Если вам вдруг понадобится резко перевести выводы каналов таймера в заранее определённое состояние (например, выключить), то эта функция — то, что нужно. Включить её проще пареной репы — нужно сконфигурировать пин TIMx_BKIN на вход, и при инициализации BDTR включить вход BRK:
По умолчанию для активации функции break нужно на вход BRK подать логический ноль, но это можно настроить в поле TIM_BreakPolarity. Как только break активирован, все выводы каналов переходят в состояние, которое задаётся при их инициализации полями TIM_OCIdleState и TIM_OCNIdleState в структуре TIM_OCInitTypeDef (по умолчанию на выводах будет низкий уровень). Dead-time при этом учитывается.
Синхронизация таймеров
Таймеры можно соединять друг с другом для синхронизации или образования цепочек таймеров. В первом случае появляется возможность синхронного старта нескольких таймеров по внешнему триггеру, а во втором — возможность одному таймеру управлять счётчиком другого — запускать, разрешать, сбрасывать.
Второй случай (цепочка таймеров) больше подойдёт для иллюстрации, ибо интереснее он. Сделаем-ка для примера 32-битный таймер из двух обычных 16-битных. Для примера я возьму таймеры TIM2 и TIM3. Задача состоит в том, таймер TIM3 тактировал таймер TIM2 по переполнению своего счётчика: то есть, счётчик таймера TIM2 будет увеличиваться при переполнении счётчика TIM3 — получаем 32-битный счётчик, «состоящий» из TIM2_CNT (старшие биты) и TIM3_CNT (младшие).
Для этого нужно настроить выходной триггер таймера TIM3 на переполнение (update), а входной триггер таймера TIM2 — на вход с триггера TIM3. Смотрим в таблицу соединения триггеров для таймеров TIM2-TIM4 (таких таблиц несколько — для разных групп таймеров):
Здесь мы видим, что TIM3 соединён с входом ITR2 таймера TIM2. И тут выясняется, что в Reference manual рассматриваемый случай описан в разделе «Using one timer as prescaler for another», но там допущена ошибка: вместо ITR2 там указан ITR1. Я
джва годачас искал ошибку в коде!Возможности применения таймеров/счетчиков импульсов Autonics CX
Купить счётчик-таймер электронный серии CX рекомендуется для непрерывного контроля в резательных станках длины нарезаемых изделий и их количества.
Это актуально для таких сфер промышленности, как:
- Машиностроительная;
- Станкостроительная;
- Деревообрабатывающая;
- Сталелитейная;
- Металлообрабатывающая;
- В радиоэлектронике при комплектации технических устройств;
- Производство труб и т.д.
Конструкция
Эти таймеры, выпускаемые разными производителями, очень похожи друг на друга конструктивно.
В первую очередь – это автономные устройства, которые подключаются к существующей схеме электропитания через штепсельный разъем (розетку). На их корпусе есть два штыря, аналогичные тем, которые есть на так называемой электрической вилке.
В корпусе механической розетки-таймера объединены штепсельный разъем (обычно один) и исполнительный механизм в виде вращающегося диска с делениями, по внешнему краю которого расположен ряд коммутационных кнопок.
Деления на диске могут быть с градациями 15 и 30 минут. Коммутационные кнопки, в зависимости от модели, могут управлять как включением, так и выключением. Например, есть модели, в которых для отключения такую кнопку надо поднять, в других – «утопить».
На корпусе таймера есть кнопка, которая его переключает из режима непрерывной подачи электроэнергии в регулируемый. Обычно она установлена сбоку, может быть дополнена устройством световой индикации.
Видео-обзор о механической розетке с таймером Feron TM50:
Таймеры-счетчики
Таймером называется средство микропроцессора, служащее для измерения времени и реализации задержек. Основой таймера служит суммирующий счетчик, который считает количество импульсов генератора тактовой частоты.
Для таймера могут быть указаны:- разрядость таймера;
- коэффициент предварительного деления;
- диапазон изменения счетного регистра;
- режим работы.
Разрядность таймера представляет собой разрядность двоичного счетчика, используемого для его реализации и определяет верхнюю допустимую границу счетного регистра. Например, для 8-разрядного таймера верхняя граница счетного регистра будет 2 8 -1 = 255.
Предварительный делитель – делитель частоты тактового сигнала, работающий как один или несколько последовательно соединенных T-триггеров. Таймер изменяет свое значение на 1 каждые n сигналов тактового импульса. n называют коэффициентом предварительного деления .
Зная частоту тактового генератора fosc и коэффициент предварительного деления Kpre, легко определить частоту таймера по формуле:
Время одного тика таймера соответственно будет
Полное время счета таймера (время перебора всех допустимых значений двоичного счетчика) определится как
Например, если требуется реализовать задержку 1с на 8-разрядном таймере с коэффициентом предварительного деления Kpre=1 и тактовой частотой fosc=8 МГц, имеем
tic = 0,125 мкс;
Tcount = 0,125*2 8 = 32 мкс
1с/32мкс = 31250 повторенийШиротно-импульсная модуляция
Широтно-импульсная модуляция (ШИМ) – импульсный сигнал постоянной частоты и переменной скважности.
Скважность есть отношения периода следования импульса к длительности импульса.
С помощью задания скважности (длительности импульсов) можно менять среднее напряжение на выходе ШИМ.
Обратная величина, то есть отношение длительности импульса к периоду, называется коэффициентом заполнения .Разрядностью ШИМ называется разрядность таймера, используемого для формирования ШИМ-сигнала.
Существуют два основных режима работы ШИМ:- быстрый ШИМ;
- фазовый ШИМ.
Быстрый ШИМ
Период ШИМ определяется максимальным значением, до которого считает счетчик. В этот момент ШИМ-сигнал устанавливается в «1». При достижении счетчиком значения, поданного на второй вход цифрового компаратора, осуществляется сброс выходного ШИМ-сигнала.
Фазовый ШИМ
В данном режиме счетчик работает как суммирующий и считает от 0 до максимального значения, а при достижении максимального значения работает как вычитающий, считая до 0.
При совпадении значения счетчика с некоторым установленным значением, происходит переключение выхода ШИМ.
Частотно-импульсная модуляция — сигнал переменной частоты и постоянной скважности, равной 2. При таком виде модуляции изменяется период сигнала, а длительность импульса всегда составляет половину периода.
Функции таймеров
Электрические и электромеханические таймеры используют для автоматического контроля не только освещения, но и других электроприборов: обогревателей (в том числе систем тёплого пола), кондиционеров, вытяжек и прочего. По сравнению с постоянным ручным переключением устройств, в использовании реле времени есть следующие преимущества:
- экономия электроэнергии;
- постоянная поддержка в помещении нужной температуры и уровня освещения — к примеру, таймер может включить обогреватель или кондиционер за некоторое время до прихода человека домой и уже создать комфортные условия в комнате перед его появлением;
- возможность контролировать дворовое и садовое освещение, а также прочее находящееся снаружи оборудование (например, системы полива растений) не выходя на улицу;
- включение и выключение электроприборов по строгому расписанию даже при отсутствии рядом людей — особенно важно для аквариумов и террариумов, в которых правильная работа фильтров, светотепловых ламп, обогревателей и прочего оборудования жизненно необходима для обитателей;
- своевременное отключение бытовой техники после того, как включивший оборудование человек уже ушёл — широко используется в конструкциях плит и стиральных машин, так как для этого подходят даже простейшие механические таймеры.
Таким образом, реле времени довольно распространены и встречаются повсюду в повседневной жизни человека. Они недороги, но значительно увеличивают комфорт и экономят время и силы, что и принесло им популярность.
Таймер-розетка. Видео
Испытание работоспособности розетки с таймером представлено в видео ниже.
Чтобы правильно пользоваться устройством, необходимо в точности выполнять все указания инструкции, которая обязательно прилагается к изделию. Там четко описано следующее:
- общие технические характеристики;
- назначение кнопок;
- способ включения в сеть;
- порядок установки времени и программ;
- особенности настройки;
- режимы работы;
- указаны функции плавающего включения;
- как осуществить переход на летнее и зимнее время.
Таймер-розетки используются повсеместно теми, кто хочет экономить потребление электроэнергии, защитить объект от негативных последствий оставленных электроприборов без присмотра, наслаждаться комфортными условиями пребываниями в помещениях, а также облегчить работу на своем приусадебном участке. Этот современный девайс может многое, главное – понять принцип его работы и правильно подобрать под конкретные нужды.