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

Как измерить частоту сигнала таймером STM32?

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

У таймеров STM32 частоту можно измерить двумя способами — по периоду и по числу импульсов. Оба не зависят от скорости прерываний: фронты отмечает аппаратура.

Захват периода

В режиме захвата входа фронт копирует счётчик в регистр CCRx. Разность двух соседних захватов — период в тактах счётчика:

f=fCNTN2−N1f = \frac{f_\text{CNT}}{N_2 - N_1}

Ошибка — один такт на измерение, поэтому относительная погрешность растёт с частотой сигнала.

СигналfCNT = 1 МГцfCNT = 72 МГц72 МГц, ICxPSC = 8
50 Гц20 000 тактов, 0,005 %переполнение 16 бит—
1 кГц1000 тактов, 0,1 %72 000 — нужен 32-битный таймер—
100 кГц10 тактов, 10 %720 тактов, 0,14 %0,017 %
1 МГц1 такт — бесполезно72 такта, 1,4 %0,17 %

Расчёт наш, ошибка ±1 такт. Предделитель захвата ICxPSC (RM0008, разд. 15.4.7) захватывает каждое 2, 4 или 8-е событие, и разность делят на это число — ошибка падает во столько же раз. Частоту счёта задаёт предделитель таймера.

Счёт импульсов

Для высоких частот удобнее перевернуть задачу: подать сигнал как внешний такт таймера — например, на вход ETR в режиме внешнего такта 2 (RM0008, разд. 15.3.3) — и прочитать, сколько импульсов пришло за известный интервал, отмеренный другим таймером. Наш расчёт: за 100 мс при 1 МГц накопится 100 000 импульсов — больше 16 бит, поэтому нужен 32-битный таймер или счёт переполнений; ошибка ±1 — 0,001 %; на низких частотах способ хуже, потому что импульсов за интервал мало.

Практика

  • Для меандра и ШИМ есть режим PWM input: период и длительность сразу в CCR1 и CCR2.
  • Включите фильтр ICxF, если на входе возможен дребезг или звон фронтов.
  • Длинные периоды без переполнений удобно мерить 32-битным таймером, у STM32F4 это TIM2 и TIM5; поля регистров таймеров STM32G4 — на странице регистров таймеров STM32G4.

Период счёта и предделитель подбирает калькулятор таймера, все режимы описаны в статье «Таймеры STM32».

Похожие вопросы

Как не потерять захват при переполнении счётчика?

Считать переполнения прерыванием обновления и добавлять к разности (ARR + 1) на каждое переполнение между захватами — либо взять 32-битный таймер, где переполнений на практике не будет. Если два захвата пришли раньше, чем программа прочла CCRx, ставится флаг CCxOF; RM0008 советует читать данные до проверки этого флага.

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

Режимом PWM input: два канала слушают один вход TI1, первый ловит нарастающий фронт, второй — спадающий, а ведомый режим сброса обнуляет счётчик каждый период. После этого CCR1 — период, CCR2 — длительность импульса в тактах (RM0008, разд. 15.3.6). Работает только на каналах 1 и 2.

Сколько бит таймера хватит для 50 Гц?

Наш расчёт: при счёте 72 МГц период 50 Гц — 1,44 млн тактов, 16-битный счётчик переполнится 21 раз. Предделитель до 1 МГц даёт 20 000 тактов — помещается в 16 бит с ошибкой 0,005 %. Предделитель и период для своего диапазона подберёт калькулятор таймера.

Источники

  1. STMicroelectronics. RM0008 Rev 21 (STM32F101…F107) — 15.3.5 — захват: по фронту ICx счётчик копируется в TIMx_CCRx, флаг CCxIF, при повторном захвате до сброса флага — CCxOF; данные читать до флага переполнения; фильтр ICxF; 15.3.6 — режим PWM input: период в CCR1, длительность в CCR2, ведомый режим сброса, только каналы 1 и 2; 15.4.7 — IC1PSC: захват на каждом 1, 2, 4 или 8-м событии; 15.3.3 — внешний такт, режим 2 (вход ETR)
  2. STMicroelectronics. RM0440 Rev 9 (STM32G4) и RM0090 Rev 21 (STM32F4) — тот же блок захвата и сравнения у таймеров общего назначения STM32G4 и F4; RM0090, разд. 18.2 — у STM32F4 TIM2 и TIM5 32-битные

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