Перейти к содержанию

Захват входа (input capture)

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

Обновлено Редакция GAW

Захват входа (input capture) — режим канала таймера, в котором фронт на входе копирует текущее значение счётчика в регистр захвата. Счётчик продолжает считать, а программа получает точную метку времени события. Разность двух меток — это период или длительность импульса в тактах счётчика; погрешность определяется частотой счёта, а не скоростью обработчика прерывания.

Как считают частоту

Если счётчик тактируется частотой fCNT (после предделителя), а два соседних нарастающих фронта дали захваты N1 и N2, то:

T=N2−N1fCNT,f=fCNTN2−N1T = \frac{N_2 - N_1}{f_\text{CNT}}, \qquad f = \frac{f_\text{CNT}}{N_2 - N_1}

Это наш вывод из принципа работы захвата. Например, при fCNT = 1 МГц и разности 1000 тактов частота сигнала 1 кГц. Если между захватами счётчик переполнился, к разности добавляют период счёта (ARR + 1) на каждое переполнение. Период счёта и предделитель для нужного диапазона подбирает калькулятор таймера.

STM32

По RM0090 (разд. 17.3.6) захват включают так: CCxS = 01 направляет вход TIx на канал, ICxF задаёт фильтр, CCxP и CCxNP — фронт, ICxPS — предделитель захвата (каждый 1-й, 2-й, 4-й или 8-й фронт), CCxE разрешает захват. По фронту счётчик попадает в TIMx_CCRx, ставится флаг CCxIF и, если разрешено, приходит прерывание или запрос DMA. Если новый захват случился до сброса флага, ставится CCxOF.

Частный случай — PWM input mode (разд. 17.3.7): два канала подключены к одному входу с противоположными фронтами, а ведомый контроллер в режиме сброса обнуляет счётчик на каждом периоде. Тогда CCR1 сразу даёт период, а CCR2 — длительность импульса, без вычитаний. Коэффициент заполнения — их отношение.

AVR

У ATmega328P захват есть только у 16-битного Timer1: событие на выводе ICP1 (PB0) или на выходе аналогового компаратора копирует TCNT1 в ICR1 и ставит флаг ICF1 (DS40002061B, разд. 16.6). Подавитель шума ICNC1 требует четырёх одинаковых отсчётов. Главное ограничение Microchip формулирует прямо: если ICR1 не прочитан до следующего события, значение перезапишется, поэтому регистр читают в начале обработчика. Режимы и регистры таймеров AVR — в статье «Таймеры AVR».

Не путать

С output compare: там регистр канала задаёт момент, а не запоминает его.

Частые вопросы

Как измерить сразу период и заполнение ШИМ?

У STM32 — режимом PWM input: два канала слушают один вход, один ловит нарастающий фронт, другой — спадающий, а ведомый режим сброса обнуляет счётчик на каждом периоде. После этого в CCR1 лежит период, а в CCR2 — длительность импульса в тактах счётчика (RM0090, разд. 17.3.7). У AVR Timer1 фронт ICES1 переключают после каждого захвата и сбрасывают флаг ICF1 (DS40002061B, разд. 16.6.3).

Что значит флаг CCxOF?

Over-capture: захват случился ещё раз, пока флаг предыдущего захвата CCxIF не был сброшен, и старое значение в CCRx потеряно. RM0090 советует читать данные до проверки этого флага — иначе переполнение, случившееся между чтением флага и чтением данных, останется незамеченным (разд. 17.3.6).

Зачем фильтр на входе захвата?

Чтобы короткая помеха не дала ложный захват. У STM32 фильтр ICxF принимает новый уровень только после нескольких одинаковых отсчётов — в примере RM0090 восьми. У AVR подавитель шума ICNC1 требует четырёх одинаковых отсчётов подряд и добавляет четыре такта задержки (DS40002061B, разд. 16.6.2).

Источники

  1. STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 — разд. 17.3.6 — по фронту на ICx значение счётчика защёлкивается в TIMx_CCRx, ставится CCxIF, при повторном захвате до сброса флага — CCxOF; фильтр ICxF (пример: 8 одинаковых отсчётов на частоте fDTS), фронт CCxP/CCxNP, предделитель ICxPS; данные рекомендуется читать до флага переполнения захвата; 17.3.7 — PWM input mode: два канала на одном входе с противоположными фронтами, ведомый режим сброса, период в CCR1, длительность в CCR2
  2. Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B — разд. 16.6 — блок захвата Timer1: по событию на ICP1 (PB0) или выходе аналогового компаратора TCNT1 копируется в ICR1, ставится ICF1; 16.6.2 — подавитель шума ICNC1: четыре одинаковых отсчёта, плюс 4 такта задержки; 16.6.3 — ICR1 перезаписывается следующим событием, если его не прочли; для измерения заполнения фронт меняют после каждого захвата и сбрасывают ICF1

Нашли ошибку?