Страница 1 из 2

CubeIDE особенности измерения частоты и периода.

Добавлено: Вс янв 30, 2022 20:48:55
linkov1959
Частотомер штука точная и требует особого подхода. Таймеры STM32 это могут делать, но требуют глубоких знаний по их устройству и настройки.
Частотомер должен точно измерять высокие частоты, низкие, период и длительность импульсов, а это связано с разными режимами таймеров.
На помощь приходит CubeIDE и встроенный туда CubeMX. Идея в том, что бы настроить таймеры в кубе мышкой, написать пару строчек простого кода и всё, что нам нужно, частота, период и др. лежит в переменных, которые выводим куда захотим и процессор при этом не загружаем.

Добавлено after 1 hour 3 minutes 9 seconds:
ВЧ частоту считаем по входу TIM2_ETR за 1сек, которую дает TIM1 в связке по железу.
тим1.jpg
(48.12 КБ) 250 скачиваний
тим2.jpg
(54.4 КБ) 207 скачиваний
Таймер 5 измеряет период и длительность импульса по входу 1канала.
тим5.jpg
(65.8 КБ) 178 скачиваний
Добавлено 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 - это всё, что нам нужно.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Вс янв 30, 2022 23:22:23
ivan dimir
Мне кажется одного таймера будет мало.А вы используете преывание по входу?

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Вс янв 30, 2022 23:50:08
Eddy_Em
ivan dimir, естественно, для измерения частоты нужно минимум три таймера: один считает длительность входных импульсов, второй считает количество импульсов за секунду. А узнать, что прошла именно секунда, ему поможет третий таймер.
Далее, как я уже в другой теме говорил: в зависимости от количества импульсов и длительности выбираем тот или другой метод измерения, чем значительно повышаем точность.

Ну и, конечно, никакого калокуба! Калом пользуются лишь абдуринщики. А их копропродукцию все прекрасно видели...

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 00:00:45
ivan dimir
Я знаю сайт правда по 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);
 
      };
}
используем внешнее прерывание и один таймер.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 00:13:46
Аlex
ivan dimir писал(а):Там всё просто.принцип такой
Это самый топорный способ измерения частоты. На высокой частоте будет лагать. И чем выше входная частота, тем будет ниже точность измерения.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 00:31:13
ivan dimir
Скажите на на какую максимальную частоту можно работать по входу прерыванию?Ну например stm411CEU?

Добавлено after 1 minute 55 seconds:
Ну эта программа написана в ХАЛ библиотека.Не так ли.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 00:32:01
Eddy_Em
Не надо GPIO EXTI! Есть же таймеры в режиме захвата! А они чуть ли не до полной тактовой частоты умеют. А у некоторых линеек МК — даже выше!
И повторюсь: измерять длительность импульса можно лишь для низких частот. Для высоких нужно считать, сколько их штук в секунду (или несколько секунд). Точность будет выше. Абы разрядности хватило и частотных свойств.

И еще раз: КАЛ — это адов отстой для нищих разумом. Ни в коем случае эту дрянь нельзя использовать!

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 00:43:16
ivan dimir
Спойлер

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

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);
меня заинтересовали вот эти строки.Тут 3 тамера 1 запущен по прерыванию.А второй как работает?А на 5 таймер два входа1 и 2 каналы в прерывании?

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 00:49:54
Аlex
ivan dimir писал(а):меня заинтересовали вот эти строки.
Это просто разрешения прерываний от таймеров. Это не их настройка.
Настройку выложил ТС в картинках. И подписал, для чего нужен каждый таймер.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 00:50:06
ivan dimir
Спойлер

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

И еще раз: КАЛ — это адов отстой для нищих разумом. Ни в коем случае эту дрянь нельзя использовать!
но у вас написано в хале.Или не так я говорю?.Я не спец.Я любитель.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 00:51:08
Аlex
ivan dimir, Вы перепутали, Eddy_Em - не ТС :)))

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 09:02:40
ivan dimir
Я извеняюсь.Был после дня рождения.Но всё таки эти строки.В прерывании первый таймер.А второй? А пятый использовано два входа?

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 11:36:05
linkov1959
Идея в том, что бы сделать настоящий частотомер, а не очередной показометр. Первые тесты показали, что это возможно. На одной секунде удалось поймать несколько наносекунд. Таймеры синхронизированы по железу благодаря настройкам в кубе. Железу пофиг, каким способом его настроили, важен результат. Средства отладки CubeIDE позволяют этот результат отслеживать. Ещё идея обойтись без термостата кварца с коррекцией по температуре. Пока работаю с stm32H743, но потом перенесу на более доступный камень типа F401 с выводом на LCD 16x2.
Максимальная измеряемая частота 200-250Мгц.
Советую изучать устройство таймеров - очень пригодится, ну и куб в придачу.:)

Добавлено after 8 minutes 19 seconds:
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4171521#p4171521"]Я извеняюсь.Был после дня рождения.Но всё таки эти строки.В прерывании первый таймер.А второй? А пятый использовано два входа?[/uquote]
Второй без прерываний, он ведомый. Пятый имеет один вход захвата, к которому подключено внутри два канала. Еще один вход для ВЧ частоты. Входы НЧ и ВЧ будут иметь разные схемы усилителей формирователей.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 12:01:32
ivan dimir
stm32H743 а это дорогая штука?

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 12:04:02
Reflector
[uquote="linkov1959",url="/forum/viewtopic.php?p=4171619#p4171619"]Идея в том, что бы сделать настоящий частотомер, а не очередной показометр.[/uquote]
И в чем отличия? Частотомер на двух таймерах - это самое простое что делают на STM32.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 12:07:30
Eddy_Em
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4171637#p4171637"]stm32H743 а это дорогая штука?[/uquote]
Баксов 20 - как полноценный мини-одноплатник. Вот я и говорю, что во многих случаях можно использовать связку "одноплатник + дешевый МК", которая будет делать то же самое, но значительно меньшими усилиями со стороны разработчика.
А еще у китайцев появились какие-то дешевые МК с высокими рабочими частотами, я себе на али взял девборду, но пока никаких средств разработки под них (равно как и документации на английском), увы, нет. Подожду - авось, появятся. Или будет, как и девборда на MSP430 пылиться в дальнем ящике.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 12:12:05
Reflector
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4171637#p4171637"]stm32H743 а это дорогая штука?[/uquote]
Это сложная штука, точно не для нерусских электриков которые самостоятельно и с AVR разобраться не могут.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 14:58:06
linkov1959
Reflector, самое простое я сделал сразу со сбросом таймера в колбеке и получил ошибку в 250 тактов, после сделал сброс по железу через внутренние связи таймеров и ошибка стала 2такта, которые легко компенсировать программно и таких моментов много.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 15:50:22
Reflector
[uquote="linkov1959",url="/forum/viewtopic.php?p=4171782#p4171782"]самое простое я сделал сразу со сбросом таймера в колбеке и получил ошибку в 250 тактов[/uquote]
У таймера есть режим OnePulse, TIM1 досчитал один раз и остановился, можно спокойно считывать TIM2->CNT в прерывании, сбрасывать его и запускать TIM1 опять.

Re: CubeIDE особенности измерения частоты и периода.

Добавлено: Пн янв 31, 2022 17:22:49
Dimon456
linkov1959 писал(а):Частотомер штука точная и требует особого подхода.
А от чего ваша "штука" будет тактироваться?
От кварцевого резонатора 8МГц? Вы да же не знаете точную частоту вашего кварца.
Температура в помещении может меняться в широких пределах.
Попробуйте погреть свой кварц градусов так до 50 и посмотреть на точность своего частотомера.