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

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

19.06.2017, 17:30. Показов 7692. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru