CubeIDE особенности измерения частоты и периода.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
CubeIDE особенности измерения частоты и периода.
Частотомер штука точная и требует особого подхода. Таймеры STM32 это могут делать, но требуют глубоких знаний по их устройству и настройки.
Частотомер должен точно измерять высокие частоты, низкие, период и длительность импульсов, а это связано с разными режимами таймеров.
На помощь приходит CubeIDE и встроенный туда CubeMX. Идея в том, что бы настроить таймеры в кубе мышкой, написать пару строчек простого кода и всё, что нам нужно, частота, период и др. лежит в переменных, которые выводим куда захотим и процессор при этом не загружаем.
Добавлено after 1 hour 3 minutes 9 seconds:
ВЧ частоту считаем по входу TIM2_ETR за 1сек, которую дает TIM1 в связке по железу. Таймер 5 измеряет период и длительность импульса по входу 1канала. Добавлено after 1 hour 18 minutes 21 second:
Запускаем таймеры
HAL_TIM_Base_Start_IT(&htim1);
HAL_TIM_Base_Start(&htim2);
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_2);
Добавлено after 3 minutes 21 second:
Колбеки.
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM5)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
period = HAL_TIM_ReadCapturedValue(&htim5, TIM_CHANNEL_1)+2;
pulse = HAL_TIM_ReadCapturedValue(&htim5, TIM_CHANNEL_2)+2;
}
}
}
Добавлено after 3 minutes 38 seconds:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim1)
{
count = __HAL_TIM_GET_COUNTER(&htim2);
HAL_TIM_Base_Stop_IT(&htim1);
__HAL_TIM_SET_COUNTER(&htim2, 0x0000);
HAL_TIM_Base_Start_IT(&htim1);
}
}
Добавлено after 3 minutes 33 seconds:
period, pulse, count - это всё, что нам нужно.
Частотомер должен точно измерять высокие частоты, низкие, период и длительность импульсов, а это связано с разными режимами таймеров.
На помощь приходит CubeIDE и встроенный туда CubeMX. Идея в том, что бы настроить таймеры в кубе мышкой, написать пару строчек простого кода и всё, что нам нужно, частота, период и др. лежит в переменных, которые выводим куда захотим и процессор при этом не загружаем.
Добавлено after 1 hour 3 minutes 9 seconds:
ВЧ частоту считаем по входу TIM2_ETR за 1сек, которую дает TIM1 в связке по железу. Таймер 5 измеряет период и длительность импульса по входу 1канала. Добавлено after 1 hour 18 minutes 21 second:
Запускаем таймеры
HAL_TIM_Base_Start_IT(&htim1);
HAL_TIM_Base_Start(&htim2);
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_2);
Добавлено after 3 minutes 21 second:
Колбеки.
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM5)
{
if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
{
period = HAL_TIM_ReadCapturedValue(&htim5, TIM_CHANNEL_1)+2;
pulse = HAL_TIM_ReadCapturedValue(&htim5, TIM_CHANNEL_2)+2;
}
}
}
Добавлено after 3 minutes 38 seconds:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim1)
{
count = __HAL_TIM_GET_COUNTER(&htim2);
HAL_TIM_Base_Stop_IT(&htim1);
__HAL_TIM_SET_COUNTER(&htim2, 0x0000);
HAL_TIM_Base_Start_IT(&htim1);
}
}
Добавлено after 3 minutes 33 seconds:
period, pulse, count - это всё, что нам нужно.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: CubeIDE особенности измерения частоты и периода.
Мне кажется одного таймера будет мало.А вы используете преывание по входу?
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: CubeIDE особенности измерения частоты и периода.
ivan dimir, естественно, для измерения частоты нужно минимум три таймера: один считает длительность входных импульсов, второй считает количество импульсов за секунду. А узнать, что прошла именно секунда, ему поможет третий таймер.
Далее, как я уже в другой теме говорил: в зависимости от количества импульсов и длительности выбираем тот или другой метод измерения, чем значительно повышаем точность.
Ну и, конечно, никакого калокуба! Калом пользуются лишь абдуринщики. А их копропродукцию все прекрасно видели...
Далее, как я уже в другой теме говорил: в зависимости от количества импульсов и длительности выбираем тот или другой метод измерения, чем значительно повышаем точность.
Ну и, конечно, никакого калокуба! Калом пользуются лишь абдуринщики. А их копропродукцию все прекрасно видели...
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: CubeIDE особенности измерения частоты и периода.
Я знаю сайт правда по AVR .Ну это можно использовать и в Stm32.Там всё просто.принцип такой
используем внешнее прерывание и один таймер.
Спойлер
Код: Выделить всё
#include <mega8.h>
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#include <stdio.h>
unsigned long i = 0, freq=0;
char lcd_buf[33];
interrupt [EXT_INT0] void ext_int0_isr(void)
{
i++;
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
freq=i;
i=0;
TCNT1H=0x00;
TCNT1L=0x00;
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;
PORTD=0xFF;
DDRD=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
GICR|=0x40;
MCUCR=0x03;
GIFR=0x40;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Global enable interrupts
#asm("sei")
lcd_init(8);
while (1)
{
sprintf(lcd_buf,"freq=%d",freq);
lcd_gotoxy(0,0);
lcd_puts(lcd_buf);
};
}- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CubeIDE особенности измерения частоты и периода.
Это самый топорный способ измерения частоты. На высокой частоте будет лагать. И чем выше входная частота, тем будет ниже точность измерения.ivan dimir писал(а):Там всё просто.принцип такой
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: CubeIDE особенности измерения частоты и периода.
Скажите на на какую максимальную частоту можно работать по входу прерыванию?Ну например stm411CEU?
Добавлено after 1 minute 55 seconds:
Ну эта программа написана в ХАЛ библиотека.Не так ли.
Добавлено after 1 minute 55 seconds:
Ну эта программа написана в ХАЛ библиотека.Не так ли.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: CubeIDE особенности измерения частоты и периода.
Не надо GPIO EXTI! Есть же таймеры в режиме захвата! А они чуть ли не до полной тактовой частоты умеют. А у некоторых линеек МК — даже выше!
И повторюсь: измерять длительность импульса можно лишь для низких частот. Для высоких нужно считать, сколько их штук в секунду (или несколько секунд). Точность будет выше. Абы разрядности хватило и частотных свойств.
И еще раз: КАЛ — это адов отстой для нищих разумом. Ни в коем случае эту дрянь нельзя использовать!
И повторюсь: измерять длительность импульса можно лишь для низких частот. Для высоких нужно считать, сколько их штук в секунду (или несколько секунд). Точность будет выше. Абы разрядности хватило и частотных свойств.
И еще раз: КАЛ — это адов отстой для нищих разумом. Ни в коем случае эту дрянь нельзя использовать!
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: CubeIDE особенности измерения частоты и периода.
Спойлер
Код: Выделить всё
HAL_TIM_Base_Start_IT(&htim1);
HAL_TIM_Base_Start(&htim2);
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_1);
HAL_TIM_IC_Start_IT(&htim5, TIM_CHANNEL_2);- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CubeIDE особенности измерения частоты и периода.
Это просто разрешения прерываний от таймеров. Это не их настройка.ivan dimir писал(а):меня заинтересовали вот эти строки.
Настройку выложил ТС в картинках. И подписал, для чего нужен каждый таймер.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: CubeIDE особенности измерения частоты и периода.
Спойлер
Код: Выделить всё
И еще раз: КАЛ — это адов отстой для нищих разумом. Ни в коем случае эту дрянь нельзя использовать!- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: CubeIDE особенности измерения частоты и периода.
ivan dimir, Вы перепутали, Eddy_Em - не ТС 
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: CubeIDE особенности измерения частоты и периода.
Я извеняюсь.Был после дня рождения.Но всё таки эти строки.В прерывании первый таймер.А второй? А пятый использовано два входа?
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: CubeIDE особенности измерения частоты и периода.
Идея в том, что бы сделать настоящий частотомер, а не очередной показометр. Первые тесты показали, что это возможно. На одной секунде удалось поймать несколько наносекунд. Таймеры синхронизированы по железу благодаря настройкам в кубе. Железу пофиг, каким способом его настроили, важен результат. Средства отладки CubeIDE позволяют этот результат отслеживать. Ещё идея обойтись без термостата кварца с коррекцией по температуре. Пока работаю с stm32H743, но потом перенесу на более доступный камень типа F401 с выводом на LCD 16x2.
Максимальная измеряемая частота 200-250Мгц.
Советую изучать устройство таймеров - очень пригодится, ну и куб в придачу.
Добавлено after 8 minutes 19 seconds:
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4171521#p4171521"]Я извеняюсь.Был после дня рождения.Но всё таки эти строки.В прерывании первый таймер.А второй? А пятый использовано два входа?[/uquote]
Второй без прерываний, он ведомый. Пятый имеет один вход захвата, к которому подключено внутри два канала. Еще один вход для ВЧ частоты. Входы НЧ и ВЧ будут иметь разные схемы усилителей формирователей.
Максимальная измеряемая частота 200-250Мгц.
Советую изучать устройство таймеров - очень пригодится, ну и куб в придачу.
Добавлено after 8 minutes 19 seconds:
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4171521#p4171521"]Я извеняюсь.Был после дня рождения.Но всё таки эти строки.В прерывании первый таймер.А второй? А пятый использовано два входа?[/uquote]
Второй без прерываний, он ведомый. Пятый имеет один вход захвата, к которому подключено внутри два канала. Еще один вход для ВЧ частоты. Входы НЧ и ВЧ будут иметь разные схемы усилителей формирователей.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: CubeIDE особенности измерения частоты и периода.
stm32H743 а это дорогая штука?
Re: CubeIDE особенности измерения частоты и периода.
[uquote="linkov1959",url="/forum/viewtopic.php?p=4171619#p4171619"]Идея в том, что бы сделать настоящий частотомер, а не очередной показометр.[/uquote]
И в чем отличия? Частотомер на двух таймерах - это самое простое что делают на STM32.
И в чем отличия? Частотомер на двух таймерах - это самое простое что делают на STM32.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: CubeIDE особенности измерения частоты и периода.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4171637#p4171637"]stm32H743 а это дорогая штука?[/uquote]
Баксов 20 - как полноценный мини-одноплатник. Вот я и говорю, что во многих случаях можно использовать связку "одноплатник + дешевый МК", которая будет делать то же самое, но значительно меньшими усилиями со стороны разработчика.
А еще у китайцев появились какие-то дешевые МК с высокими рабочими частотами, я себе на али взял девборду, но пока никаких средств разработки под них (равно как и документации на английском), увы, нет. Подожду - авось, появятся. Или будет, как и девборда на MSP430 пылиться в дальнем ящике.
Баксов 20 - как полноценный мини-одноплатник. Вот я и говорю, что во многих случаях можно использовать связку "одноплатник + дешевый МК", которая будет делать то же самое, но значительно меньшими усилиями со стороны разработчика.
А еще у китайцев появились какие-то дешевые МК с высокими рабочими частотами, я себе на али взял девборду, но пока никаких средств разработки под них (равно как и документации на английском), увы, нет. Подожду - авось, появятся. Или будет, как и девборда на MSP430 пылиться в дальнем ящике.
Re: CubeIDE особенности измерения частоты и периода.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4171637#p4171637"]stm32H743 а это дорогая штука?[/uquote]
Это сложная штука, точно не для нерусских электриков которые самостоятельно и с AVR разобраться не могут.
Это сложная штука, точно не для нерусских электриков которые самостоятельно и с AVR разобраться не могут.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: CubeIDE особенности измерения частоты и периода.
Reflector, самое простое я сделал сразу со сбросом таймера в колбеке и получил ошибку в 250 тактов, после сделал сброс по железу через внутренние связи таймеров и ошибка стала 2такта, которые легко компенсировать программно и таких моментов много.
Re: CubeIDE особенности измерения частоты и периода.
[uquote="linkov1959",url="/forum/viewtopic.php?p=4171782#p4171782"]самое простое я сделал сразу со сбросом таймера в колбеке и получил ошибку в 250 тактов[/uquote]
У таймера есть режим OnePulse, TIM1 досчитал один раз и остановился, можно спокойно считывать TIM2->CNT в прерывании, сбрасывать его и запускать TIM1 опять.
У таймера есть режим OnePulse, TIM1 досчитал один раз и остановился, можно спокойно считывать TIM2->CNT в прерывании, сбрасывать его и запускать TIM1 опять.
Re: CubeIDE особенности измерения частоты и периода.
А от чего ваша "штука" будет тактироваться?linkov1959 писал(а):Частотомер штука точная и требует особого подхода.
От кварцевого резонатора 8МГц? Вы да же не знаете точную частоту вашего кварца.
Температура в помещении может меняться в широких пределах.
Попробуйте погреть свой кварц градусов так до 50 и посмотреть на точность своего частотомера.