[Home] [< Prev: Устройство таймера TIM1] [Next: Функции таймера TIM1 и примеры использования >]

Устройство каналов таймера. Защитное отключение выходов

Оглавление
Таймер TIM1 с расширенным управлением (общие сведения) 
Устройство таймера TIM1
Устройство каналов таймера. Защитное отключение выходов
   Каналы таймера
   Включение/отключение выходов канала
   Защитное отключение выходов каналов
Функции таймера TIM1 и примеры использования 
Регистры таймера TIM1 


Каналы таймера

Если посмотреть на структурную схему таймера, то можно увидеть, что он содержит так называемые каналы. Они являются специализированными аппаратными средствами для генерации и захвата сигналов (под захватом подразумевают фиксацию в регистре захвата содержимого счётчика таймера по внешнему сигналу).

В простых таймерах каналы могут отсутствовать, более сложные таймеры содержат один или более каналов. Например, в TIM1 микроконтроллеров STM32F100xx есть 4 канала. Первые 3 из них однотипны и имеют по два комплементарных выхода, а четвёртый - более простой, имеет один выход.

Фактически, канал объединяет в себе два совершенно разных устройства, одно из которых используется при работе канала в режиме входа (для захвата сигнала), другое - в режиме выхода (для генерации сигнала). Канал имеет один вход и один или два выхода. Второй выход, при его наличии, может использоваться для генерации сигнала в противофазе к сигналу на основном выходе (с возможностью введения программно регулируемой задержки между сигналами на выходах). Это часто требуется в случае генерации PWM сигналов. Так как канал в одно и то же время может работать либо в режиме входа, либо в режиме выхода, то вход и выход канала физически объединяют в один вывод. Точнее говоря, вход и выход канала привязываются к одному и тому же разряду порта ввода-вывода, но это не существенно в данном случае.

Подключение каналов к выводам микроконтроллера Рис. %img:ch_c

Особенность первого канала в таймере TIM1 состоит в том, что его вход может подключаться либо к выводу TIMx_CH1 микроконтроллера, либо к логическому элементу, выполняющему операцию XOR над сигналами с трёх выводов микроконтроллера: TIMx_CH1, TIMx_CH2, TIMx_CH3:
TI1=TIMx_CH1, если бит TI1S=0 в регистре TIMx_CR2;
TI1=TIMx_CH1 xor TIMx_CH2 xor TIMx_CH3, если бит TI1S=1 в регистре TIMx_CR2.

Рассмотрим структурную схему канала (рис. %img:struc). Так как все каналы имеют сходное строение, пусть это будет первый канал. Схема приведена в упрощённом виде: не показаны выходные цепи, а входные изображены без детализации. Более детализированная схема входных цепей канала изображена на следующем рисунке (рис. %img:in), а выходные цепи рассмотрим немного позже. Начнём же с той части канала, которая отвечает за работу в режиме входа.

Структурная схема канала таймера Рис. %img:struc

Канал работает в режиме входа, если установлен в 1 хотя бы один из битов CC1S[1:0] регистра TIMx_CCMR1, само значение поля определяет используемый для канала источник сигнала. По схеме видим, что при выполнении указанного условия, сигнал Input mode разрешает прохождение сигнала Capture, по которому происходит запись содержимого счётчика (Counter) в регистр захвата/сравнения TIMx_CCR1 (Capture/compare register на схеме). Данный регистр является программно доступным.

Сигнал Capture может быть сгенерирован либо программно (установкой в 1 бита CC1G в регистре TIMx_EGR), либо аппаратно - в результате появления импульса IC1PS при установленном бите CC1E регистра TIMx_CCER (бит разрешения/запрета фиксации). Сам же сигнал IC1PS снимается с выхода предделителя с управляемым коэффициентом деления частоты (1, 2, 4 или 8), на вход которого подаётся сигнал IC1, т.е. входной сигнал канала после прохождения цепей ресинхронизации, цифровой фильтрации, детектирования фронта и выбора активного фронта.

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

Входную цепь канала мы уже отчасти рассматривали ранее, когда обсуждался вопрос о выборе источника тактового сигнала для счётчика таймера. Как было сказано, прежде всего, входной сигнал TI1 подвергается ресинхронизации и проходит через цифровой фильтр (фильтр включается и настраивается программно). При этом для сэмплирования входного сигнала используется вспомогательный тактовый сигнал, на схеме обозначен как fDTS, получаемый из тактового сигнала таймера с помощью предделителя с управляемым коэффициентом (1, 2 или 4). Если говорить точнее, для сэмплирования может использоваться тактовый сигнал таймера, вспомогательный сигнал или сигнал, полученный из вспомогательного с помощью дополнительного предделителя (2, 4, 8, 16, 32) - в зависимости от настроек заданных с помощью регистра TIMx_CCMR1 (в случае каналов 1 или 2 или TIMx_CCMR2 для каналов 3, 4).

Входные цепи канала таймера Рис. %img:in

Получаемый таким образом из TI1 сигнал, обозначаемый на схеме TI1F, поступает на вход детектора фронтов. Детектор имеет два выхода, здесь они обозначены TI1F_Rising, TI1F_Falling. На первом из них появляется короткий импульс при обнаружении переднего фронта сигнала TI1F, а на втором - при обнаружении заднего фронта (среза) сигнала TI1F. Далее, с помощью мультиплексора выбирается один из сигналов TI1F_Rising, TI1F_Falling для использования в качестве сигнала TI1FP1. Выбор определяется значением бита CC1P регистра TIMx_CCER, при нулевом значении бита выбирается сигнал обнаружения переднего фронта сигнала TI1F, а при единичном - сигнал обнаружения заднего фронта.

Также это можно рассматривать как выбор активного уровня входа с помощью бита CC1P: при нулевом значении бита активным уровнем является единичный, а при единичном значении активным уровнем является нулевой. В такой интерпретации мы считаем, что TI1FP1 всегда является сигналом перехода входного сигнала из неактивного уровня в активный.

Нельзя не упомянуть о том, что каналы обмениваются сигналами обнаружения фронтов между собой. Канал 1 обменивается сигналами с каналом 2 (а канал 3 - с каналом 4). Это позволяет расширить набор возможных источников сигнала, используемых для управления захватом в каждом из каналов. Канал 1 получает сигналы обнаружения фронтов на канале 2: TI2F_Rising и TI2F_Falling. Бит CC1P определяет, какой из этих двух сигналов будет выбран мультиплексором в качестве сигнала TI2FP1. Это тот же самый бит, который определяет активный уровень на входе канала 1. Таким образом, данный бит определяет не только активный уровень на входе первого канала, но и может определять активный уровень на входе второго канала, если входной сигнал второго канала используется для управления первым каналом. Звучи немного сложно, но не составляет особого труда разобраться по схеме.

Итак, в первом канале мы получили два сигнала: TI1FP1 и TI2FP1. Их достаточно сложные обозначения отражают способ их получения: TI1 означает, что сигнал получен со входа первого канала, TI2 - сигнал со входа второго канала; F означает, что сигнал был подвергнут ресинхронизации и, возможно, цифровой фильтрации; P1 - активный уровень используемого входного сигнала определяется настройками первого канала, т.е. значением бита CC1P в регистре TIMx_CCER.

По схеме видно, что один из сигналов: TI1FP1, TI2FP1 или TRC выбирается для использования в качестве сигнала IC1. Выбор определяется значением битового поля CC1S[1:0] регистра TIMx_CCMR1 (значения 1, 2 и 3 соответственно; значению 0 битового поля соответствует работа канала в режиме выхода). Что касается сигнала TRC, то здесь о нём мы не говорили, но обсуждали ранее, при рассмотрении вопроса о выборе источника тактового сигнала ("Устройство таймера TIM1: Источник тактового сигнала"). Это может быть один из внутренних триггерных сигналов ITR0..ITR3 или сигнал TI1F_ED, в зависимости от значения битового поля TS[2:0] регистра TIMx_SMCR.

И наконец, сигнал IC1 поступает на делитель с коэффициентом деления, определяемым битовым полем ICPS[1:0] в регистре TIMx_CCMR1. В результате получаем сигнал IC1PS, который используется как сигнал для захвата значения счётчика (с учётом разрешающих битов), как показано на предыдущем рисунке.

Особенность первого канала - наличие сигнала TI1F_ED, который является сигналом обнаружения любого фронта на входе канала 1 - как переднего, так и заднего. Данный сигнал может использоваться в качестве тактового сигнала для счётчика таймера, а также как один из возможных источников для сигнала TRC. Другие каналы не выдают сигнала, аналогичного TI1F_ED.

Выходные цепи канала таймера (с комплементарными выходами) Рис. %img:out2

Перейдём к рассмотрению устройства той части канала, которая отвечает за работу в режиме выхода. Она является сравнительно независимой от части канала, обеспечивающей работу в режиме входа, однако имеются совместно используемые регистры, в частности, это "центральный" регистр канала - регистр фиксации/сравнения TIMx_CCR1. Как можно видеть на ранее приведённом рисунке %img:struc, значение регистра сравнивается со значением счётчика таймера с помощью схемы сравнения, которая вырабатывает два выходных сигнала. Один из них сигнализирует о наступлении события CNT>CCR1, второй сигнализирует об обнаружении равенства значений: CNT=CCR1. Данные сигналы используются для формирования выходных сигналов канала (рис. %img:out2). На рисунке показано устройство канала с комплементарными выходами. Устройство канала с одним выходом несколько проще, схема изображена далее по тексту (рис. %img:out1).

Как видим по схеме, на основе сигналов CNT>CCR1, CNT=CCR1 контроллер режима выхода формирует задающий сигнал OC1REF, на основе которого в дальнейшем будут получены уже сами выходные сигналы канала. Алгоритм формирования сигнала OC1REF существенным образом зависит от выбранного режима работы (сигнал OC1REF может оставаться неизменным, или переходить в заданное состояние - 0 или 1 под действием сигнала сравнения, или переключаться в противоположное состояние и т.д.). Кроме того, можно разрешить сброс OC1REF под действием сигнала ETR (эта возможность включается установкой бита OC1CE в регистре TIMx_CCMR1).

Далее, задающий сигнал OC1REF с помощью генератора защитной паузы расщепляется на два сигнала OC1_DT, OC1N_DT. Сигнал OC1_DT совпадает с сигналом OC1REF, за исключением нарастающих фронтов, которые в OC1_DT запаздывают на время, равное заданной длительности защитной паузы. Сигнал OC1N_DT является инверсией сигнала OC1REF, за исключением срезов сигнала OC1REF, которым соответствует нарастающие фронты OC1N_DT, запаздывающие на время защитной паузы. В результате, любое переключение сигнала OC1_DT оказывается отделено от переключения сигнала OC1N_DT на время, равное защитной паузе. Это позволяет избежать одновременного включения устройств, управляемых выходами канала. Длительность защитной паузы выбирают с учётом инерционности управляемых устройств с таким расчётом, чтобы объекты управления успевали за это время отключиться.

Вставка защитной паузы в канале с комплементарными выходами Рис. %img:dt

Чтобы было проще запомнить, каким образом происходит переключение сигналов OC1_DT, OC1N_DT в ответ на переключение OC1REF, надо обратить внимание на то, что у получаемых сигналов запаздывает передний фронт, а задний - нет.

Возможна такая ситуация, когда длительность генерируемого импульса оказывается меньше времени защитной паузы. В таком случае сохраняется корректная работа канала. Если OC1REF представляет собой короткий отрицательный импульс, то на комплементарном канале импульс вообще не появляется (всё время сохраняется неактивный уровень), на основном выходе появляется импульс, удлинённый на время защитной паузы. Это изображено в виде временной диаграммы на следующем рисунке. Предполагается, что для выходов заданы низкие уровни в качестве неактивных (биты, задающие полярность сброшены).

Диаграмма сигналов с защитной паузой в случае короткого отрицательного импульса (короче защитного времени) Рис. %img:dg_p

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

Диаграмма сигналов с защитной паузой в случае короткого положительного импульса (короче защитного времени) Рис. %img:dg_n

Сигналы OC1_DT и OC1N_DT используются только в том случае, если включены оба выхода канала. Если задействован только один из выходов, то используется основной задающий сигнал OC1REF, это можно проследить по схеме, рассмотрев, как происходит мультиплексирование сигналов с помощью битов включения выходов CC1E, CC1NE регистра TIMx_CCMR1. Это очень важно, так как если используется только один комплементарный выход, то он уже не будет комплементарным, сигнал на этом выходе будет получен из OC1REF, а не из OC1N_DT. Иначе говоря, при включении только одного канала, происходит перенаправление задающего сигнала OC1REF на включённый выход, но без дополнительного инвертирования сигнала при использовании комплементарного выхода. Поэтому, если нужен только один выход канала, мы можем в качестве основного использовать любой из выходов OC1 или OC1N, какой нам будет удобнее.

Очень удобно то, что можно задать активный уровень сигнала для каждого из выходов канала (с помощью битов CC1P, CC1NP регистра TIMx_CCER). По умолчанию активный уровень - единичный, но установив бит выбора активного уровня в 1, зададим нулевой активный уровень соответствующего выхода. При этом активный уровень задающего сигнала OC1REF - всегда единичный. Возможность управления активным уровнем выхода позволяет подключать к микроконтроллеру исполнительное устройство с любой логикой (прямой или инверсной) без внешних инверторов сигнала. Например, если канал должен управлять ключом, который открывается низким уровнем, достаточно задать нулевой активный уровень выхода и внешний инвертор для управления ключом не потребуется.

И, наконец, полученные сигналы попадают на выход канала, но перед этим проходят через схему включения/отключения выхода (рассмотрим её работу в следующем пункте). Заметим, что за выходом канала закрепляется определённый вывод микроконтроллера (какой именно - смотрим в документации), но подключение не является непосредственным. Связь с внешним выводом осуществляется с помощью порта ввода-вывода. Для использования вывода микроконтроллера как выхода канала, необходимо настроить его как выход альтернативной функции. Подробнее можно посмотреть в разделе о портах ввода-вывода.

Выходные цепи канала таймера (с единственным выходом) Рис. %img:out1

Таймер TIM1 имеет один канал без комплементарного выхода - канал 4. Выходные цепи этого канала во многом похожи на цепи остальных каналов, но, естественно, компоненты для формирования комплементарного сигнала отсутствуют, в том числе и генератор времени запаздывания.

Включение/отключение выходов канала

Как было сказано ранее, на выходе канала имеется схема включения/отключения (Output enable circuit). Она является частью механизма защитного отключения, наряду с битом MOE регистра TIMx_BDTR. В аварийных ситуациях схема защитного отключения позволяет перевести все выходы каналов таймеров (работающих в режиме выхода, естественно) в некоторое заранее заданное состояние, безопасное для нашего устройства. Отключение происходит за счёт аппаратного сброса бита MOE под действием сигнала TIMx_BKIN или сигнала сбоя системы тактирования. Сброс бита MOE происходит асинхронно, это обеспечивает работоспособность схемы защитного отключения даже в случае отсутствия тактового сигнала микроконтроллера, что возможно в случае неисправностей в системе тактирования. Для того, чтобы разрешить работу системы защитного отключения, должен быть установлен бит BKE регистра TIMx_BDTR.

На работу канала в режиме выхода влияет довольно большое количество управляющих битов, поэтому будет уместно сказать несколько слов вообще о процедуре переключения канала в данный режим. Будем рассматривать канал 1. Естественно, когда используется некоторый вывод микроконтроллера как выход периферийного устройства, соответствующий бит порта ввода-вывода должен быть настроен как выход для выполнения альтернативной функции. Канал переводится в режим выхода сбросом в 0 битового поля CC1S[1:0] в регистре TIMx_CCMR1 (значение по умолчанию после сброса микроконтроллера).

Далее, канал имеет два выхода, OC1 и OC1N. Каждый из выходов можно включить или отключить (биты CC1E, CC1NE регистра TIMx_CCER), а также задать полярность сигнала, или, иначе говоря, определить активный уровень выходного сигнала (биты CC1P, CC1NP того же регистра; неактивный уровень совпадает со значением соответствующего бита, нулевой бит задаёт нулевой неактивный уровень). И, наконец, в регистре TIMx_BDTR имеется бит MOE - основной бит отключения/включения всех выходов всех каналов данного таймера. Для включения выходов, бит MOE устанавливают в 1 программно, либо используют функцию автоматического включения: если бит AOE в регистре TIMx_BDTR установлен в 1, то бит MOE будет установлен аппаратно во время ближайшего события обновления (если при этом отсутствуют условия для защитного отключения).

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

Выходы канала можно включать и отключать, как по отдельности (CC1E, CC1NE), так все сразу (MOE). В то же время понятно, что если вывод микроконтроллера настроен как выход (для выполнения альтернативной функции), то независимо от того, включён выход канала или нет, на выводе микроконтроллера будет присутствовать уровень либо 0, либо 1.

MOE=1
Если выходы каналов разрешены, т.е. бит MOE установлен в 1, то состояние выходов определяется задающим сигналом OC1REF (с учётом воздействия генератора защитной паузы), битами CC1E, CC1NE, CC1P, CC1NP регистра TIMx_CCER и битом OSSR регистра TIMx_BDTR следующим образом. При OSSR=0, на включённом выходе канала получаем сигнал, определяемый логикой выхода в данном режиме, а на отключённом выходе канала имеем 0. Если OSSR=1, то функционирование включённых выходов канала остаётся таким же, а на отключённых выходах сигнал имеет неактивный уровень, т.е. равен значению бита CC1P для выхода OC1 (если он отключён: CC1E=0) и значению бита CC1NP для выхода OC1N (если он отключён: CC1NE=0). Это значит, что при OSSR=1 на отключённом выходе канала может быть уровень 1, если задан нулевой активный уровень для выхода.

Таблица %tbl:moe1
Управляющие биты Состояние выходов
MOE OSSI OSSR CCxE CCxNE Состояние выхода OCx Состояние выхода OCxN
1 X 0 0 0 0 0
0 0 1 0 OCxREF + полярность:
OCxREF xor CCxNP
0 1 0 OCxREF + полярность:
OCxREF xor CCxP
0
0 1 1 OCREF + полярность + dead-time:
OCxREF xor CCxP
/* + dead-time */
Комплементарный к OCREF (not OCREF) + полярность + dead-time:
(not OCxREF) xor CCxNP
/* + dead-time */
1 0 0 Неактивный уровень:
CCxP
Неактивный уровень:
CCxNP
1 0 1 Неактивный уровень:
CCxP
OCxREF + полярность:
OCxREF xor CCxNP
1 1 0 OCxREF + полярность:
OCxREF xor CCxP
Неактивный уровень:
CCxNP
1 1 1 OCREF + полярность + dead-time:
OCxREF xor CCxP
/* + dead-time */
Комплементарный к OCREF (not OCREF) + полярность + dead-time:
(not OCxREF) xor CCxNP
/* + dead-time */

MOE=0
При сброшенном бите MOE (сброс может быть выполнен программно или произойти в результате срабатывания защитного отключения), состояния выходов перестают зависеть от бита OSSR и от битов включения выходов CC1E, CC1NE (это вполне понятно - ведь при MOE=0 отключены все выходы). Состояния выходов в данном случае зависят от битов CC1P, CC1NP, а также появляется зависимость от битов OIS1, OIS1N регистра TIMx_CR2 (когда MOE=1, биты OIS1, OIS1N не влияют на состояние выходов).

Таблица %tbl:moe0
Control bits Output states (OC1, OC1N)
MOE OSSI OSSR CC1E* CC1NE* OIS1 OIS1N if CC1P, CC1NP =
= 00 = 01 = 10 = 11
0 x x x x 0 0 00 00 00 11
0 1 01 01 10 01
1 0 10 01 10 10
1 1 00 11 11 11

Уровень на выходах при MOE=0 равен значению соответствующих битов OIS1, OIS1N. Причём выводятся именно заданные значения, без преобразований, связанных с выбранной полярностью. Однако, есть два очень важных момента! Если оба бита OIS1, OIS1N соответствуют активным уровням сигнала на выходах (OIS1=not CC1P и OIS1N=not CC1NP), то на обоих выходах устанавливаются неактивные уровни (CC1P и CC1NP соответственно для основного и комплементарного) - в таблице клетки для этих случаев выделены жёлтым цветом. Ещё более важным является то, что документация требует, чтобы в случае, когда оба канала не используются (CC1E=0, CC1NE=0), биты OIS1, OIS1N, CC1P и CC1NP оставались сброшенными. С одной стороны, это не вполне типичный вариант использования канала - работа в режиме выхода, но с обоими отключёнными выходами. С другой стороны, всё же необходимо иметь в виду указанное требование документации, поскольку, как показывает экспериментальная проверка, при двух отключённых каналах, сброшенном бите MOE и некоторых ненулевых комбинациях битов OIS1, OIS1N, CC1P, CC1NP, канал начинает вести себя довольно "странно" - на выходах появляется генерируемый каналом сигнал (происходят переключения в соответствии с сигналом OC1REF)! Несмотря на то, что выходы отключены индивидуально (битами CC1E=0, CC1NE=0) и основным битом отключения MOE=0!

Затронутые в этом пункте вопросы также подробно рассматриваются в статье с описанием регистров таймера (смотрите описание регистра TIMx_CCER, а также других, связанных с управлением работы канала).

Защитное отключение выходов каналов

Источником сигнала защитного отключения может быть вывод микроконтроллера (вход TIMx_BKIN) или сигнал сбоя системы тактирования, генерируемый системой безопасности тактового сигнала CSS (Clock Security System), которая является частью контроллера сброса и тактирования RCC (Reset Clock Controller). Для того чтобы можно было получать сигнал от системы CSS, она должна быть включена, это можно сделать путём конфигурирования RCC.

После сброса, схема защитного отключения не задействована, а бит MOE сброшен в 0. Можно включить функцию защитного отключения, установив в 1 бит BKE в регистре TIMx_BDTR. Полярность входа защитного отключения может быть выбрана с помощью бита BKP того же регистра. Биты BKE и BKP могут быть модифицированы одновременно. Когда значения в биты записаны, происходит задержка в 1 период тактового сигнала APB, прежде чем проявится эффект от записи. Следовательно, необходимо подождать 1 такт APB для того, чтобы можно было корректно считать значения этих битов после операции записи.

Спад MOE может быть асинхронным и поэтому между сигналом, действующим на выходы каналов и синхронным битом управления, доступ к которому происходит через регистр TIMx_BDTR, вставлена схема ресинхронизации. В результате появляется некоторая задержка между синхронными и асинхронными сигналами. В частности, если записана 1 в MOE, в то время как перед записью бит содержал 0, потребуется задержка (например, пустая инструкция) для последующего корректного считывания бита.

Теперь рассмотрим процессы, происходящие при срабатывании схемы, например, при появлении сигнала с активным уровнем на входе TIMx_BKIN. Прежде всего, бит MOE асинхронно сбрасывается и переводит выходы всех каналов, работающих в режиме выхода в неактивное состояние (если в канале реализованы комплементарные выходы) или ждущее состояние (если в канале реализован единственный выход). Так как это осуществляется асинхронными цифровыми цепями, то описанное функционирование сохраняется даже в случае отсутствия тактового сигнала микроконтроллера.

Если канал имеет комплементарные выходы, даже если один из них не был задействован в работе, после сброса MOE происходит переход выходов канала в неактивное состояние. Затем, если тактовый сигнал таймера присутствует, задействуется генератор защитной паузы и через время, равное продолжительности защитной паузы, выходы канала переводятся в состояния ожидания, заданное битами OISy, OISyN (y=1, 2, 3 для каналов 1..3 с комплементарными выходами, в случае TIM1). Если уровни обоих выходов канала заданы равными активным уровням, то выходы остаются в неактивном состоянии.

Далее:
Функции таймера TIM1 и примеры использования

author: hamper; date: 2018-03-12
  @Mail.ru