Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/37: Рейтинг темы: голосов - 37, средняя оценка - 4.65
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048

STM32F103, синхронизация таймеров

19.06.2017, 17:30. Показов 7620. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Итак, задачка из соседней темы. В тему приглашаются гуру RM, помню что dosykus весьма детально разобрался в таймерах.
Имеем следующий сигнал перехода через 0 с оптопары:

Спадающий фронт - переход через ноль. Мой косяк в схемотехнике, поидее должен быть второй фронт на положительной полуволне, но фронт слишком затянут.
Спадающие фронты дают 50 Гц сети. Необходимо управлять углом открытия симистора.
Т.е. логика следующая:
1. По спадающему фронту запускаем Таймер №1, который отсчитывает необходимую задержку для открытия симистора. Задержка в пределах 0 - 10 мс. 0 - полностью открыт, 10 - полностью закрыт(на самом деле меньше чем 10мс, надо учитывать длину импульса открытия симистора).
2. По переполнению Таймера №1, запускается Таймер №2, который в режиме PWM с частотой 100 Гц выдает короткие импульсы длиной порядка 20-40мкс, необходимые для открытия симистора.
Настройка Таймера №1:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   #define   TIMER_CLK               1000000
 
// 5 ms delay test (200 Hz)
TIM2->CNT = 0;
TIM2->PSC = (SystemCoreClock / TIMER_CLK) - 1;
TIM2->ARR = (TIMER_CLK /200) - 1;
 
TIM2->CR1 = TIM_CR1_OPM | TIM_CR1_URS;      // Only counter overflow/underflow generates an update interrupt
TIM2->EGR = TIM_EGR_UG;                  // Update all shadow rikystir
TIM2->CR2 = TIM_CR2_MMS_1;               // Update event as TRGO
 
// TI2 input trigger
TIM2->SMCR = TIM_SMCR_MSM | TIM_SMCR_TS_2 | TIM_SMCR_TS_1 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2;
 
TIM2->CCMR1 = TIM_CCMR1_CC2S_0;            // CC2 channel is confikured as input, IC2 is mapped on TI2.
TIM2->CCER = TIM_CCER_CC2P;               // Sync by falling edge
Т.е. - делаем таймер TIM2 с тестовым периодом 5мс, в режиме One-Pulse, настраиваем выход TRGO для следующего таймера, а запуск таймера TIM2 делаем по спадающему фронту на входе TI2. Тут все понятно. Каждый спадающий фронт с оптопары перезапускает этот таймер.
Теперь следующий таймер, который выдает короткие импульсы по 500 мкс (тестово) для включения симистора:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
   #define   TIMER_CLK               1000000
#define   TIMER_PERIOD            100
 
// TIM3 PWM 100 Hz
TIM3->PSC = (SystemCoreClock / TIMER_CLK) - 1;
TIM3->ARR = (TIMER_CLK /TIMER_PERIOD) - 1;
TIM3->CNT = 1000;
 
TIM3->CR1 = TIM_CR1_URS;               // Only counter overflow/underflow generates an update interrupt
TIM3->EGR = TIM_EGR_UG;                  // Update all shadow rikystir
 
// Trigger input from TIM2, trigger mode
TIM3->SMCR = TIM_SMCR_TS_0 | TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2;
 
TIM3->CCMR1 = TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1;            // PWM mode 1
TIM3->CCER = TIM_CCER_CC1E;                  // TIM3_CH1 output enable
TIM3->CCR1 = 500;
Настраиваем частоту, указываем что запускаться таймер будет от TRGO таймера TIM2, указали режим PWM 1.
Смотрим на осцилл:

Верхний луч - переполнение TIM2, т.е. момент выдачи TRGO, и запуск TIM3.
Как сделать перезапуск TIM3, после изменения периода TIM2? TIM2 просто запускает TIM3, на этом их взаимодействие заканчивается, если верить ДШ. Можно попробовать в прерывании TIM3 по совпадению, т.е. по окончанию импульса останавливать TIM3 после второго импульса, но пока хочется все сделать аппаратно. Да и надо ручками сбрасывать CNT, т.к. таймер не дотикал свое и при следующем запуске будет отщелкивать лишнее время. Также вопрос, если я отключу таймер TIM3, не выставит ли он свой выход в 1, как до своего первого запуска? Ведь если так, то на следующем периоде симистор тут же откроется, хотя мы еще и не дождались запуска TIM3. Возможно есть какое-то более лаконичное решение?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.06.2017, 17:30
Ответы с готовыми решениями:

STM32F103 Параллельное соединение таймеров
Господа, подскажите. Хотел параллельно соединить таймеры: TIM2 - ведущий, TIM3 и TIM5 подчиненые. Не работает. В описании RM0008 (Doc ID...

Синхронизация таймеров
Доброго времени суток. Мне необходимо синхронно запустить два таймера которые будут генерировать ШИМ. В дальнейшем понадобится так же...

синхронизация таймеров
Нужно оцифровывать данные привязанные ко времени. От RTC не получить нужного мне прерывания, решил взять еще один таймер, т.е. RTC...

4
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 237
19.06.2017, 17:47
Для чего нужны два таймера?
Настраиваем внешнее прерывание, в котором запускаем таймер в режиме PWM One Pulse.
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,113
19.06.2017, 19:27
Можно сделать ФАПЧ. Пример реализации:
таймер в режиме PWM, частота 50 Гц. В прерывании от оптопары смотрим состояние счета таймера - если в первой половине, то его период +1(или -1). Если во второй половине, то период -1(или +1). В результате, через несколько периодов частота таймера и его фаза будут соответствовать частоте сети.
Вариант исполнения - сделать частоту таймера не 50 Гц, а 100 Гц. Алгоритм схожий.
0
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
20.06.2017, 08:08
Цитата Сообщение от Moyk
Для чего нужны два таймера?
Настраиваем внешнее прерывание, в котором запускаем таймер в режиме PWM One Pulse.
Для этого необходимо уже софтово писать обработку прерывания. Если есть возможность сделать аппаратно, меняя лишь задержку первого таймера, то почему не сделать? К тому же, по вашему методу PWM таймер в режиме OPM, даст лишь один импульс, а надо два (на каждую полуволну)
0
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 237
20.06.2017, 11:20
Поставьте оптрон PC814 и будет импульс при переходе через 0 каждой полуволны.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.06.2017, 11:20
Помогаю со студенческими работами здесь

Синхронизация таймеров STM32
Здравствуйте, делаю однофазный инвертор. Формирую два канала на таймере 3 для формирования синусоид, частота ШИМ 10кГц, частота синуса 50...

Программная синхронизация двух таймеров
Привет. Не нашел как можно синхронизировать два таймера программно. Чтоб начали считать одновременно. Вот есть внешняя синхронизация ...

Синхронизация таймеров на Atmega2560
Всем доброго дня! Реализовал 4 ШИМ сигнала на ATMEGA2560.Для этого задействовал 2 6-битных таймера - Timer1 и Timer3. Задача -...

Синхронизация двух 16-ти разрядных таймеров
Привет! Не могу сделать так что бы 2 счётчика в mega 162 начинали счёт одновременно. прочитал, что установив бит TSM в регистре SFIOR...

Модуль EVO II синхронизация 50гц, На какой ножке контроллера синхронизация шим двигателя?
Частый дефект для модулей EVO II с коллекторным двигателем - нет управления двигателем при помехах в сети. Помехи создают диммеры, блоки...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это дополнительная запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru