Как измерить частоту сигнала таймером STM32?
Обновлено Редакция GAW
Содержание
У таймеров STM32 частоту можно измерить двумя способами — по периоду и по числу импульсов. Оба не зависят от скорости прерываний: фронты отмечает аппаратура.
Захват периода
В режиме захвата входа фронт копирует счётчик в регистр CCRx. Разность двух соседних захватов — период в тактах счётчика:
Ошибка — один такт на измерение, поэтому относительная погрешность растёт с частотой сигнала.
| Сигнал | 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 %. Предделитель и период для своего диапазона подберёт калькулятор таймера.
Источники
- 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)
- STMicroelectronics. RM0440 Rev 9 (STM32G4) и RM0090 Rev 21 (STM32F4) — тот же блок захвата и сравнения у таймеров общего назначения STM32G4 и F4; RM0090, разд. 18.2 — у STM32F4 TIM2 и TIM5 32-битные
Нашли ошибку?
Смотрите также
- Захват входа (input capture)Фронт на выводе копирует значение счётчика таймера в регистр
- Таймер AVR и STM32Предделитель, OCRnA, PSC и ARR под частоту, мёртвое время, энкодер
- Таймеры STM32Тактирование, PSC/ARR, ШИМ, мёртвое время, захват, энкодер, OPM, синхронизация
- Предделитель таймераPrescaler: делитель тактов перед счётчиком таймера