STM32. Быстрый частотомер. Reciprocal counter.
Re: STM32. Быстрый частотомер. Reciprocal counter.
Я тоже провел (не слишком научный) эксперимент. Discovery с F103 работает от штатного кварца на 8 МГц. Внутри 72 МГц. Два таймера (3 и 9) составляют 32 бита. Захват по секундным импульсам от GPS. Соседние отсчеты отличаются не более чем на 2-3. Из 72,000,000. Тот самый jitter порядка 30-50 нс.
Медленно слегка плавает, поскольку 8 МГц особо не стабилизированы.
При работе ровно той же схемы, но от внешних довольно стабильных (0.1 ппм) 10 мГц картина примерно та же. Т.е. особых проблем с PLL не видно, но, повторю, эксперимент на коленке. Немножко подумаю как лучше это сделать и прикручу к частотомеру вход от GPS, чтобы при наличии импульсов 1 ппс измеренная частота пересчитывалась на эту секунду.
Кстати модули UBLOX (которые у меня) легко переключаятся на частоту выходных импульсов до 1 КГц. Так что хоть аналоговый PLL ставь. Но при использовании процессора сильно не поможет.
Медленно слегка плавает, поскольку 8 МГц особо не стабилизированы.
При работе ровно той же схемы, но от внешних довольно стабильных (0.1 ппм) 10 мГц картина примерно та же. Т.е. особых проблем с PLL не видно, но, повторю, эксперимент на коленке. Немножко подумаю как лучше это сделать и прикручу к частотомеру вход от GPS, чтобы при наличии импульсов 1 ппс измеренная частота пересчитывалась на эту секунду.
Кстати модули UBLOX (которые у меня) легко переключаятся на частоту выходных импульсов до 1 КГц. Так что хоть аналоговый PLL ставь. Но при использовании процессора сильно не поможет.
- Реклама
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: STM32. Быстрый частотомер. Reciprocal counter.
При чем тут большие частоты? Джиттер будет сказываться всегда. А то, что Вы его не видите, так логично, слишком маленькое разрешения. Я же измерения делал с использованием интерполятора.HHIMERA писал(а):Учитывая, что юзать Peciprocal на высоких частотах просто нет смысла, то как бы и проблемы никакой нет...
Re: STM32. Быстрый частотомер. Reciprocal counter.
И еще немного поиграл. Взял вот такой TCXO
http://www.ebay.com/itm/Vectron-20MHz-T ... 1032108148
Он не подстраивается напряжением, а только отверткой. Тот же STM32F103 считает его импульсы между секундными импульсами от UBLOX 6M.
Результаты радуют. За пару часов частота стоит, как часовой, между 20,000,003 20,000,004. Понятно, что последняя цифра будет в любом случае меняться. Очень редко 20,000,002 или 20,000,005. Раз в минуту. Т.е. jitter GPS не велик - не более 50 нс. А главное, модуль за $3 очень неплохо держит частоту.
При напряжении от 4 до 5 вольт уходит на 10 Гц - 0.05 ппм. Это я все к тому что для достаточно точного частотомера пойдет весьма недорогой генератор.
Даже если не встраивать GPS калибратор, можно подстраивать прямо по секундным импульсам с GPS.
А теперь такая мысль. И вопрос в основном к HHIMERA: будет ли работать?
В методе HHIMERA после грубого определения периода входного сигнала, запишем в TIM2->ARR значение N, которое бы в итоге давало импульс не 1 сек, а (при достаточно высокой входной частоте) скажем 10 мс. И не один импульс, а периодичиские. И по этому импульсу будем не gate включать, а capture. Если я правильно понял, можно триггер для capture заводить от внутреннего сигнала. Ну, а если нельзя, то через наружные ножки соединим. Теперь примерно через каждые 10 мс получим кол-во тактовых импульсов на N входных. Т.е. time stamping. И через скажем секунду по 100 таким отсчетам подсчитаем хоть среднее, хоть линейную регрессию построим. Кроме того, если частота не постоянна, то это тоже будет заметно.
http://www.ebay.com/itm/Vectron-20MHz-T ... 1032108148
Он не подстраивается напряжением, а только отверткой. Тот же STM32F103 считает его импульсы между секундными импульсами от UBLOX 6M.
Результаты радуют. За пару часов частота стоит, как часовой, между 20,000,003 20,000,004. Понятно, что последняя цифра будет в любом случае меняться. Очень редко 20,000,002 или 20,000,005. Раз в минуту. Т.е. jitter GPS не велик - не более 50 нс. А главное, модуль за $3 очень неплохо держит частоту.
При напряжении от 4 до 5 вольт уходит на 10 Гц - 0.05 ппм. Это я все к тому что для достаточно точного частотомера пойдет весьма недорогой генератор.
Даже если не встраивать GPS калибратор, можно подстраивать прямо по секундным импульсам с GPS.
А теперь такая мысль. И вопрос в основном к HHIMERA: будет ли работать?
В методе HHIMERA после грубого определения периода входного сигнала, запишем в TIM2->ARR значение N, которое бы в итоге давало импульс не 1 сек, а (при достаточно высокой входной частоте) скажем 10 мс. И не один импульс, а периодичиские. И по этому импульсу будем не gate включать, а capture. Если я правильно понял, можно триггер для capture заводить от внутреннего сигнала. Ну, а если нельзя, то через наружные ножки соединим. Теперь примерно через каждые 10 мс получим кол-во тактовых импульсов на N входных. Т.е. time stamping. И через скажем секунду по 100 таким отсчетам подсчитаем хоть среднее, хоть линейную регрессию построим. Кроме того, если частота не постоянна, то это тоже будет заметно.
Re: STM32. Быстрый частотомер. Reciprocal counter.
Леонид Иванович намерил +-2 герца на 8 мегагерцах за 10 миллисекунд. составляем пропорцию 2гц к 8 Мгц = х к 10мсек. х = 2,5 наносекунд. То есть интервал измерения (обратного частотомера) дрожал в пределах +-2,5наносекунд.
те же 2,5 наносек дрожания на 1секунде измерения приведет к отличию в измерении частоты 100 раз меньшему, то есть +-0,02герца.
В даташите еще про джиттер написано Cycle-to-cycle jitter. То есть это отличие во времени 2 соседних периодов, а это несколько не то что мерил ЛИ.
Иметь 50 нс джиттер pps импульсов по ним судить о 2,5 нс как то некорректно.
У HHIMERA что он мерил и чем непонятно. если частоту 1 килогерц за 1 миллисекунду с точностью в 0,001 герц - то это круто. Если это обратный частотомер, то это соответствует разрешению в 1ппм за 1 миллисекунду,или тактовой частоте порядка гигагерца. Если же это частотомер с интерполятором, то как то измерения не согласуются с измерениями обычного кварца ЛИ. ЛИ говорит что кварц около +-0.5 герца, а тут миллигерцы за время в 10 раз короче.
те же 2,5 наносек дрожания на 1секунде измерения приведет к отличию в измерении частоты 100 раз меньшему, то есть +-0,02герца.
В даташите еще про джиттер написано Cycle-to-cycle jitter. То есть это отличие во времени 2 соседних периодов, а это несколько не то что мерил ЛИ.
Иметь 50 нс джиттер pps импульсов по ним судить о 2,5 нс как то некорректно.
У HHIMERA что он мерил и чем непонятно. если частоту 1 килогерц за 1 миллисекунду с точностью в 0,001 герц - то это круто. Если это обратный частотомер, то это соответствует разрешению в 1ппм за 1 миллисекунду,или тактовой частоте порядка гигагерца. Если же это частотомер с интерполятором, то как то измерения не согласуются с измерениями обычного кварца ЛИ. ЛИ говорит что кварц около +-0.5 герца, а тут миллигерцы за время в 10 раз короче.
Re: STM32. Быстрый частотомер. Reciprocal counter.
На слух как-то тяжело воспринимается... но не суть... А что мешает самому попробовать???alexf58 писал(а):Если я правильно понял, можно триггер для capture заводить от внутреннего сигнала. Ну, а если нельзя, то через наружные ножки соединим. Теперь примерно через каждые 10 мс получим кол-во тактовых импульсов на N входных. Т.е. time stamping. И через скажем секунду по 100 таким отсчетам подсчитаем хоть среднее, хоть линейную регрессию построим. Кроме того, если частота не постоянна, то это тоже будет заметно.
Если с внешним соединением будет лучше и точнее... то ради бога... а иначе просто не вижу смысла...
Я же написал... что на полке было... как есть... из говна и палок...Galizin писал(а):У HHIMERA что он мерил и чем непонятно. если частоту 1 килогерц за 1 миллисекунду с точностью в 0,001 герц - то это круто. Если это обратный частотомер, то это соответствует разрешению в 1ппм за 1 миллисекунду,или тактовой частоте порядка гигагерца.
Режим Reciprocal counter... Всё что больше семи разрядов безжалостно отсекалось...
Формат полученных данных - наименьшее значение, время измерения, наибольшее значение... остальное по тексту...
Никаких "1 килогерц за 1 миллисекунду с точностью в 0,001 герц" у меня не было... как и задачи повышения разрешения... Просто проверил... вкладывается результат в допустимые нормы или нет...
Никакого интерполятора у меня не было... и никакого матана...Если же это частотомер с интерполятором
"Я не даю готовых решений, я заставляю думать!"(С)
- Реклама
Re: STM32. Быстрый частотомер. Reciprocal counter.
Я ожидаю улучшения не от внешнего соединения - оно потребуется только если я неправильно понял datasheet и реально нельзя делять capture внутреннего сигнала.
Главная мысль в том, чтобы не останавливать счетчик, а считывать значения на лету. Вроде в этом состоит современный метод time stamping.
Если никто не говорит что это бред, попробую обязательно. А то плата с STM32F103 и графическим экраном лежит без дела.
Galizin: где я судил о 2.5 нс? Все что я хотел сказать:
1. модуль UBLOX за $12 прекрасно ловит на собственную антену на столе в 2 метрах от окна 5-6 спутников и jitter как заявлено ~30 ns
2. TCXO за $3 после прогрева в пол часа за СУТКИ не ушел даже на 0.1 ппм
А кварц на плате STM32 таки слегка гуляет и jitter побольше, но не смертельно.
Главная мысль в том, чтобы не останавливать счетчик, а считывать значения на лету. Вроде в этом состоит современный метод time stamping.
Если никто не говорит что это бред, попробую обязательно. А то плата с STM32F103 и графическим экраном лежит без дела.
Galizin: где я судил о 2.5 нс? Все что я хотел сказать:
1. модуль UBLOX за $12 прекрасно ловит на собственную антену на столе в 2 метрах от окна 5-6 спутников и jitter как заявлено ~30 ns
2. TCXO за $3 после прогрева в пол часа за СУТКИ не ушел даже на 0.1 ппм
А кварц на плате STM32 таки слегка гуляет и jitter побольше, но не смертельно.
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: STM32. Быстрый частотомер. Reciprocal counter.
Не то нажал...
Последний раз редактировалось Леонид Иванович Сб дек 06, 2014 11:12:55, всего редактировалось 1 раз.
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: STM32. Быстрый частотомер. Reciprocal counter.
Это не бред. Построение линейной регрессии по ряду отсчетов - это фактически низкочастотная фильтрация, только не постоянного сигнала, а линейно меняющегося сигнала. Обычно это используют в частотомерах с интерполятором, тогда фильтруется шум интерполятора. Темп накопления отсчетов как раз и связан с временем преобразования интерполятора. Без интерполятора тоже какой-то эффект будет, будет фильтроваться джиттер и осуществляться статистическое уточнение значения, но тут эффект менее предсказуем. Для реализации метода необходимо "на лету" получать согласованные пары отсчетов "номер фронта входного сигнала - количество периодов опорного сигнала на момент этого фронта". Реализация в ПЛИС это сделать позволяет, а вот позволяют ли таймеры STM32 - вопрос.alexf58 писал(а):Вроде в этом состоит современный метод time stamping. Если никто не говорит что это бред, попробую обязательно.
Результаты впечатляющие. Про 1000 Гц вообще молчу, но даже на 8 МГц разрешение для выбранного времени счета при опорной частоте 16 МГц в 5 раз превышает теоретически возможное. У меня с выключенным интерполятором на интервале 10 мс значение 8 МГц болтается примерно на ±50 Гц, что соответствует теории. Ну и разницы между выходом кварцевого генератора и PLL, естественно, не видно.Galizin писал(а):У HHIMERA что он мерил и чем непонятно. если частоту 1 килогерц за 1 миллисекунду с точностью в 0,001 герц - то это круто.
Re: STM32. Быстрый частотомер. Reciprocal counter.
Не вижу почему нет. Итак, мы знаем что частота грубо скажем 1 КГц. Ставим верх счерчика входных импульсов на скажем 100. Ровно каждые 100 импульсов, примерно 10 раз в секунду, таймер дает событие update, по которому другой таймер делает захват опорной частоты. Скажем 10 МГц или 72, если очень хочется. Т.е. записываем "время", т.е. число тактовых импульсов, а кол-во фронтов ровно 100. Если входной сигнал порядка мегагерца, пусть счетчик считает до 0хffff. Соответственно записываем каждые 64К фронтов 15 раз в секунду. Даже при входной частоте 32 МГц и 16 битах таймера, отсчеты через 2 мсек. Несложно обработать. А на случай если частота не постоянно, построим график на дисплее.Леонид Иванович писал(а): а вот позволяют ли таймеры STM32 - вопрос.
Чем плохо?
Я прекрасно понимаю что интерполятор даст лучше разрешение, но хочется добиться наилучшего результата без внешних цепей. Не то что жалко CPLD и 3 транзистора, но хочется использовать готовую плату с STM32.
Re: STM32. Быстрый частотомер. Reciprocal counter.
"Юзера дурковали по чёрному!"(С)...Леонид Иванович писал(а):Результаты впечатляющие. Про 1000 Гц вообще молчу, но даже на 8 МГц разрешение для выбранного времени счета при опорной частоте 16 МГц в 5 раз превышает теоретически возможное. У меня с выключенным интерполятором на интервале 10 мс значение 8 МГц болтается примерно на ±50 Гц, что соответствует теории. Ну и разницы между выходом кварцевого генератора и PLL, естественно, не видно.Galizin писал(а):У HHIMERA что он мерил и чем непонятно. если частоту 1 килогерц за 1 миллисекунду с точностью в 0,001 герц - то это круто.
Я потерялся и перестал понимать происходящее... Что вас так смутило??? Может кто-нибудь объяснить по этому поводу???
Я не верю, что отладчик Кейла что-то там шаманит и подсовывает мне райские яблоки... но всякое бывает...
"Я не даю готовых решений, я заставляю думать!"(С)
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: STM32. Быстрый частотомер. Reciprocal counter.
Допустим, измеряем частоту 1 кГц при измерительном интервале 1 мс и опорной частоте 16 МГц. В измерительный интервал будет всегда умещаться один период входной частоты, т.е. N = 1. Количество периодов опорной частоты может быть M = 16000±1. Допустим M = 16000. Тогда Fin = Fref * N / M = 16000000 * 1 / 16000 = 1000.000 Гц. Если M = 15999, то Fin = 16000000 * 1 / 15999 = 1000.063 Гц. Это и есть разрешение на данной частоте, никаких промежуточных значений мы получить не можем. Соответственно, min и max не могут отличаться на меньшую величину. Для выяснения, в чем глюк, нужно вывести еще N и M.
Re: STM32. Быстрый частотомер. Reciprocal counter.
Хорошо... "сначала и по нотам"...
TIM_clk = 48004080.0;
Время измерения 1 мС...
Сигнал с STM8S "как есть"... тупо поделённый с 16МГц... Насколько там точны 1000Гц мне неизвестно...
В основном наблюдаю такой результат... Изредка такой... Иногда такой... что в общем ни на что не влияет... Что не так???
TIM_clk = 48004080.0;
Время измерения 1 мС...
Сигнал с STM8S "как есть"... тупо поделённый с 16МГц... Насколько там точны 1000Гц мне неизвестно...
В основном наблюдаю такой результат... Изредка такой... Иногда такой... что в общем ни на что не влияет... Что не так???
"Я не даю готовых решений, я заставляю думать!"(С)
Re: STM32. Быстрый частотомер. Reciprocal counter.
Вроде да.Леонид Иванович писал(а):вот позволяют ли таймеры STM32 - вопрос.
ведущий таймер ECE бит External clock mode 2 enabled, MMS биты в 011 Compare Pulse режим, OC1M в режим 001: Set channel 1 to active level on match . Использовать только 1 CCR.
Ведомый - CC2S в 11: CC2 channel is configured as input, IC2 is mapped on TRC, TS -в нужный Internal Trigger. Можно использовать любой CCR а не только 2.
Предсказание срабатывания уже нужно будет записывать в CCR а не в ARR.
Также в качестве trigger можно использовать compare режим с формированием trigger через togge по сравнению. Или Force low и hight on compare для того же.
Я уже это писал. Вот alexf58 предложил для того же использовать PWM как это делает HHIMERA.
Зачем же себя так ограничивать. Дождались что сработал захват, в прерывании увеличили суммы для регрессии, выяснили min & max для оценки джитера. А далее как предложил HHIMERA, грубо оценили частоту по текущим данным, если она < мегагерца то просто установили срабатывание CCR = CNT + 1; Если больше - то вместо 1 нужно взять например 100 или опять таки рассчитать на основании текущей частоты. Ждать следующего захвата. Так пока не истечет интервал измерения. По истечении интервала измерения сосчитали частоту методом наименьших квадратов, вывели на экран. А в это время ничего не останавливается и продолжает считаться в прерывании для следующего отображения.alexf58 писал(а):записываем каждые 64К фронтов 15 раз в секунду
- Леонид Иванович
- Друг Кота
- Сообщения: 4779
- Зарегистрирован: Сб апр 02, 2011 12:40:46
- Откуда: Минск
- Контактная информация:
Re: STM32. Быстрый частотомер. Reciprocal counter.
Теперь всё ясно. Запутала фраза:HHIMERA писал(а):Что не так???
Из нее непонятно, что является частотомером, а что - генератором. До этого речь шла об измерении джиттера PLL, логично было предположить, что частотомер тактируется от 16 МГц кварца, и измеряется сигнал, полученный с помощью PLL. Оказывается, наоборот. При Fref = 48 МГц Ваши результаты прекрасно совпадают с теорией.HHIMERA писал(а):Что на полке валялось... дискавери F051@48MHz(PLL) и макетка с STM8S103@16MHz... кварцы обычные, ноунэйм...
Re: STM32. Быстрый частотомер. Reciprocal counter.
Понял... "каждый о своём"... На STM8S103 так просто частотомер с reciprocal не сделать... Там нужен или STM8S903... или STM8L15x...Леонид Иванович писал(а): Из нее непонятно, что является частотомером, а что - генератором. До этого речь шла об измерении джиттера PLL, логично было предположить, что частотомер тактируется от 16 МГц кварца, и измеряется сигнал, полученный с помощью PLL.
Меня же... больше интересовало влияние PLL в частотомере, а не в источнике... отсюда и неразбериха случилась...
"Я не даю готовых решений, я заставляю думать!"(С)
Re: STM32. Быстрый частотомер. Reciprocal counter.
Это уже обсудили один раз. Зачем снова? Я не останавливался на деталях, а только предложил не включать/останавливать таймер, а делать capture непрерывно. Попробую, доложу.Galizin писал(а): грубо оценили частоту по текущим данным, если она < мегагерца то просто установили срабатывание CCR = CNT + 1; Если больше - то вместо 1 нужно взять например 100 или опять таки рассчитать на основании текущей частоты.
Re: STM32. Быстрый частотомер. Reciprocal counter.
Попробовал, ради спортивного интереса... витиевато, но работает...HHIMERA писал(а):На STM8S103 так просто частотомер с reciprocal не сделать...
На точность особо не гонял... Если всё сложится, то получится самый дешёвый... за пол-копейки (на STM8S003)... частотомер с Reciprocal counter... до 64МГц... без внешних соединений и навесов...
"Я не даю готовых решений, я заставляю думать!"(С)
Re: STM32. Быстрый частотомер. Reciprocal counter.
Извините пожалуйста. Сначала я дал ссылку на статью с кратким пересказом, потом описал словами как можно сделать. Я позволил себе сделать предположение что Вы не поняли и расписал все с точностью до битов и алгоритмов. К сожалению я уже не могу удалить это сообщение.alexf58 писал(а): Зачем снова? Я не останавливался на деталях,
Итого есть 4 идеи формирования сигнала, который может быть захвачен, это если оба pwm считать за один. Сможете , проверьте. К сожалению сейчас совсем нет времени заняться эти самому.
На stm8 вроде такие же таймеры. Ну немножко усеченные по функционалу и количестов их поменьше, и 32 разрядного таймера нет. Соединение таймеров есть. Почему же им не работать?
Re: STM32. Быстрый частотомер. Reciprocal counter.
В STM8S003F3/103F3 нет ETR... значит только до половины тактовой... в STM8S003K3/103K3 ETR есть...
А вот таймера между собой не вяжутся... маловато флэша для sprintf... и.т.д. ... но в принципе всё решаемо...
STM8S903 и STM8L15X юзать особого смысла нет... по цене и функционалу лучше взять STM32F030 или STM32F050 и не маяться...
А вот таймера между собой не вяжутся... маловато флэша для sprintf... и.т.д. ... но в принципе всё решаемо...
STM8S903 и STM8L15X юзать особого смысла нет... по цене и функционалу лучше взять STM32F030 или STM32F050 и не маяться...
"Я не даю готовых решений, я заставляю думать!"(С)
Re: STM32. Быстрый частотомер. Reciprocal counter.
(; Если точнее то таймеры которые вяжутся отсутвуют в s003HHIMERA писал(а): А вот таймера между собой не вяжутся...
Ну тогда остается только wait mode.


