четверг, 23 октября 2025 г.

ESP32 частотомер

Приехали OCXO генераторы на 10 МГц (CTI OSC5A2B02), которые я заказывал для ремонта платы генератора. Я заказывал сразу 5 штук на случай если некоторые из них тоже окажутся нерабочими, но проверка показала что они все работают.

Но вот с частотой вышло не очень, при минимальном напряжении 0 В на подстроечном выводе я измерил частоту выше 10 МГц у каждого из них, а при максимальном напряжении 4 В к частоте добавляется примерно 30 Гц. Если частотомер в моём генераторе не врёт, то меньше 10 000 016 Гц мне получить не удастся.

У меня ещё есть частотомер в тестере кварцевых резонаторов, но единицы Гц он не покажет. Попробовал собрать ещё один частотомер из платы ESP32-S3 и использовать её счётчик импульсов (PCNT) для подсчёта частоты. Этот счётчик 16-битный и им нельзя измерить частоту выше 32 кГц без переполнения. В итоге в настроил счётчик PCNT считать до 30000 и генерировать прерывание по достижению максимального значения. Каждое прерывание увеличивает счётчик переполнений. Каждую секунду счётчик PCNT и количество переполнений сбрасываются и запускается новый счёт. В следующую секунду счёт останавливается и выводится значение частоты (количество переполнений * 30000 + значение счётчика PCNT). В следующую секунду всё повторяется.

Сначала для отсчёта секунд использовал таймеры, но точность оказалась сильно ниже ожидаемой - на 10 МГц с генератора сигналов UTG932E измерение было 9,999598 МГц (ошибка 402 Гц).

Переписал прошивку чтобы интервал измерения брался с прерывания по отдельному пину и подал на него меандр 1 Гц со второго входа генератора сигналов. Точность заметно улучшилась и теперь 10 МГц  были измерены как 9,999965 МГц (ошибка 35 Гц) что заметно лучше чем от встроенного кварцевого резонатора.

Попробовал взять сигнал 1 секунды с выхода PPS модуля GPS U-blox NEO-M8N, результат получился 9,999972 МГц (ошибка 28 Гц). При тестировании заметил что иногда этот сигнал пропадал - скорее это связано с неудачным расположением антенны GPS на подоконнике и приёмник плохо ловит сигнал со спутников.

Из-за заметной погрешности измерений такой частотомер не поможет мне в плане измерения частоты OCXO генераторов, но как первый опыт программирования ESP32 вполне подходит. В процессе написания прошивки наступил на несколько граблей:

  • Когда происходило прерывание по переполнению счётчика PCNT плата перезагружалась с ошибкой "Guru Meditation Error: Core  1 panic'ed (Interrupt wdt timeout on CPU1).". Эта ошибка возникала даже при пустом обработчике прерывания. Оказалось что нужно сбрасывать флаг прерывания в обработчике PCNT.int_clr.val = BIT(PCNT_UNIT);
  • Количество переполнений было в два раза больше ожидаемого, т.к. обработчик вызывался два раза подряд и оказалось что флаг прерывания нужно сбрасывать в самом начале обработчика. 

Комментариев нет:

Отправить комментарий