Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: STM32. Быстрый частотомер. Reciprocal counter.

Чт дек 04, 2014 11:50:59

Я тоже провел (не слишком научный) эксперимент. 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 ставь. Но при использовании процессора сильно не поможет.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Чт дек 04, 2014 15:12:15

HHIMERA писал(а):Учитывая, что юзать Peciprocal на высоких частотах просто нет смысла, то как бы и проблемы никакой нет...


При чем тут большие частоты? Джиттер будет сказываться всегда. А то, что Вы его не видите, так логично, слишком маленькое разрешения. Я же измерения делал с использованием интерполятора.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Пт дек 05, 2014 01:51:22

И еще немного поиграл. Взял вот такой 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 таким отсчетам подсчитаем хоть среднее, хоть линейную регрессию построим. Кроме того, если частота не постоянна, то это тоже будет заметно.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Пт дек 05, 2014 22:57:48

Леонид Иванович намерил +-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 раз короче.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Пт дек 05, 2014 23:33:41

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.

Пт дек 05, 2014 23:57:55

Я ожидаю улучшения не от внешнего соединения - оно потребуется только если я неправильно понял datasheet и реально нельзя делять capture внутреннего сигнала.

Главная мысль в том, чтобы не останавливать счетчик, а считывать значения на лету. Вроде в этом состоит современный метод time stamping.
Если никто не говорит что это бред, попробую обязательно. А то плата с STM32F103 и графическим экраном лежит без дела.


Galizin: где я судил о 2.5 нс? Все что я хотел сказать:
1. модуль UBLOX за $12 прекрасно ловит на собственную антену на столе в 2 метрах от окна 5-6 спутников и jitter как заявлено ~30 ns
2. TCXO за $3 после прогрева в пол часа за СУТКИ не ушел даже на 0.1 ппм

А кварц на плате STM32 таки слегка гуляет и jitter побольше, но не смертельно.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Сб дек 06, 2014 10:17:18

Не то нажал...
Последний раз редактировалось Леонид Иванович Сб дек 06, 2014 11:12:55, всего редактировалось 1 раз.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Сб дек 06, 2014 11:10:43

alexf58 писал(а):Вроде в этом состоит современный метод time stamping. Если никто не говорит что это бред, попробую обязательно.


Это не бред. Построение линейной регрессии по ряду отсчетов - это фактически низкочастотная фильтрация, только не постоянного сигнала, а линейно меняющегося сигнала. Обычно это используют в частотомерах с интерполятором, тогда фильтруется шум интерполятора. Темп накопления отсчетов как раз и связан с временем преобразования интерполятора. Без интерполятора тоже какой-то эффект будет, будет фильтроваться джиттер и осуществляться статистическое уточнение значения, но тут эффект менее предсказуем. Для реализации метода необходимо "на лету" получать согласованные пары отсчетов "номер фронта входного сигнала - количество периодов опорного сигнала на момент этого фронта". Реализация в ПЛИС это сделать позволяет, а вот позволяют ли таймеры STM32 - вопрос.

Galizin писал(а):У HHIMERA что он мерил и чем непонятно. если частоту 1 килогерц за 1 миллисекунду с точностью в 0,001 герц - то это круто.


Результаты впечатляющие. Про 1000 Гц вообще молчу, но даже на 8 МГц разрешение для выбранного времени счета при опорной частоте 16 МГц в 5 раз превышает теоретически возможное. У меня с выключенным интерполятором на интервале 10 мс значение 8 МГц болтается примерно на ±50 Гц, что соответствует теории. Ну и разницы между выходом кварцевого генератора и PLL, естественно, не видно.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Сб дек 06, 2014 12:03:53

Леонид Иванович писал(а): а вот позволяют ли таймеры STM32 - вопрос.


Не вижу почему нет. Итак, мы знаем что частота грубо скажем 1 КГц. Ставим верх счерчика входных импульсов на скажем 100. Ровно каждые 100 импульсов, примерно 10 раз в секунду, таймер дает событие update, по которому другой таймер делает захват опорной частоты. Скажем 10 МГц или 72, если очень хочется. Т.е. записываем "время", т.е. число тактовых импульсов, а кол-во фронтов ровно 100. Если входной сигнал порядка мегагерца, пусть счетчик считает до 0хffff. Соответственно записываем каждые 64К фронтов 15 раз в секунду. Даже при входной частоте 32 МГц и 16 битах таймера, отсчеты через 2 мсек. Несложно обработать. А на случай если частота не постоянно, построим график на дисплее.

Чем плохо?

Я прекрасно понимаю что интерполятор даст лучше разрешение, но хочется добиться наилучшего результата без внешних цепей. Не то что жалко CPLD и 3 транзистора, но хочется использовать готовую плату с STM32.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Сб дек 06, 2014 13:07:29

Леонид Иванович писал(а):
Galizin писал(а):У HHIMERA что он мерил и чем непонятно. если частоту 1 килогерц за 1 миллисекунду с точностью в 0,001 герц - то это круто.

Результаты впечатляющие. Про 1000 Гц вообще молчу, но даже на 8 МГц разрешение для выбранного времени счета при опорной частоте 16 МГц в 5 раз превышает теоретически возможное. У меня с выключенным интерполятором на интервале 10 мс значение 8 МГц болтается примерно на ±50 Гц, что соответствует теории. Ну и разницы между выходом кварцевого генератора и PLL, естественно, не видно.

"Юзера дурковали по чёрному!"(С)...
Я потерялся и перестал понимать происходящее... Что вас так смутило??? Может кто-нибудь объяснить по этому поводу???
Я не верю, что отладчик Кейла что-то там шаманит и подсовывает мне райские яблоки... но всякое бывает...

Re: STM32. Быстрый частотомер. Reciprocal counter.

Сб дек 06, 2014 14:02:09

Допустим, измеряем частоту 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.

Сб дек 06, 2014 15:13:17

Хорошо... "сначала и по нотам"...

TIM_clk = 48004080.0;
Время измерения 1 мС...
Сигнал с STM8S "как есть"... тупо поделённый с 16МГц... Насколько там точны 1000Гц мне неизвестно...

В основном наблюдаю такой результат...
freq_1.PNG
(65.67 KiB) Скачиваний: 916

Изредка такой...
freq_2.PNG
(66.38 KiB) Скачиваний: 865

Иногда такой... что в общем ни на что не влияет...
freq_3.PNG
(65.39 KiB) Скачиваний: 829


Что не так???

Re: STM32. Быстрый частотомер. Reciprocal counter.

Сб дек 06, 2014 15:47:39

Леонид Иванович писал(а):вот позволяют ли таймеры 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.

alexf58 писал(а):записываем каждые 64К фронтов 15 раз в секунду

Зачем же себя так ограничивать. Дождались что сработал захват, в прерывании увеличили суммы для регрессии, выяснили min & max для оценки джитера. А далее как предложил HHIMERA, грубо оценили частоту по текущим данным, если она < мегагерца то просто установили срабатывание CCR = CNT + 1; Если больше - то вместо 1 нужно взять например 100 или опять таки рассчитать на основании текущей частоты. Ждать следующего захвата. Так пока не истечет интервал измерения. По истечении интервала измерения сосчитали частоту методом наименьших квадратов, вывели на экран. А в это время ничего не останавливается и продолжает считаться в прерывании для следующего отображения.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Сб дек 06, 2014 15:57:00

HHIMERA писал(а):Что не так???


Теперь всё ясно. Запутала фраза:

HHIMERA писал(а):Что на полке валялось... дискавери F051@48MHz(PLL) и макетка с STM8S103@16MHz... кварцы обычные, ноунэйм...


Из нее непонятно, что является частотомером, а что - генератором. До этого речь шла об измерении джиттера PLL, логично было предположить, что частотомер тактируется от 16 МГц кварца, и измеряется сигнал, полученный с помощью PLL. Оказывается, наоборот. При Fref = 48 МГц Ваши результаты прекрасно совпадают с теорией.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Сб дек 06, 2014 16:31:02

Леонид Иванович писал(а):Из нее непонятно, что является частотомером, а что - генератором. До этого речь шла об измерении джиттера PLL, логично было предположить, что частотомер тактируется от 16 МГц кварца, и измеряется сигнал, полученный с помощью PLL.

Понял... "каждый о своём"... На STM8S103 так просто частотомер с reciprocal не сделать... Там нужен или STM8S903... или STM8L15x...
Меня же... больше интересовало влияние PLL в частотомере, а не в источнике... отсюда и неразбериха случилась...

Re: STM32. Быстрый частотомер. Reciprocal counter.

Сб дек 06, 2014 21:18:14

Galizin писал(а): грубо оценили частоту по текущим данным, если она < мегагерца то просто установили срабатывание CCR = CNT + 1; Если больше - то вместо 1 нужно взять например 100 или опять таки рассчитать на основании текущей частоты.


Это уже обсудили один раз. Зачем снова? Я не останавливался на деталях, а только предложил не включать/останавливать таймер, а делать capture непрерывно. Попробую, доложу.

Re: STM32. Быстрый частотомер. Reciprocal counter.

Вс дек 07, 2014 12:22:15

HHIMERA писал(а):На STM8S103 так просто частотомер с reciprocal не сделать...

Попробовал, ради спортивного интереса... витиевато, но работает...
На точность особо не гонял... Если всё сложится, то получится самый дешёвый... за пол-копейки (на STM8S003)... частотомер с Reciprocal counter... до 64МГц... без внешних соединений и навесов... :))) :music:

Re: STM32. Быстрый частотомер. Reciprocal counter.

Пн дек 08, 2014 11:13:36

alexf58 писал(а): Зачем снова? Я не останавливался на деталях,

Извините пожалуйста. Сначала я дал ссылку на статью с кратким пересказом, потом описал словами как можно сделать. Я позволил себе сделать предположение что Вы не поняли и расписал все с точностью до битов и алгоритмов. К сожалению я уже не могу удалить это сообщение.
Итого есть 4 идеи формирования сигнала, который может быть захвачен, это если оба pwm считать за один. Сможете , проверьте. К сожалению сейчас совсем нет времени заняться эти самому.

На stm8 вроде такие же таймеры. Ну немножко усеченные по функционалу и количестов их поменьше, и 32 разрядного таймера нет. Соединение таймеров есть. Почему же им не работать?

Re: STM32. Быстрый частотомер. Reciprocal counter.

Пн дек 08, 2014 12:01:11

В STM8S003F3/103F3 нет ETR... значит только до половины тактовой... в STM8S003K3/103K3 ETR есть...
А вот таймера между собой не вяжутся... маловато флэша для sprintf... и.т.д. ... но в принципе всё решаемо...

STM8S903 и STM8L15X юзать особого смысла нет... по цене и функционалу лучше взять STM32F030 или STM32F050 и не маяться...

Re: STM32. Быстрый частотомер. Reciprocal counter.

Пн дек 08, 2014 14:42:02

HHIMERA писал(а):А вот таймера между собой не вяжутся...

(; Если точнее то таймеры которые вяжутся отсутвуют в s003
Ну тогда остается только wait mode.
Ответить