0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 39
1

STM32F0 Timer Output Compare

08.11.2023, 11:37. Показов 263. Ответов 3

Author24 — интернет-сервис помощи студентам
Всем привет.
Нужна помощь, обнаружился некоторый нюанс в работе таймера в режиме захвата/сравнения, не знаю как победить (без использования каких то стрёмных костылей).

Огромная просьба: не посылать в гугл, изучению RM и т.д
Если есть желание помочь, буду рад помощи, если нет, но есть желание поумничать, будьте добры, не тратьте моё и тем более своё время.

В работе оригинальная плата Nucleo STM32F091RC (но проверял и на плате с МК L053)
Создан абсолютно новый проект в CubeMX:
Инициализация по умолчанию для данной платы: кнопка, светодиод, отладка и UART, ко всему включил таймер 2 (канал 1) в режиме захвата/сравнения.
По настройкам таймера:
Тактируется таймер от 48МГц
Prescaler = 0
ARR = 5000-1
CCR = 2500-1
Режим (toggle on match)
Глобальное прерывание для таймера 2 включено.

А так же, ещё один таймер6, который просто тикает раз 1 мкс (для выдержки временного интервала), прерывание ВЫКЛЮЧЕННО.

Больше никаких других прерываний -НЕ ВКЛЮЧАЛ.

Далее что есть в самой программе:
Глобальная переменная count = 0, которая просто инкрементируется в прерывании HAL_TIM_OC_DelayElapsedCallback.
Глобальная переменная flag = 1, которая просто ограничивает доступ к блоку if, flag = 0, в котором стартует таймер, а в другом блоке if (в котором останавливаем таймер) вновь восстанавливаем flag = 1.

Запуск и останов таймера производится функциями HAL_TIM_OC_Start_IT и HAL_TIM_OC_Stop_IT.

В основном цикле код такой:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
                if (!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) && btn_flag && TIM6->CNT >= 500) {
            btn_flag = 0;
            TIM2->CNT = 0;
            HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_1);
        }
 
        /* Change the number to even, and after to odd, and see the difference */
        if (count >= 9) {
 
            HAL_TIM_OC_Stop_IT(&htim2, TIM_CHANNEL_1);
 
            count = 0;
            btn_flag = 1;
            TIM6->CNT = 0;
        }
Больше ничего -НЕТ.

В чем собственно проблема:
Теоретически, подключивших анализатором на канал таймера, мы должны увидеть следующую временную диаграмму: 52мкс, затем несколько по 104мкс, затем пауза в 500мкс и по новой, 54, 104 и пауза в 500мкс.

Но по факту, картина меняется от того, сколько вызвалось прерываний до момента останова таймера, а точнее не само количество, а четность или не четность (как бы глупо или смешно не звучало)
Т.е если переменная насчитала четное, скажем 10, то всё ок, а если 9 или скажем 11, то при повторном старте таймера (после предыдущей остановки) временные интервалы сбиваются, куда то исчезает 54мкс, а пауза в 500мкс увеличивается.
Что собственно видно на скринах:

Четное количество
STM32F0 Timer Output Compare


Не четное
STM32F0 Timer Output Compare


Если нужно, могу выложить проект целиком.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2023, 11:37
Ответы с готовыми решениями:

Output Compare
Доброго времени суток. Изучать микроконтроллеры начал недавно, возникло желание собрать симисторный...

Timer настройка PWM mode и Output Compare
Добрый день, хочу настроить 2 канала одного таймера в режиме PWM и Output Compare No Output. Т.е....

В чем разница при объявлении методов Compare(.) и IComparer.Compare(.)
Здравствуйте. У меня вопрос, связанный с реализацией методов сравнения, которые используются далее...

Что может значить такая ошибка. Ambiguity between 'Output' and 'System::Output'
Если кто может, помогите разобраться с этой ошибкой. Unit1.cpp(85): E2015 Ambiguity between...

3
0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 39
08.11.2023, 11:47  [ТС] 2
п.с
На вопрос, что конкретно нужно получить ?
Ответ: запуск таймера, получения тех же 54мкс, затем 104 и повторять эти (104мкс) пока не остановить таймер (в ЛЮБОЙ момент времени), а затем по надобности, вновь запустить таймер, 54, 104..... стоп и т.д
0
3218 / 2361 / 540
Регистрация: 11.09.2009
Сообщений: 8,602
08.11.2023, 16:18 3
Цитата Сообщение от Vladimirchy Посмотреть сообщение
ко всему включил таймер 2
... 14 TIM6->CNT = 0;
TIM6 что делает? Где проверяется?
0
0 / 0 / 0
Регистрация: 14.01.2023
Сообщений: 39
08.11.2023, 16:29  [ТС] 4
Цитата Сообщение от i8085 Посмотреть сообщение
TIM6 что делает? Где проверяется?
Проверяется тут:
C
1
 if (!HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) && btn_flag && TIM6->CNT >= 500)
Выше в коде эта строчка есть.

Просто выдерживает паузу, когда нажимаешь кнопку (что бы запустить таймер)
Иначе потом непонятно будет, где запуск таймера 2, а где конец.
0
08.11.2023, 16:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2023, 16:29
Помогаю со студенческими работами здесь

как сделать в MS VS 2010 express output не в консоль в output windows
сабж заранее спасибо

Raspberry pi 4 (Windows 10 IOT) - GpioPinDriveMode.Output (Разновидности Output)
Метод SetDriveMode - задает режимы работы пина. Режим Input и Output это понятно...

CYCLE WHILE, looking for the maximum, Timer - circle, Timer - lines and rings, sketchbook,Drawing, NSD
Добрый день товарищи программисты. Это снова Я ,пожалуйста нужна ваша помощь . Закрыть семестр в...

Запуск/остановка таймера при вводе в Edit команд Timer Start/Timer Stop
Суть вот в чём на форме есть таймер который выполняет обратный отсчёт и есть Edit, задача вот...

Не удаётся связать два файла timer.h и timer.cpp
Добрый вечер, у меня есть класс и библиотеки которые нужно использовать в нескольких программах, по...

Timer vs System.Windows.Forms.Timer
Занятную штуку недавно обнаружил: Всем известный Timer из модуля Timers отказывается работать,...

Неоднозначная ссылка "Timer" между "System.Windows.Forms.Timer" и "System.Timers.Timer"
Я делю таймер в Windows Form. но ругается компилятор на такой код: using System; using...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru