Частотомер на STM32F401
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Частотомер на STM32F401
https://drive.google.com/file/d/1KyRss0 ... sp=sharing // архив проекта в CubeIDE.
https://drive.google.com/file/d/12iExBB ... sp=sharing //видео работы частотомера.
https://drive.google.com/file/d/12iExBB ... sp=sharing //видео работы частотомера.
Последний раз редактировалось linkov1959 Сб ноя 11, 2023 09:27:48, всего редактировалось 2 раза.
- Реклама
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
Аlex, файлы грузятся? Описание сегодня будет.
https://drive.google.com/file/d/12iExBB ... drive_link 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
https://drive.google.com/file/d/12iExBB ... drive_link 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
-
codenamehawk
- Вымогатель припоя
- Сообщения: 528
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Re: Частотомер на STM32F401
[uquote="linkov1959",url="/forum/viewtopic.php?p=4501030#p4501030"]//видео работы частотомера.[/uquote]
Оно, 1000000 G(h)z мерит.
Оно, 1000000 G(h)z мерит.
- Andrey_B
- Сверлит текстолит когтями
- Сообщения: 1101
- Зарегистрирован: Пт апр 09, 2010 16:06:38
- Откуда: Тула
Re: Частотомер на STM32F401
[uquote="linkov1959",url="/forum/viewtopic.php?p=4501102#p4501102"]Для отладки использую выход MCO(А8)[/uquote]
C синхронным сигналом HSE не считается.
Включите асинхронный HSI.
[uquote="linkov1959",url="/forum/viewtopic.php?p=4501102#p4501102"]Тим4 каждые 0.5 сек в прерывании по переполнению включает прерывание по захвату Тим5, в котором это прерывание запрещается[/uquote]
Во первых, запрет прерываний не запрещает захват, по приходу события регистр всё равно обновится. Во вторых, фронт входного сигнала может прийти между событием, вызывающем прерыванием и командой чтения регистра. Это будет вызывать периодические ошибки.
C синхронным сигналом HSE не считается.
[uquote="linkov1959",url="/forum/viewtopic.php?p=4501102#p4501102"]Тим4 каждые 0.5 сек в прерывании по переполнению включает прерывание по захвату Тим5, в котором это прерывание запрещается[/uquote]
Во первых, запрет прерываний не запрещает захват, по приходу события регистр всё равно обновится. Во вторых, фронт входного сигнала может прийти между событием, вызывающем прерыванием и командой чтения регистра. Это будет вызывать периодические ошибки.
- Реклама
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
Andrey_B, я тестировал с LSE/4. Нужно прежде посмотреть осциллом на сигнал, бывает фигня. Захват не мешает. Ошибок не замечал. По идее должны быть ошибки, если предыдущее показание счетчика больше и разность отрицательна, но это не наблюдается. Сначала делал условие перед расчетом, но потом отказался. Чем проще, тем понятней.
codenamehawk, этот частотомер измеряет Герцы, а не Херцы!:)
codenamehawk, этот частотомер измеряет Герцы, а не Херцы!:)
-
codenamehawk
- Вымогатель припоя
- Сообщения: 528
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Re: Частотомер на STM32F401
И я об этом, если хотите чтобы было как у всех, то герцы, английскими символами обозначают Hz, а Gz ближе всего к GHz.linkov1959 писал(а):этот частотомер измеряет Герцы, а не Херцы!:
Впрочем каждый сам себе художник, делайте как получается.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
codenamehawk, На видео нельзя исправить, но в программе можно.
snprintf(str1, 96,"%.6f", f1);// выводится то, что в кавычках. Вам должно понравиться :
snprintf(str1, 96,"%.6f Hz ", f1);
snprintf(str1, 96,"%.6f", f1);// выводится то, что в кавычках. Вам должно понравиться :
snprintf(str1, 96,"%.6f Hz ", f1);
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
240265, Я и написал Гц, а получились бяки, это автор библиотеки виноват 
Добавлено after 38 minutes 46 seconds:
Библиотечку для дисплея SPI ST7735 хорошую с кириллицей где взять? Даже поворота экрана в моей нет.
Добавлено after 38 minutes 46 seconds:
Библиотечку для дисплея SPI ST7735 хорошую с кириллицей где взять? Даже поворота экрана в моей нет.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
Ещё одна версия частотомера на 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;
https://drive.google.com/file/d/1heW0HQ ... drive_link //архив проекта в CubeIDE.
К сожалению, в кубе нельзя настроить нужный режим для TIM2. Эти строки нужно вписать вручную вместо тех, что делает куб в настройках TIM2.
sSlaveConfig.InputTrigger = TIM_TS_TI1FP1;
sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
Логика пока такая.
if(flag==1)//время измерения прошло.
{
//выключение каналов.
//Сохранение свежих данных с каналов.
//включение каналов.
//Извлечение ранее сохраненных данных.
//Расчет частоты.
//Замещение ранее сохраненных данных на свежие.
//Вывод частоты.
//Сброс флага.
}
Что бы реализовать конвейер будем данные каналов сохранять в массивы m[](канал измеряемых импульсов) и n[](канал тактовых импульсов).
Ещё нам понадобится сдвигать данные этих массивов(по 4 значения) вправо такой строкой.
for(i=3;i>0;i--) m= m[i-1], n= n[i-1];
if(flag==1)//время измерения прошло.
{
//выключение каналов.
//Сохранение свежих данных с каналов.
//включение каналов.
//Извлечение ранее сохраненных данных.
//Расчет частоты.
//Замещение ранее сохраненных данных на свежие.
//Вывод частоты.
//Сброс флага.
}
Что бы реализовать конвейер будем данные каналов сохранять в массивы m[](канал измеряемых импульсов) и n[](канал тактовых импульсов).
Ещё нам понадобится сдвигать данные этих массивов(по 4 значения) вправо такой строкой.
for(i=3;i>0;i--) m= m[i-1], n= n[i-1];
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
А куда вставить строку сдвига?
if(flag==1)//время измерения прошло.
{
//выключение каналов.
//Сохранение свежих данных с каналов в начало массивов n[] и m[].
//включение каналов.
//Извлечение ранее сохраненных данных c конца массивов n[] и m[].
//Расчет частоты по данным начала и конца массивов n[] и m[].
//Вывод частоты.
for(i=3;i>0;i--) m= m[i-1], n= n[i-1];//сдвиг вправо массивов n[] и m[]
//Сброс флага.
}
Где-то так.
if(flag==1)//время измерения прошло.
{
//выключение каналов.
//Сохранение свежих данных с каналов в начало массивов n[] и m[].
//включение каналов.
//Извлечение ранее сохраненных данных c конца массивов n[] и m[].
//Расчет частоты по данным начала и конца массивов n[] и m[].
//Вывод частоты.
for(i=3;i>0;i--) m= m[i-1], n= n[i-1];//сдвиг вправо массивов n[] и m[]
//Сброс флага.
}
Где-то так.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
Входной формирователь частотомера.
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: Частотомер на STM32F401
74hc132 при питании 3,3 в низкая частота работы
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
Игорь2111, там больше транзистор ограничивает, на ВЧ будет другая схема.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
На ВЧ от 50 МГц обычно 50 Ом, но мало вольт для входов STM. Тут поможет повышающий ВЧ трансформатор. Низкие и средние частоты до 50Мгц оптимально полевик BF998R на входе и HC132 или другой триггер Шмидта.
-
Игорь2111
- Встал на лапы
- Сообщения: 108
- Зарегистрирован: Вс май 15, 2022 23:04:19
- Откуда: Белгородская обл.
Re: Частотомер на STM32F401
NXP выпуск 998ых двухзатворных полевиков прекратил в 2019.
И ели они 15-20 ма
Сейчас рекомендуют в ВЧ биполярники при 3,3 в мшу 2SC3099 3ма.
Тригер Шмидта на входе МК мне кажется лишний.
И ели они 15-20 ма
Сейчас рекомендуют в ВЧ биполярники при 3,3 в мшу 2SC3099 3ма.
Тригер Шмидта на входе МК мне кажется лишний.
Последний раз редактировалось Игорь2111 Пт дек 01, 2023 23:44:34, всего редактировалось 1 раз.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
Игорь2111, с тюнера на спутник выдрал биполярник на 12 Гиг и поставил в схему с ОЭ вместо BC546 - по частоте выигрыш небольшой, а чуйка на низах упала в разы. А какую схему посоветуешь?
Посмотрел входа на STM - там Шмидт заложен, может обойдемся без внешнего?
Посмотрел входа на STM - там Шмидт заложен, может обойдемся без внешнего?
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: Частотомер на STM32F401
Испытал конвейер на 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 // проект в кубе.
https://drive.google.com/file/d/14Goot0 ... drive_link // видео.
https://drive.google.com/file/d/1dkZ1zB ... sp=sharing // проект в кубе.


