Вероятно я не сделаю частотомер с интерполятором на stm32. Поэтому изложу основную идею, вдруг кому понадобится.
Идея в общем не моя и лежит здесь
http://leoniv.livejournal.com/129151.htmlТо есть использовать интерполятор на простых триггерах. Измерить напряжение на конденсаторе интерполятора до разряда и после разряда. По разнице судить о величине отставания фронта сигнала от фронта образцового генератора. Два таких измерения дадут две временные метки между фронтами измерительного сигнала. Временные метки определяются с помощью интерполятора с высокой точностью, так в 100-1000 превышающей период образцовой частоты.
Собственно после этого остается подсчитать количество периодов измеряемой частоты между этими двумя метками - и дело в шляпе. остается разделить одно на другое и получить требуемую частоту.
Вот тут то и заключена основная идея. Прямой подсчет вполне возможен, но при попадании фронта сигнала где то близко к фронту образцового возможна неточность в подсчете +-1 единица, связано с неопределенными задержками в контроллере и неизвестностью точного времени когда в каком такте контроллера будет точно захвачен фронт. Кроме того если сигнал измеряется с делением, то прямой подсчет вообще невозможен так как измерительная частота больше образцовой.
Поэтому предлагаю подсчитывать количество импульсов косвенно. Сначала подсчитать с помощью описанного здесь метода частоту приблизительно с достаточной степенью точности. Потом на основании подсчитанной частоты и временных меток путем расчета (деления) получаем количество периодов измерительного сигнала. Количество периодов округляется до целого (по смыслу это целое число), а потом уже на основании этого количества рассчитываем точное значение частоты или периода.
Точность измерения частоты цифровым способом должна быть такой что бы подсчет количества давал бы точность лучше чем +-0.5 периода частоты входного сигнала. Для сокращения времени измерения можно также применить регрессию по нескольким точкам. По моим прикидкам получалось что вполне можно измерять частоты до 100 мегагерц в течение примерно 100 микросекунд или даже лучше. Основная задержка была в необходимости перезарядки ищмерительного конденсатора в течение этого времени, ну и в мощности вычислителя, что бы успеть сделать все прикидки. С другой стороны можно сделать измерение всех значений, а расчет уже производить потом, вне измерительного интервала. Данный принцип применим не только к stm32, но и к любому другому, который реализует обратный частотомер. Просто на stm32 это можно сделать без каких либо внешних компонент. Также можно увеличивать точность делая регрессию по нескольким точкам измерения уже периода. То есть делать накопление данных как цифрового измерителя так и аналогового с последующим их обсчетом (или на лету если позволит мощность вычислителя).
Была даже идея калибровки нелинейности интерполятора. Нелинейность возникает из-за нелинейности зависимости емкости от напряжения на p-n переходах. Для этого нужно было использовать 2 близко настроенных кварцевых генератора, один как образцовый а второй как измерительный. Разность частот установить герц в 1-3. После измерить интерполятором расстояние от фронта измерительного сигнала до фронта образцового. Это расстояние нарастает линейно от измерения к измерению. Отсюда можно сделать выводы о линейности интерполятора и при необходимости скорректировать ее на основании таблицы или формулы полученной при калибровке и таким образом увеличить точность.