Тема: STM32, CubeMX, Keil, навчання.
До вашої уваги невеличкий проект - визначення частоти.
Апаратна частина - синя пігулка. Використовую TIM1 в режимі PWM захоплення.
Налаштування системної частоти - Частота SYSCLK - 72 MHz
Налаштування TIM1:
Prescaler PSC - 71.
ARR - 65535.
Секція Trigger Output:
Trigger Output selection - Update Event - буду запускати TIM2 для підрахунку переповнень TIM1.
Input CH1 буде нога PA8 TIM1_CH1 вона ж і для CH2.
Input Trigger - TI1FP1 - Reset Mode.
Далі все по замовчуванню.
Вмикаю переривання від TIM1.
Налаштування TIM2:
Slave Mode - External Clock Mode1.
Trigger Source - ITR0.
Prescaler PSC - 0.
ARR - 65535.
Далі все по замовчуванню.
Визначати частоту буду на нозі PA5_Taho_OUTP тому з'єдную її з ногою PA8 TIM1_CH1.
Керувати ногою PA5_Taho_OUTP буду в процесі відлагодження.
В Main
Запускаю CH1 TIM1 в режимі захвату з перериванням.
Запускаю CH2 TIM1 в режимі захвату з перериванням.
Запускаю таймер TIM2 в звичайному режимі.
Далі все це працює так:
У нескінченному циклі дригаю ногою PA5_Taho_OUTP, при відлагодженні можу міняти розмір імпульсу та паузи.
Далі все дійство проходить у колбеці:
По фронту Rising спрацьовує переривання від СH1 TIM1, автоматом скидається лічильник TIM1 бо Input Trigger - TI1FP1 - Reset Mode,
Зчитую захоплене значення в каналі CH1 TIM1 - це буде розмір періоду.
Зчитую значення лічильника CNT TIM2 - чи було переповнення TIM1.
Скидаю значення лічильника CNT TIM2 в нуль.
Далі розраховую дійсний розмір періоду.
По фронту FOLLING спрацьовує переривання від СH2 TIM1
Зчитую захоплене значення в каналі CH2 TIM1 - це буде розмір імпульсу.
Зчитую значення лічильника CNT TIM2 - чи було переповнення TIM1 за час імпульсу
Далі розраховую дійсний розмір періоду.
Ну і розраховую частоту - Hz.
-----------------
Пробую режим без запуску TIM2
Використовую імпульс та паузу з періодом, що не перевищує 65,535 мілісекунд. Все працює бездоганно.
Спроба з запуском TIM2 приводить до похибки. При імпульсі та паузі з періодом, що не перевищує 65,535 мілісекунд, тобто при якому не виникає переповнення TIM1 у CNT TIM2 звідкись береться одиниця і частота рахується неправильно.
Спроба скинути прапорі апдейт UIF
TIM1->SR &= ~TIM_SR_UIF; //Скинути прапор апдейт UIF
TIM2->SR &= ~TIM_SR_UIF; //Скинути прапор апдейт UIF
позитивного результату не дала.
Що я не врахував. Куди копати.
У проекті виправте шлях до репозиторію згідно своїх налаштувань, бо щоб архів був менший я вказував на бібліотеки посилання. Дякую всім за допомогу.