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

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

Чт окт 22, 2020 23:21:07

Один период
100'000'000*1/11'111=9000,09Гц при погрешности квантования ±0,81Гц
10 периодов
100'000'000*10/111'111=9000,009Гц при погрешности квантования ±0,081Гц
Да соглашусь, с математикой не поспоришь.

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

Вс ноя 08, 2020 18:08:37

Тема с частотомером заглохла. Короче я опоздал с этой темой на 6 лет. Но я только начал изучать STM так что мне простительно. Частотомер по большому счёту нужен редко. Когда то делал на 176 серии(прямой счёт) и тот забросил. Поднимаю тему потому что при изготовлении можно хорошо изучить таймеры. Я сейчас выложу своё виденье реализации, если не прав поправьте, если есть у кого желание. Повторяю я только в начале пути STM.
1.Измеряем период одного импульса входного с помошью INPUT PWM.
2. умножаем этот период на число, чтобы получилась длительность примерно 1 секунда. Это у нас будет Gate. Число импульсов входной у нас уже есть целое и период этих импульсов тоже есть, их количество вместившееся в примерно 1 секунду.
3.Запускаем ещё один таймер с периодом который мы посчитали. И считаем тактовые импульсы таймера.
4.По формуле просто делим тактовые на те что мы закинули в GATE.
И всё здесь никаких прерываний по моему не надо.
Ход мыслей правильный или я где то ошибся.
Всё по методу Химеры. Только для очень низких частот я пока не вьехал в тему.

Добавлено after 6 hours 49 minutes 24 seconds:
Вот выдержка из даташита. Получается мы получим сигнал сравнения не раньше ,чем через 3 такта.

"OC1FE: Output Compare 1 fast enable
Бит для разрешения "быстрого сравнения" в канале 1. Этот бит используется для ускорения проявления эффекта на выходе канала от воздействия триггерного события на входе.
0: обычное функционирование канала, состояние канала определяется значениями в счётчике и в регистре сравнения CCR1. При работе таймера в подчинённом режиме, минимальная задержка от фронта триггерного сигнала до проявления эффекта, составляет 5 периодов тактового сигнала.
1: активный фронт триггерного сигнала воздействует на выход канала как срабатывание схемы сравнения. В результате на выходе устанавливается соответствующий совпадению уровень, независимо от результата сравнения. Задержка от выборки триггерного сигнала до воздействия на выход канала сокращается до 3 тактов. Бит действует только при работе канала в режиме PWM1 или PWM2." Значение в регистре CCR буде правильным , но получить сигнал о захвате мы сможем не ранее 3 тактов опорной. Я так понял эту выдержку. ?

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

Вт дек 22, 2020 06:29:32

Теория: Нам нужно измерить количество тактовых импульсов между фронтами 1 импульса и N импульса. Между ними около 1сек

Ваши 1 и 2 пункт не правильно определяют время между 1 иN импульсом. По одному периоду нельзя точно определить этот интервал.

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

Вт дек 22, 2020 13:19:31

bob1, он примерно определит время, потом прикинет сколько периодов уместиться в 1 сек. Мутный алгоритм, может его и можно будет до ума довести, только незачем, есть более внятные способы.

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

Вт дек 22, 2020 20:18:17

уместиться в 1 сек
В том то и дело зачем растягивать, если толку нет.
есть более внятные способы
Есть ссылки? Нужно тоже быстро замутить частотомер на stm32. Изучаю тему.
Пока вижу так. Настраиваем TIM2 на Input Capture (захват внешних событий) по фронту нарастания уровня. Тактовые импульсы от опорника. По захвату DMA переносит значение регистра CC2R в память RAM. DMA настроен на цикл. По окончании цикла прерывание, где увеличиваем на +1 переменную. Эта переменная и 16 разрядный счетчика DMA будут копить количество входных импульсов.
1 секунду для можно выждать хоть системным таймером.
По окончании остановить захват. Считать данные из RAM -количество тактовых импульсов от опорника. Количество входных импульсов тоже есть. Дальше известная математика.
Пока не понятно как сделать старт тактов для TIM2 от 1-го импульса...или как быстро считать-запомнить первые захваченные данные с регистра CC2R .

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

Вт дек 22, 2020 22:19:02

В том то и дело зачем растягивать, если толку нет.

Видимо по результатам замера и надеется понять, есть толк или нет, входная частота неизвестна. Совсем мутный алгоритм.

Пока вижу так...

Очень расточительно по ресурсам, я делал по другому. Некий симбиоз способов прямого и обратного счета, свободный от недостатков обоих способов падения точности по разным краям диапазона. Получилось обойтись совсем без критических по скорости мест, все аппаратно. Но не каждый STM32 так сможет, у меня был 303, задействовано 4 таймера, компаратор и 4 пина. Смысл алгоритма в подсчете фронтов опорной частоты между несколькими фронтами входной частоты. По этим значениям вычисляется входная частота. Изюминка в том, что погрешность во всем диапазоне частот зависит только от длины интервала измерения, стабильности и величины опорной частоты, ну и неидеальности входного формирователя естественно (дрейф, шум). Естественно такое достигается только если весь этот огород работает синхронно. Основная сложность как раз в этом и была, один таймер там только и делает, что запускает и тормозит остальную связку. Требование фактически только одно - в течении интервала измерения должно прийти хотя бы два фронта входного сигнала.
Изображение
Сверху калибратор осциллографа, снизу нога кварца STM32F103, время измерения 200 мс. Все знаки стабильны (можно было и добавить, но данная функция девайса не основная, а второстепенная и входные цепи не очень приспособлены под частотомер).
Впервые упоминание о таком алгоритме, применительно к мелким 8-битным МК, встречал лет 10-15 назад по моему на электрониксе. Попробую поискать.

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

Ср дек 23, 2020 08:15:31

4 пина
Это много. Не подходит. Если убрать компаратор, то должно быть меньше.
Смысл алгоритма в подсчете фронтов опорной частоты между несколькими фронтами входной частоты.
Скорее всего между 2-мя двумя фронтами (не обязательно соседними), а разнесенными на некоторое время. Выше описанный алгоритм и работает по этому принципу.
Попробую поискать
Спасибо. Не нужно. Алгоритм у меня есть.

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

Ср дек 23, 2020 10:51:58

Если убрать компаратор, то должно быть меньше.

Возможно. Нужно обеспечить прохождение входного сигнала на три таймера для старта, захвата и подсчета фронтов.

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

Вс фев 14, 2021 21:09:10

Если не нужен очень точный частотометр, то он делается элементарно.
TIM1 толкает TIM2 10 секунд и за эти 10 сек он подсчитывает частоту. Против
1 секунды мы увеличиваем точность в 10 раз. И усё , для быстрых измерений он не годится , если частота стабильная то самый раз. Код элементарный.
Выкладываю на регистрах для F4

TIM2->CCMR1=0x0101;
TIM2->SMCR=0x4005;
TIM2->CR1=0x0001;

TIM1->PSC=0x833F;
TIM1->CCMR1=0x0070;
TIM1->CCR1=0x3CB0;
TIM1->SMCR=0x0000;
TIM1->BDTR=0x8000;
TIM1->CR2=0x0040;
TIM1->CR1=0x0001;

Добавлено after 1 hour 5 minutes 9 seconds:
Это конечно не обратный счёт, а прямой,но для высоких частот отлично
меряет, а вот низкие конечно погрешность. Уменьшить погрешность на низких
можно увеличением интервала, но 20 секунд ждать это слишком. Другие методы я пока не потянул. Ну для человека 3 месяца изучающего STM это и понятно. Месяц только таймеры пиляю, не просто так ,а каждый бит в регистрах теперь понятен.
Ответить