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

Частотомер на STM32F401

Сб ноя 11, 2023 00:42:22

https://drive.google.com/file/d/1KyRss0 ... sp=sharing // архив проекта в CubeIDE.
https://drive.google.com/file/d/12iExBB ... sp=sharing //видео работы частотомера.
Последний раз редактировалось linkov1959 Сб ноя 11, 2023 09:27:48, всего редактировалось 2 раз(а).

Re: Частотомер на STM32F401

Сб ноя 11, 2023 02:29:56

?

Re: Частотомер на STM32F401

Сб ноя 11, 2023 08:49:59

Аlex, файлы грузятся? Описание сегодня будет.
https://drive.google.com/file/d/12iExBB ... drive_link
401f.jpg
(68.46 KiB) Скачиваний: 111

B10 - RES, B1 - DC для дисплея.
Для отладки использую выход MCO(А8) , его нужно соединить с А0, А1. Время измерения 0.5 сек, 6-7 знаков стабильны. Тим5 в режиме захвата считает тактовые тики 125Мгц, Тим2 считает импульсы измеряемой частоты со входа ETR , Тим4 каждые 0.5 сек в прерывании по переполнению включает прерывание по захвату Тим5, в котором это прерывание запрещается и по разности показаний счетчиков за измеряемый интервал рассчитывается частота. Настройки в Кубе.
Диапазон частот 0.1 Гц - 50Мгц.
Стартуем.
HAL_TIM_Base_Start(&htim2); // В кубе выставить тактирование ETR2, остальное по умолчанию.
HAL_TIM_Base_Start_IT(&htim4); // В кубе настроить прерывание через 0.5с или другое.
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_2); // В кубе выставить канал 2 Input Capture, включить прерывание , остальное по умолчанию.

Прерывание Тим4, время измерения.
void TIM4_IRQHandler(void)
{
/* USER CODE BEGIN TIM4_IRQn 0 */
NVIC_EnableIRQ(50);
snprintf(str1, 96,"%.6f", f1); // В настройках куба разрешить printf_Float.
ST7735_WriteString(0, 0,str1 , Font_11x18, ST7735_GREEN, ST7735_BLACK);
...

Прерывание захвата.
void TIM5_IRQHandler(void)
{
/* USER CODE BEGIN TIM5_IRQn 0 */
NVIC_DisableIRQ(50);
n2=TIM5->CCR2;
ni2= TIM2->CNT;
n=n2-n1;
n1=n2;
ni=ni2-ni1;
ni1=ni2;
f1=125000000.0/n;
f1=f1*ni;
...

Переменные.
/* USER CODE BEGIN EV */
uint32_t n1=0;
uint32_t n2=0;
uint32_t ni1=0;
uint32_t ni2=0;
uint32_t ni=0;
uint32_t n=0;
char str1[96]={0,};
float f1=0.0;
...

Таймеры работают без остановок.
Библиотеку для дисплея SPI ST7735 брал отсюда.
https://www.youtube.com/watch?v=scd0yFtdpJs

Re: Частотомер на STM32F401

Сб ноя 11, 2023 11:38:41

//видео работы частотомера.

Оно, 1000000 G(h)z мерит.

Re: Частотомер на STM32F401

Сб ноя 11, 2023 13:15:12

Для отладки использую выход MCO(А8)

C синхронным сигналом HSE не считается. :-) Включите асинхронный HSI.

Тим4 каждые 0.5 сек в прерывании по переполнению включает прерывание по захвату Тим5, в котором это прерывание запрещается

Во первых, запрет прерываний не запрещает захват, по приходу события регистр всё равно обновится. Во вторых, фронт входного сигнала может прийти между событием, вызывающем прерыванием и командой чтения регистра. Это будет вызывать периодические ошибки.

Re: Частотомер на STM32F401

Сб ноя 11, 2023 13:38:29

Andrey_B, я тестировал с LSE/4. Нужно прежде посмотреть осциллом на сигнал, бывает фигня. Захват не мешает. Ошибок не замечал. По идее должны быть ошибки, если предыдущее показание счетчика больше и разность отрицательна, но это не наблюдается. Сначала делал условие перед расчетом, но потом отказался. Чем проще, тем понятней.
codenamehawk, этот частотомер измеряет Герцы, а не Херцы!:)

Re: Частотомер на STM32F401

Пн ноя 13, 2023 13:03:24

linkov1959 писал(а):этот частотомер измеряет Герцы, а не Херцы!:

И я об этом, если хотите чтобы было как у всех, то герцы, английскими символами обозначают Hz, а Gz ближе всего к GHz.
Впрочем каждый сам себе художник, делайте как получается.

Re: Частотомер на STM32F401

Пн ноя 13, 2023 16:38:18

codenamehawk, На видео нельзя исправить, но в программе можно.
snprintf(str1, 96,"%.6f", f1);// выводится то, что в кавычках. Вам должно понравиться :
snprintf(str1, 96,"%.6f Hz ", f1);

Re: Частотомер на STM32F401

Пн ноя 13, 2023 18:35:07

linkov1959, Нужно писать Гц . :)

Re: Частотомер на STM32F401

Пн ноя 13, 2023 19:25:49

240265, Я и написал Гц, а получились бяки, это автор библиотеки виноват :)

Добавлено after 38 minutes 46 seconds:
Библиотечку для дисплея SPI ST7735 хорошую с кириллицей где взять? Даже поворота экрана в моей нет.

Re: Частотомер на STM32F401

Сб ноя 25, 2023 20:13:57

Ещё одна версия частотомера на STM32F401. Вход А0. Перед чтением показаний таймеров каналы синхронно закрываются, после чтения открываются. Исключается вероятность захвата между чтениями двух таймеров. Ведущий TIM2 по захвату с входа А0 считает импульсы и управляет захватом TIM5, который считает системные тики. TIM10 отвечает за время счета 0.5сек.
https://drive.google.com/file/d/1heW0HQ ... drive_link //архив проекта в CubeIDE.
К сожалению, в кубе нельзя настроить нужный режим для TIM2. Эти строки нужно вписать вручную вместо тех, что делает куб в настройках TIM2.
sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;

Re: Частотомер на STM32F401

Вс ноя 26, 2023 18:34:28

Логика пока такая.
if(flag==1)//время измерения прошло.
{
//выключение каналов.
//Сохранение свежих данных с каналов.
//включение каналов.
//Извлечение ранее сохраненных данных.
//Расчет частоты.
//Замещение ранее сохраненных данных на свежие.
//Вывод частоты.
//Сброс флага.
}
Что бы реализовать конвейер будем данные каналов сохранять в массивы m[](канал измеряемых импульсов) и n[](канал тактовых импульсов).
Ещё нам понадобится сдвигать данные этих массивов(по 4 значения) вправо такой строкой.
for(i=3;i>0;i--) m[i]= m[i-1], n[i]= n[i-1];

Re: Частотомер на STM32F401

Пн ноя 27, 2023 18:33:46

А куда вставить строку сдвига?
if(flag==1)//время измерения прошло.
{
//выключение каналов.
//Сохранение свежих данных с каналов в начало массивов n[] и m[].
//включение каналов.
//Извлечение ранее сохраненных данных c конца массивов n[] и m[].
//Расчет частоты по данным начала и конца массивов n[] и m[].
//Вывод частоты.
for(i=3;i>0;i--) m[i]= m[i-1], n[i]= n[i-1];//сдвиг вправо массивов n[] и m[]
//Сброс флага.
}
Где-то так.

Re: Частотомер на STM32F401

Чт ноя 30, 2023 12:49:43

Входной формирователь частотомера.
вхЧ.jpg
(18.4 KiB) Скачиваний: 104

Re: Частотомер на STM32F401

Чт ноя 30, 2023 13:18:59

74hc132 при питании 3,3 в низкая частота работы

Re: Частотомер на STM32F401

Чт ноя 30, 2023 14:41:16

Игорь2111, там больше транзистор ограничивает, на ВЧ будет другая схема.

Re: Частотомер на STM32F401

Пт дек 01, 2023 20:17:58

На ВЧ от 50 МГц обычно 50 Ом, но мало вольт для входов STM. Тут поможет повышающий ВЧ трансформатор. Низкие и средние частоты до 50Мгц оптимально полевик BF998R на входе и HC132 или другой триггер Шмидта.

Re: Частотомер на STM32F401

Пт дек 01, 2023 23:26:54

NXP выпуск 998ых двухзатворных полевиков прекратил в 2019.
И ели они 15-20 ма
Сейчас рекомендуют в ВЧ биполярники при 3,3 в мшу 2SC3099 3ма.
Тригер Шмидта на входе МК мне кажется лишний.
Последний раз редактировалось Игорь2111 Пт дек 01, 2023 23:44:34, всего редактировалось 1 раз.

Re: Частотомер на STM32F401

Пт дек 01, 2023 23:43:14

Игорь2111, с тюнера на спутник выдрал биполярник на 12 Гиг и поставил в схему с ОЭ вместо BC546 - по частоте выигрыш небольшой, а чуйка на низах упала в разы. А какую схему посоветуешь?
Посмотрел входа на STM - там Шмидт заложен, может обойдемся без внешнего?

Re: Частотомер на STM32F401

Сб дек 02, 2023 12:48:20

Испытал конвейер на stm32f401, 125Мгц. Время измерения 4сек, 8 выборок по 0.5сек. Тут уже флоат не катит, только double. На 1Мгц стабильны сотые герца. На GD407, 390Мгц будет получше.
https://drive.google.com/file/d/14Goot0 ... drive_link // видео.
https://drive.google.com/file/d/1dkZ1zB ... sp=sharing // проект в кубе.
Ответить