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

Кто любит RISC в жизни, заходим, не стесняемся.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

alexf58 писал(а):Естественно в зависимости от грубо определенной частоты. Я написал "скажем 2" а не 1 именно чтобы не проскочить. Если большая частота, то хоть 100. Единственная разница с "классическим методом HHIMERA" в том, что определать ме по 1/2 интервала, а по почти полному.
Прибавляем единицу... на малых входных частотах ( до единиц мегагерц входной, зависит от тактовой) вполне хватает... Выше - надо прибавлять больше...
Посмотрите таблицу что я выложил... там так и сделано...
"Я не даю готовых решений, я заставляю думать!"(С)
Реклама
Galizin
Мучитель микросхем
Сообщения: 478
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

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

Сообщение Galizin »

HHIMERA писал(а): Прибавляем единицу
1 не хватить. Допустим до оценки ждем ровно 1 сек. Если период сигнала 0.99999 сек, то можно прочитать из счетчика 1 и установить ARR в 2, но пока мы это рассчитывали и сохраняли счетчик станет 2. Вы будете думать что у вас посчитался 1 период входного сигнала, а на самом деле их будет уже не 1 (а вот сколько - это вопрос). Вероятность этого мала. Но ели уже такое случится, то подсчет частоты будет неверный.
В Вашем случае таким переходным периодом будет где то период полсекунды. Поэтому прибавлять 2 надежнее, хотя и увеличит время измерения до 3 раз иногда.
Можно прибавлять и 1, но после установки ARR сразу проверять состояние таймера. Если они вдруг стали равны, то такое измерение будет недействительным и следующий раз нужно либо прибавлять 2, либо изменить время, после которого производилась оценка ( вместо 1 сек выбрать 0.95 секунды например).
Реклама
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Можно прибавлять и 1, но после установки ARR сразу проверять состояние таймера. Если они вдруг стали равны, то такое измерение будет недействительным и следующий раз нужно либо прибавлять 2, либо изменить время, после которого производилась оценка ( вместо 1 сек выбрать 0.95 секунды например).
Это почему??? В даташите ничего по этому поводу нет... в железе тоже напряга никакого... Ну даже если будет CNT == ARR... ну и что???

Там всё даже интереснее... чем кажется...
Тактовая МК 48MHz... входная 1MHz с другого таймера...

Код: Выделить всё

  TIM2->ARR = 0xFFFFFFFF;
     
  TIM2->CR1 |= TIM_CR1_CEN;            // Counter Enable
     
  Led_Blue_On;   
  Delay_mS(500);
  Led_Blue_Off;
  Delay_mS(500);
     
  cnt_input = TIM2->CNT;  // Здесь имеем  999995

  while(!(TIM2->CNT == 999995));   // Проверяем на соответствие
//  cnt_input = TIM2->CNT;
  TIM2->ARR = 999995;                 // Заносим в ARR 999995
  cnt_input = TIM2->CNT;
  cnt_input = TIM2->CNT;
  cnt_input = TIM2->CNT;
  cnt_input = TIM2->CNT;
  cnt_input = TIM2->CNT;             // Здесь СNT всё ещё 999995
  cnt_input = TIM2->CNT;             // Здесь первый проход даёт ноль, потом 999995
//  cnt_input = TIM2->CNT;           // Здесь, если раскоментить, получаем почти всегда ноль
//  cnt_input = TIM2->CNT;
"Я не даю готовых решений, я заставляю думать!"(С)
Galizin
Мучитель микросхем
Сообщения: 478
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

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

Сообщение Galizin »

Да действительно, где то до мегагерца беспокоится вообще не о чем. 1 достаточно.
Реклама
Эиком - электронные компоненты и радиодетали
alexf58
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Сб фев 09, 2013 23:00:23

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

Сообщение alexf58 »

Чуть в сторону, но не далеко.

Было бы неплохо добавить подстройку по GPS. Можно на том же контроллере. Некоторое время назад я сделал совсем простой прибор для калибровки частотомера. AVR работает от стандартного кварца 20 МГц, но параллельно с одним из конденсаторов стоит варикап. На него напряжение идет от PWM на том же AVR через простой фильтр. Счетчик от тех же 20 МГц захватывает фронты 1 ппс сигнала от GPS. Если больше, чем 20,000,000 то уменьшим напряжение на PWM, меньще - увеличим. Про спектральную частоту речи нет, но захват через примерно пол минуты и дальше в пределах +/- 1.

Понятно, что можно много чего улучшить за счет VCXO, фильтров, и т.д. Но главное, что между -1 и +1 "свободное плаванье". И теперь главная мысль по улучшению с минимумом внешних элементов. На таймере сделаем выходной импульс по достижении 20000000-1. От него линейно заряжаем конденсатор от источника тока, а когда приходит фронт от GPS, делаем sample and hold. Это напряжение пропорционально ощибке от -1 до 1 тупо прибавим с нужным коэффицентом к тому, что идет с PWM. Должно захватить частоту где то в интервале а не отскакивать от стенок -1 и +1.

STM тут идеально подойдет.
Реклама
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

alexf58 писал(а):Было бы неплохо добавить подстройку по GPS.
Лучше разделить приборы. Эталон частоты - это одно, частотомер - другое. В частотомере можно предусмотреть вход внешней опорной частоты.
alexf58 писал(а):Но главное, что между -1 и +1 "свободное плаванье".
Не сказал бы, что это главное. Сигнал 1 PPS на выходе приемника GPS имеет большой джиттер, типично порядка 100 нс, а бывает и до 1 мкс. Такой же порядок имеет период таймера микроконтроллера. Поэтому делать разрешение лучше периода тактовой бессмысленно. Если, конечно, речь не идет о специальных тайминговых приемниках GPS. Повысить точность можно лишь увеличив интервал интегрирования. В эталонах частоты этот интервал имеет порядок часов или десятков часов. Поэтому самое главное - обеспечить высокую кратковременную стабильность генератора на этом интервале. Нужен термостатированный генератор, цепи формирования управляющего напряжения тоже должны быть термостабильными.
alexf58 писал(а):От него линейно заряжаем конденсатор от источника тока, а когда приходит фронт от GPS, делаем sample and hold.
Фактически Вы предлагаете сделать интерполятор. Я такое делал для эталона частоты, смысл имеет с хорошим приемником GPS, где джиттер составляет порядка 10 нс. У меня получилось разрешение 1 нс, но это лишнее.
alexf58 писал(а):STM тут идеально подойдет.
Вот как раз STM32 тут никаким боком. Нет у него никаких особенностей, которые давали бы в этой задаче какие-либо преимущества. На AVR получится то же самое, 10 разрядов АЦП - выше крыши.
Реклама
Аватара пользователя
balmer
Это не хвост, это антенна
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

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

Сообщение balmer »

alexf58 писал(а):AVR работает от стандартного кварца 20 МГц, но параллельно с одним из конденсаторов стоит варикап.
Возможно лучше было бы точно определить частоту генератора и ей пользоваться? Ну вместо 20 МГц будет у нас 20.000.123 Гц. Теоретически это на точность не должно влиять, главное стабильность?

Ну и да, если хочется точности - отдельный генератор питаемый стабильным напряжением при постоянной температуре.
alexf58
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Сб фев 09, 2013 23:00:23

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

Сообщение alexf58 »

Леонид Иванович писал(а):
Лучше разделить приборы. Эталон частоты - это одно, частотомер - другое. В частотомере можно предусмотреть вход внешней опорной частоты.
Я не предлагаю делать эталон - к нему гораздо жестче требования. Я об автокалибровке частотомера практически бесплатно. В моей первой поделке вообще кроме AVR и RC фильтра ничего нет. Но он гарантировано держит частоту в пределах 0.1 ппм.
alexf58 писал(а):Но главное, что между -1 и +1 "свободное плаванье".
Леонид Иванович писал(а): Не сказал бы, что это главное. Сигнал 1 PPS на выходе приемника GPS имеет большой джиттер,
Посмотрел на свой
http://www.ebay.com/itm/Ublox-NEO-6M-GP ... 0911914297

RMS 30 ns
99% <60 ns


Зависит от решаемой задачи. Я предлагаю простой способ слегка увеличить точность очень простыми средствами.

В моем приборе вообще нет PLA, a поддерживается только частота +/- 1. Если добавить именно фазовый детектор, включающийся в работу, когда уже поймали по частоте, с тау фильтра десятки секунд или больше, то кол-во опорных тактов за каждую секунду всегда будет 20К а не 20К +/- 1.
Что и требуется для калибратора.

Фактически Вы предлагаете сделать интерполятор. Я такое делал
Не совсем. Интерполятор добавляет в цифровое значение точности, а я предлагаю добавить к цифровому FLL чисто аналоговый PLL. Использовать напряжение пропорциональное фазе непосредственно, а не через цифру. Есть разница.

Вот как раз STM32 тут никаким боком. Нет у него никаких особенностей, которые давали бы в этой задаче какие-либо преимущества. На AVR получится то же самое, 10 разрядов АЦП - выше крыши.
Несколько резко...

1. ADC мне вообще ни к чему. A вот встроенный DAC пригодится. Получше чем PWM у AVR.
2. У STM32 много таймеров и легко одновременно считать такты, формировать импульс на выходе на интервал {N-1, N+1}. Да и частоту можно мерить на том же MPU.
3. Точность повышается даже без интерполяции за счет более высокой тактовой частоты. Опору 10 МГц можно внутри умножить на 5 или даже 7.


balmer писал(а): Возможно лучше было бы точно определить частоту генератора и ей пользоваться?

Если в одном флаконе, я собственно так и предлагал несколькими страницами назад: еще одним таймером захватывать 1 PPS и учитывать в рассчетах.
Но свой калибратор я собрал "на коленке" для подстройки древнего фабричного частотомера (DSI 5612). Там и генератор в печке, но куда он уплыл за 20 лет, хз. Вот и подстроил. Потому что играл с довольно узкополосными радиомодулями на 915 МГц. Для этого 0.1 ппм самое то что надо.
Последний раз редактировалось alexf58 Чт ноя 27, 2014 22:40:37, всего редактировалось 1 раз.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

alexf58 писал(а):Интерполятор добавляет в цифровое значение точности, а я предлагаю добавить к цифровому FLL чисто аналоговый PLL.
Так не надо делать, нужно получить уточненное значение именно в цифровом виде. Тогда можно будет выставить на VCO точное управляющее напряжение даже в автономном режиме, подстроившись перед этим по 1 pps и сохранив значение в EEPROM. А вот аналоговая петля требует все время наличия импульсов 1 pps.
alexf58 писал(а):1. ADC мне вообще ни к чему. A вот встроенный DAC пригодится. Получше чем PWM у AVR.
Применительно к управлению VCO - большой вопрос, что лучше, DAC или PWM. DAC имеет температурную зависимость, а PWM легко привязать с помощью одного логического элемента к любой опоре, причем все это легко поместить внутрь термостата. Для эталона на AVR делал комбинированный ЦАП на PWM + Delta-Sigma.
alexf58 писал(а):2. У STM32 много таймеров и легко одновременно считать такты, формировать импульс на выходе на интервал {N-1, N+1}. Да и частоту можно мерить на том же MPU.
Какое отношение MPU имеет к измерению частоты? Защита памяти для частотомера, вроде, не является жизненно необходимой. Или Вы планируете применять RTOS?
alexf58 писал(а):3. Точность повышается даже без интерполяции за счет более высокой тактовой частоты. Опору 10 МГц можно внутри умножить на 5 или даже 7.
Это тоже очень интересный вопрос - на счет применимости PLL STM32 для таких задач. Встречал сообщения, что выходная частота PLL STM32 испытывает скачок каждые несколько секунд. Это не считая фазового шума.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Встречал сообщения, что выходная частота PLL STM32 испытывает скачок каждые несколько секунд.
Интересно, интересно... Кто-то проверял... или это ОБС???
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
balmer
Это не хвост, это антенна
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

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

Сообщение balmer »

Леонид Иванович писал(а): Встречал сообщения, что выходная частота PLL STM32 испытывает скачок каждые несколько секунд. Это не считая фазового шума.
А вот классно бы еще измерить кроме частоты - среднеквадратичное отклонение, уход со временем. Ну и фазовый шум тоже приятно было бы измерить. Незнаю это стандартные фичи для частотометра или нет?

Плавно увожу дисскуссию в сторону :)))
alexf58
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Сб фев 09, 2013 23:00:23

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

Сообщение alexf58 »

Леонид Иванович писал(а): Какое отношение MPU имеет к измерению частоты?
Одним постом выше:
>>>Я не предлагаю делать эталон - к нему гораздо жестче требования. Я об автокалибровке частотомера практически бесплатно.

Еще раз: учитывая многочисленные таймеры в STM32F103, легко добавить в частотомер (обсуждаемый в теме) функцию калибровки по 1 pps от GPS.
Но заодно бесплатно получаем не слишком высококачественный, но эталон. Которым можно проверить другой частотомер.

И речь шла только о том, как с помощью "палки и веревки" улучшить поведение: заставить держать фазу относительно постоянной, а не только частоту +/-1.

Если Вы знаете причину, по которой это не будет работать, пожалуйста скажите. То, что эталон можно сделать лучше, сомнений не вызывает.

А заодно, еще одна идея. И в статье из QST от 1998 описан прибор с цифровой PLL на PIC. Используется второй асинхронный генератор для подсчета разности фаз и этот dithering помогает улучшить разрешение. Что наводит на мысль, пока не до конца оформленную.

STM32 может работать от своего генератора, а один таймер считать кол-во "эталонных" 10 МГц импульсов. Подстраиваем до ровно 10,000,000. Частоту захватили быстро. Потом по фронту 1 ппс запустим таймер считающий внутренние 24 (или 72) МГц до следующего фронта опорных 10 МГц, поделенных на сколько то. Принцип ровно как в статье, но без внешней логики. Дальше цифровая фильтрация этой фазы.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

HHIMERA писал(а):Интересно, интересно... Кто-то проверял... или это ОБС???
Видел такое сообщение на одном из форумов, возможно, от pixar или khach, но что-то не получается сходу найти.

Upd: провел опыт. Есть STM32F407, который работает от внешнего кварца 8 МГц, далее частота умножается с помощью PLL до 168 МГц. Вывел на порт поделенную таймером частоту 168 МГц / 18 = 9.333(3) МГц. Подключил частотомер FC-510, установил минимальное время счета (10 мс) и включил статистику. Получил Fmin = 9333.841 кГц, Fmax = 9333.851 кГц, dF = 10 Гц. Для сравнения задал на генераторе прямоугольных импульсов PG-872 период 0.11 мкс, получил показания частотомера Fmin = 9090.760 кГц, Fmax = 9090.762 кГц, dF = 2 Гц. Решил глянуть, как работает кварцевый генератор на STM, вывел сигнал MCO1 - HSE clock на пин PA8. Получил показания частотомера Fmin = 8000.439 кГц, Fmax = 8000.441 кГц, dF = 2 Гц. Видно, что тактовый сигнал портит PLL. Какие именно там флуктуации частоты, просто шум, или периодические скачки, по дисплею частотомера сказать нельзя, тут нужно на компьютере строить гистограмму. Но и так видно, что для частотомера внутренняя PLL STM32 не годится.
balmer писал(а):А вот классно бы еще измерить кроме частоты - среднеквадратичное отклонение, уход со временем. Ну и фазовый шум тоже приятно было бы измерить. Незнаю это стандартные фичи для частотометра или нет?
Продвинутые частотомеры умеют измерять стандартное отклонение и девиацию Аллана. Дрейф частоты и простейшую статистику может измерять даже мой FC-510. А вот для измерения фазовых шумов частотомера мало, здесь нужен анализатор спектра или специализированный анализатор источников сигнала.
alexf58 писал(а):И речь шла только о том, как с помощью "палки и веревки" улучшить поведение: заставить держать фазу относительно постоянной, а не только частоту +/-1.
Зачем делать плохо, если можно сделать хорошо примерно с теми же затратами? Получив уточненное значение периода pps в цифровом виде, получим возможность запомнить управляющее напряжение генератора и работать без GPS. Какой смысл делать именно аналоговую петлю подстройки?
alexf58 писал(а):Потом по фронту 1 ппс запустим таймер считающий внутренние 24 (или 72) МГц до следующего фронта опорных 10 МГц, поделенных на сколько то.
Большой вопрос, позволят ли таймеры STM32 сделать такое. Да и толку с этого мало - точность ничем не будет отличаться от прямого измерения периода pps с помощью таймера, тактируемого от 24 или 72 МГц. Результат такого измерения тоже можно фильтровать цифровым фильтром.
Аватара пользователя
optima
Прорезались зубы
Сообщения: 232
Зарегистрирован: Вт май 08, 2012 10:42:29

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

Сообщение optima »

Интересно а какой процент из dF = 10 Гц можно переложить на PLL а какой на погрешность кварца! очень интересно как стабильно работает кварц?
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Леонид Иванович писал(а): провел опыт. Есть STM32F407, который работает от внешнего кварца 8 МГц, далее частота умножается с помощью PLL до 168 МГц.
Для простых поделок F4 сильно жирно... интереснее для STM32F0xx или STM32F1xx...
Видно, что тактовый сигнал портит PLL.
300pS при 6nS... и 300pS при 20,8nS немного разные вещи...
ИМХО... не всё так жутко...
и так видно, что для частотомера внутренняя PLL STM32 не годится.
Ну почему... не для эталона конечно, для встроеных систем и эмбедда - вполне... Что теряем??? В самом худшем случае - один разряд...
У STM32F0xx максимальная HSE 32МГц... умножаем на 4... до 128МГц max. потянет... Значит можно и кварц на 32МГц тупо притулить без PLL... для гурманов...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

optima писал(а):Интересно а какой процент из dF = 10 Гц можно переложить на PLL а какой на погрешность кварца! очень интересно как стабильно работает кварц?
Так я же привел для кварца, специально выход генератора на порт вывел. Там dF = 2 Гц. На самом деле, плюс-минус единица младшего разряда - это близко к разрешающей способности частотомера. Поэтому на самом деле вклад PLL еще больше. К тому же, интервал интегрирования у меня был все-таки слишком большой (10 мс), на меньших интервалах картина будет еще хуже. Надо будет попробовать добавить в частотомер интервал измерения 1 мс и посмотреть.
HHIMERA писал(а):Для простых поделок F4 сильно жирно... интереснее для STM32F0xx или STM32F1xx...
Сейчас под рукой есть платы только с F4. Позже проверю на F1.
HHIMERA писал(а):не для эталона конечно, для встроеных систем и эмбедда - вполне...
Конечно, не так все страшно. На больших интервалах джиттер PLL хорошо усредняется, в обычном частотомере ничего заметно не будет. Но пытаться строить какие-то измерители с субтактовым разрешением бессмысленно.
HHIMERA писал(а):Значит можно и кварц на 32МГц тупо притулить без PLL... для гурманов...
Это да. Внешняя опорная частота может быть использована без PLL, тогда никаких проблем не будет.
alexf58
Нашел транзистор. Понюхал.
Сообщения: 183
Зарегистрирован: Сб фев 09, 2013 23:00:23

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

Сообщение alexf58 »

Леонид Иванович писал(а): Получив уточненное значение периода pps в цифровом виде, получим возможность запомнить управляющее напряжение генератора и работать без GPS. Какой смысл делать именно аналоговую петлю подстройки?
Либо я коряво излагаю, либо Вы не внимательно читаете. Давайте чуть подробнее.

Система с обратной связью по частоте оставит небольшую ошибку по частоте. Цифровые методы предполагают дискретность. Да, можно повысить разрешение, можно искусственно увеличить разрядность PWM, и т.д. Но в тех или иных пределах фаза будет набегать пока не дойдет до "чувствительной точки" - очередного цифрового значения.

Система же следящая за фазой после захвата в идеале оставит постоянную ошибку по фазе. Т.е. частота будет точно совпадать.

Естественно с учетом jitter импульсов от GPS, идеальной картины не будет. Но аналоговой петле с большой постоянной времени это должно не сильно мешать.
Леонид Иванович писал(а): Зачем делать плохо, если можно сделать хорошо примерно с теми же затратами?
"Плохо" зависит от задачи. Согласен, что для минимизации ошибки без ГПС у Вас лучше. Я такой задачи не ставил. На моем столе GPS не пропадает никогда. Чем еще мой метод так уж плох?


alexf58 писал(а):Потом по фронту 1 ппс запустим таймер считающий внутренние 24 (или 72) МГц до следующего фронта опорных 10 МГц, поделенных на сколько то.
Большой вопрос, позволят ли таймеры STM32 сделать такое. Да и толку с этого мало - точность ничем не будет отличаться от прямого измерения периода pps с помощью таймера, тактируемого от 24 или 72 МГц. Результат такого измерения тоже можно фильтровать цифровым фильтром.[/quote]

Позволят ли таймеры лучше ответит например HHIMERA, но есть (описанный) режим чтения PWM. Два тригера по фронту и спаду одного и того же импульса. Никто не мешает использовать фронты двух разных сигналов. Поделить 10 МГц можно снаружи на 74хх161, если нельзя использовать внутрений прескейлер, но почти уверен что можно. Один таймер своим выходом управляет другим.

Что касается толку, Вы читали статью? Идея в том, что второй генератор, асинхронный с опорой, создает "шум" статистически повышающий точность.

Interestingly, it is desirable to have the
frequency of U7 drift slightly rather than
being synchronized with the VCXO. A
slight random drift averages out the ±1
count ambiguity that is inherent in any
pulse-counting device. My measurements
indicate that the simple phase-measuring
circuit I use is consistently accurate to 2 or
3 ns (for a 30-second measurement), while
without drift, the resolution would be limited to 42 ns.

Если можно добиться такого результата без внешних цепей, толк таки есть.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

alexf58 писал(а):Система с обратной связью по частоте оставит небольшую ошибку по частоте.
Это почему? К примеру, ПИД-регулятор обеспечивает нулевую статическую ошибку регулируемого параметра за счет бесконечного коэффициента передачи интегратора на нулевой частоте.
alexf58 писал(а):На моем столе GPS не пропадает никогда. Чем еще мой метод так уж плох?
Этим и плох, что все время нужен GPS. И ради чего? Сложность реализации сопоставима с цифровым решением.
Аватара пользователя
Леонид Иванович
Друг Кота
Сообщения: 4779
Зарегистрирован: Сб апр 02, 2011 12:40:46
Откуда: Минск
Контактная информация:

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

Сообщение Леонид Иванович »

Провел опыт с STM32F100. Затактировал от внешнего кварца 8 МГц, далее умножил частоту с помощью PLL до 24 МГц. Вывел на порт поделенную таймером частоту 24 МГц / 3 = 8 МГц. Подключил частотомер, установил время счета 10 мс и включил статистику. Получил Fmin = 8000.645 кГц, Fmax = 8000.649 кГц, dF = 4 Гц. Для сравнения посмотрел сигнал MCO прямо с кварцевого генератора HSE. Получил показания частотомера Fmin = 8000.648 кГц, Fmax = 8000.649 кГц, dF = 1 Гц. Интересно то, что выход PLL в среднем занижен. Повторил измерения много раз (последние разряды сильно плывут от нагрева кварца) - та же картина.
Спойлер

Код: Выделить всё

#include "sys\stm32f10x.h"

extern "C" void SystemInit(void);

void SystemInit(void)
{
  RCC->CR |= RCC_CR_HSEON;                //HSE on
  while((RCC->CR & RCC_CR_HSERDY) == 0);  //wait for HSE ready
  RCC->CFGR |=
    RCC_CFGR_PLLSRC_HSE |                 //HSE as PLL source
    RCC_CFGR_PLLXTPRE_HSE_Div2 |          //8 / 2
    RCC_CFGR_PLLMULL6;                    //      * 6 = 24 MHz
  RCC->CR |= RCC_CR_PLLON;                //PLL on
  while((RCC->CR & RCC_CR_PLLRDY) == 0);  //wait for PLL ready
  RCC->CFGR &= ~RCC_CFGR_SW;              //clear SW bits
  RCC->CFGR |= RCC_CFGR_SW_PLL;           //select PLL as clock source
  while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1); //wait for PLL selected
}

int main(void)
{
  RCC->CFGR |= RCC_CFGR_MCO_0 * 6;        //MCO <- HSE
  RCC->APB2ENR |=
    RCC_APB2ENR_AFIOEN |                  //AF clock enable
    RCC_APB2ENR_IOPAEN;                   //PA clock enable
  GPIOA->CRH =
    GPIO_CRH_CNF8_0  * 2 |                //PA8 AF PP (MCO)
    GPIO_CRH_MODE8_0 * 3 |                //high speed
    GPIO_CRH_CNF9_0  * 2 |                //PA9 AF PP (TIM1 CH2)
    GPIO_CRH_MODE9_0 * 3;                 //high speed

  RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;     //TIM1 clock enable
  TIM1->PSC = 1 - 1;                      //prescaler = 1
  TIM1->ARR = 3 - 1;                      //period = 3 (24 / 3 = 8 MHz)
  TIM1->CCMR1 = TIM_CCMR1_OC2M_0 * 6;     //PWM mode 1
  TIM1->CCR2 = 1;                         //CCR2 value
  TIM1->BDTR |= TIM_BDTR_MOE;             //main output enable
  TIM1->CCER = TIM_CCER_CC2E;             //OC2 enable
  TIM1->CR1 = TIM_CR1_CEN;                //TIM1 enable
  
  while(1);
}
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

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

Сообщение HHIMERA »

Леонид Иванович писал(а):Поэтому на самом деле вклад PLL еще больше. К тому же, интервал интегрирования у меня был все-таки слишком большой (10 мс), на меньших интервалах картина будет еще хуже. Надо будет попробовать добавить в частотомер интервал измерения 1 мс и посмотреть.
"Терзают меня смутные сомнения!"(С)
Что на полке валялось... дискавери F051@48MHz(PLL) и макетка с STM8S103@16MHz... кварцы обычные, ноунэйм... питание от USB-компа... провода между платами обычные, длиной 10см. ... никаких поверок, эталонов и математических обработок... как есть и хуже не придумаешь...
Дискавери в режиме отладки в свободном полёте... два прерывания, системное и TIM3... результат тупо усекался/обрезался до семи знаков, без округления...

На высоких частотах...

Код: Выделить всё

// 8000350   1S      8000356
// 8000350   0.1S    8000356
// 8000344   0.01S   8000361
// 8000326   0.001S  8000503
При 1S и 0.1S разницы не почувствовал... Показания медленно и плавно изменялись от высоких к низким... На 0.01S и 0.001S показания с периодичностью в несколько секунд тупо переключались между двумя значениями, наибольшим и наименьшим...

На низких частотах ситуация была аналогична...

Код: Выделить всё

// 1000.043  1S      1000.044
// 1000.043  0.1S    1000.044
// 1000.043  0.01S   1000.045
// 1000.043  0.001S  1000.064
Как видим... самая удручающая картинка на высоких частотах (несколько МГЦ и выше) при времени измерения 1сек. ... здесь больше сказывается влияние синхронизации таймера... В остальных случаях всё в пределах нормы...
Учитывая, что юзать Peciprocal на высоких частотах просто нет смысла, то как бы и проблемы никакой нет...
"Я не даю готовых решений, я заставляю думать!"(С)
Ответить

Вернуться в «ARM»