Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.52/29: Рейтинг темы: голосов - 29, средняя оценка - 4.52
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
1

Синхронизация таймеров

01.10.2016, 14:35. Просмотров 5326. Ответов 23
Метки нет (Все метки)

Доброго времени суток. Мне необходимо синхронно запустить два таймера которые будут генерировать ШИМ. В дальнейшем понадобится так же сделать отставание одного сигнала от другого.
Вот что я делаю для запуска одного таймера по тригеру.
Код
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR0);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
Вопрос вот в чем, TIM_TS_ITR0 Что это? точнее не именно этот параметр а вообще что такое TIM_InputTriggerSource из вот этой функции TIM_SelectInputTrigger(TIM_TypeDef* TIMx, uint16_t TIM_InputTriggerSource). Он соответвует какой то ноге? Если да то как найти эту ногу, в мануалах ничего не нашел.
И может ли быть у таймеров 3 и 4 один TIM_InputTriggerSource, что бы запускать их по одному событию. Или у любых других таймеров.
P.S. Может еще есть какие нибудь способы синхронизации таймеров?
STM32F407VG
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2016, 14:35
Ответы с готовыми решениями:

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

STM32F103, синхронизация таймеров
Итак, задачка из соседней темы. В тему приглашаются гуру RM, помню что dosykus весьма детально...

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

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

Необъяснимое поведение таймеров
Имеем TYM1 и TIM2. DMA работающий с TYM1 должен слать данные со скоростью не менее 25Мгц (хотим...

23
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
01.10.2016, 16:26 2
Ага, так.
1. настроить два таймера абсолютно одинаково (частота, режим счета)
2. один мастер, второй slave
3. поставить режим синхронизации _Enable
4. запустить slave
5. запустить мастер.
По п5 запустятся оба таймера и будут идти строго синхронно.
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
01.10.2016, 16:46 3
таймеры не могут все со всеми соединяться. Есть таблички типа таких

0
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
01.10.2016, 17:41 4
Цитата Сообщение от u37
Ага, так.

4. запустить slave
5. запустить мастер.
запустить это просто TIM_Cmd(TIMX, ENABLE)?
TIM_SelectSlaveMode(TIMx, TIM_SlaveMode_Trigger) - назначает таймер slave?
TIM_SelectMasterSlaveMode(TIMx, TIM_MasterSlaveMode_Enable) - это значит включил синхронизацию?
0
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
01.10.2016, 18:24 5
сделал вот так
Код
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Riset);
TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);
TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Enable);
TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM4, ENABLE);
вот результат, без попыток включить синхронизацию такой же.
TIM3 внизу, настроены одинаково. Как то странно выглядит, я так понимаю первый спад это инициализированы ноги. там T3 отстает на 25 микросекунд, вроде это не важно. А вот уже когда начинается шим генерироваться TIM3 опережает TIM4 на 70 микросекунд. Частота ШИМ 100Кгц, Частота Шины которая тактует таймер 50Мгц. Период ШИМ 125. Тут тоже кстати странность при таких параметрах должна же быть частота 400Кгц. Или я что то не так считаю?

0
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
01.10.2016, 19:13 6
Извиняюсь за суетливость.
Вот так синхронизируется, но появилась другая проблема, первый импульс почему то имеет скважность больше чем нужно и из-за этого не получается синхроности. Как с этим бороться?
Код
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);

TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Riset);

TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM4, ENABLE);

<Изображение удалено>
0
Stiit.mi
0 / 0 / 0
Регистрация: 26.04.2010
Сообщений: 1,445
01.10.2016, 19:53 7
Цитата Сообщение от Vyktor12
Извиняюсь за суетливость.
Вот так синхронизируется, но появилась другая проблема, первый импульс почему то имеет скважность больше чем нужно и из-за этого не получается синхроности. Как с этим бороться?
Код:
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);

TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Riset);

TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM4, ENABLE);

потому что по этим настройкам слейв таймер запускается, когда у первого risit, то есть он досчитал до переполнения и сбросился
0
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
02.10.2016, 04:21 8
Сделал всё по инструкции прикрепленной ниже, снова что то не то.
Код
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);
TIM_SelectInputTrigger(TIM4, TIM_TS_TI1F_ED);
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Trigger);
TIM4->SMCR|=0x80;
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM4, ENABLE);
Что за сигнал TIM_TS_TI1F_ED ?


<Изображение удалено>


<Изображение удалено>

0
Sow_Tooth
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 108
02.10.2016, 18:15 9
какой то булшит, в stm же есть режим ШИМ/енкодер и тп...не вышло или не тот случай?
0
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
02.10.2016, 19:03 10
Цитата Сообщение от Sow_Tooth
какой то булшит, в stm же есть режим ШИМ/енкодер и тп...не вышло или не тот случай?
Это и есть режим ШИМ. Мне нужно два синхронных ШИМа
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
02.10.2016, 19:28 11
Гм. Ну, так _это_ и есть два синхронных таймера (в режиме ШИМ).
Вы пытаетесь починить то, что исправно.
0
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
02.10.2016, 23:47 12
Цитата Сообщение от u37
Гм. Ну, так _это_ и есть два синхронных таймера (в режиме ШИМ).
Вы пытаетесь починить то, что исправно.
\
Он не работает синхронно, на первом изображении он не стартует синхронно как это показана на диаграмме из мануала стм (прикреплена в сообщении выше) и вообще "сбивается" некоторые периоды 11мкс. на втором рисунке, когда синхронизация настроена по ресету ведущего таймера ведомый начинает свою работу ровно по спаду ведущего, но проблема в том что первый период опять же больше чем нужно. Причем больше у обоих таймеров, но так как ведомый запускается после первого периода ведущего таймера то в итоге получается не синхронно. Это не проблема замеров так как результат всегда повторяется.

Первое вложение. Строго по инструкции из референс мануал
Код
TIM_SelectMasterSlaveMode(TIM4, TIM_MasterSlaveMode_Enable);
TIM_SelectInputTrigger(TIM4, TIM_TS_TI1F_ED);
TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Trigger);
TIM4->SMCR|=0x80;
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM4, ENABLE);
Второе вложение

Код
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR3);

TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);
TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);
TIM_SelectOutputTrigger(TIM4, TIM_TRGOSource_Riset);

TIM_Cmd(TIM3, ENABLE);
TIM_Cmd(TIM4, ENABLE);



<Изображение удалено>
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
02.10.2016, 23:57 13
"Вложения:"
Кто это?
0
Sow_Tooth
0 / 0 / 0
Регистрация: 29.05.2015
Сообщений: 108
03.10.2016, 00:00 14
фух, чет в голос....
1. Вам нужен ШИМ? зачем вам тогда два таймера,е сли режим ШИМ организовывается на двух КАНАЛАХ одного таймера
2. Вам нужно ДВА таймера? сделайте запуск по прерыванию, но не думаю что будет синхронно, так как второй таймер будет запущен с задежкой
ВОТ ВАМ ШИМ!
Код
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// Включаем тактирование таймера
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

// Настраиваем таймер на использование 3 канала (т.е. контакта PB0)
TIM3->CCER |= TIM_CCER_CC3E;

// Переводим 3 канал в режим ШИМ2
TIM3->CCMR2|= TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2;

// Настраиваем прескалер
TIM3->PSC = 10;

// Настраиваем период таймера = 1000 циклов
TIM3->ARR = 1000;

// Настраиваем скважность = 200 циклов
TIM3->CCR3 = 200;

// Включаем таймер
TIM3->CR1 |= TIM_CR1_CEN;
0
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
03.10.2016, 00:11 15
Цитата Сообщение от u37
"Вложения:"
Кто это?
Редактировал сообщение, теперь там есть код который приводит к этому. просто я уже прикреплял это выше а в том сообщении решил подытожить.
0
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
03.10.2016, 00:14 16
Цитата Сообщение от Sow_Tooth
фух, чет в голос....
1. Вам нужен ШИМ? зачем вам тогда два таймера,е сли режим ШИМ организовывается на двух КАНАЛАХ одного таймера
2. Вам нужно ДВА таймера? сделайте запуск по прерыванию, но не думаю что будет синхронно, так как второй таймер будет запущен с задежкой
ВОТ ВАМ ШИМ!
Код:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// Включаем тактирование таймера
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

// Настраиваем таймер на использование 3 канала (т.е. контакта PB0)
TIM3->CCER |= TIM_CCER_CC3E;

// Переводим 3 канал в режим ШИМ2
TIM3->CCMR2|= TIM_CCMR2_OC3M_0 | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2;

// Настраиваем прескалер
TIM3->PSC = 10;

// Настраиваем период таймера = 1000 циклов
TIM3->ARR = 1000;

// Настраиваем скважность = 200 циклов
TIM3->CCR3 = 200;

// Включаем таймер
TIM3->CR1 |= TIM_CR1_CEN;
Шим я настроил, он генерируется( на всех вложениях ШИМ). Мне нужно два ШИМа, синхронных. С возможностью регулировать сдвиг между ними,так же изменять их частоту и скважность во время работы.
P.S. Два таймера не принципиально, можно и на одном. Вообще подойдут любые варианты лиш бы удовлетворяли условиям выше.
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
03.10.2016, 00:43 17
Осциллограммы сделаны ЧЕМ?
0
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
03.10.2016, 01:03 18
Цитата Сообщение от u37
Осциллограммы сделаны ЧЕМ?
logic analyzer cy7c68013a с прошивкой sykrock. На компе прога putsi view.
Результаты всегда одинаковые замерял несколько раз.
0
u37
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,113
03.10.2016, 02:54 19
фрагмент
Код
void InitTimer1(void) // Настроить таймеры
{
RCC->APB2ENR |= ( RCC_APB2ENR_IOPBEN |
RCC_APB2ENR_IOPAEN |
RCC_APB2ENR_IOPCEN |
RCC_APB2ENR_IOPDIM |
RCC_APB2ENR_TYM1EN);    // Enable GPIOB GPIOA TYM1 clocking

///////////////////////////////////// PWM Timer 1
TYM1->CR1 = TIM_CounterMode_CenterAligned1 | TIM_CKD_DIV1; // треугольный PWM, прерывание Update будет в начале(#1)<>конце(#2) импульса PWM

TYM1->PSC = (ClockAPB1_MHz/8)-1; // clock 8 MHz / 512 = ~16KHz
TYM1->ARR = 0x00FF; // Число 0xFF будет соответствовать 100% PWM; 1=0xFE = импульс 250ns

TYM1->CCR1 = 0x1;
TYM1->CCR2 = 0x40;
TYM1->CCR3 = 0x60;
TYM1->CCR4 = 24-2+13;//1=(без сдвига) //24-2+13; // НИ В КОЕМ СЛУЧАЕ НЕ ДОЛЖЕН БЫТЬ 0 и МАКСИМУМ! Для APP=0xff 1<n<0xFE (СТРОГО!) Иначе не будет event на adc

TYM1->CCMR1 = (TIM_CCMR1_OC1PE*UsePretoodCCRx | TIM_CCMR1_OC1M |
TIM_CCMR1_OC2PE*UsePretoodCCRx | TIM_CCMR1_OC2M); //port1/2 Output, PWM2
TYM1->CCMR2 = (TIM_CCMR2_OC3PE*UsePretoodCCRx | TIM_CCMR2_OC3M |
TIM_CCMR2_OC4PE*UsePretoodCCRx | TIM_CCMR2_OC4M); //port3/4 Output, PWM2

TYM1->CCER = (TIM_CCER_CC1E | /*TIM_CCER_CC1P |*/
TIM_CCER_CC1NE | /*TIM_CCER_CC1NP |*/
TIM_CCER_CC1P |
TIM_CCER_CC2E | /*TIM_CCER_CC2P |*/
TIM_CCER_CC2NE |
TIM_CCER_CC2P |
TIM_CCER_CC3E | /*TIM_CCER_CC3P |*/
TIM_CCER_CC3NE | /*TIM_CCER_CC3NP |*/
TIM_CCER_CC3P |
TIM_CCER_CC4E   |
TIM_CCER_CC4P); // C4=inv --- время сдвига РАНЕЕ перехода через центр (иначе - после)
TYM1->BDTR = TIM_BDTR_MOE;
// Перенесено ниже, после настройки =подчиненного=    Tim4
//  TYM1->CR1 |= TIM_CR1_CEN;

// Таймеры 3/4
RCC->APB1ENR |= (RCC_APB1ENR_TIM3EN | RCC_APB1ENR_TIM3EN*2 );//Включаем тактирование TIM3/4

TIM4->CR1 = TIM_CounterMode_CenterAligned2 | TIM_CKD_DIV1; // треугольный PWM, прерывание Update будет в начале(#1)<>конце(#2) импульса PWM
// Настройки Tim4 ПОЛНОСТЬЮ соответствуют Tim1, он (№4) будет подчиненным к №1 использоваться CH4 для строба запуска ADC1
TIM4->PSC = TYM1->PSC; // ~16KHz
TIM4->ARR = TYM1->ARR; // Число 0xFF будет соответствовать 100% PWM

TIM4->CCR1 = 1;
TIM4->CCR2 = 1;
TIM4->CCR3 = 1;
TIM4->CCR4 = 0x80;//FE; // НИ В КОЕМ СЛУЧАЕ НЕ ДОЛЖЕН БЫТЬ 0 и МАКСИМУМ! Для APP=0xff 1<n<0xFF (СТРОГО!) Иначе не будет event на adc

TIM4->SMCR = (TIM_SMCR_SMS_2 | TIM_SMCR_SMS_0 | TIM_SMCR_MSM); // slave "Gated" mode + MasterSlave_mode

TIM4->CCMR1 = (TIM_CCMR1_OC1PE | TIM_CCMR1_OC1M |
TIM_CCMR1_OC2PE | TIM_CCMR1_OC2M); //port1/2 Output, PWM2
TIM4->CCMR2 = (TIM_CCMR2_OC3PE | TIM_CCMR2_OC3M |
TIM_CCMR2_OC4PE | TIM_CCMR2_OC4M); //port3/4 Output, PWM2

TIM4->CCER = (TIM_CCER_CC1E | /*TIM_CCER_CC1P |*/
TIM_CCER_CC1NE | /*TIM_CCER_CC1NP |*/
TIM_CCER_CC1P |
TIM_CCER_CC2E | /*TIM_CCER_CC2P |*/
TIM_CCER_CC2NE |
TIM_CCER_CC2P |
TIM_CCER_CC3E | /*TIM_CCER_CC3P |*/
TIM_CCER_CC3NE | /*TIM_CCER_CC3NP |*/
TIM_CCER_CC3P |
TIM_CCER_CC4E   |
TIM_CCER_CC4P*0);

TYM1->CR2 |= TIM_CR2_MMS_0; // TriggerOut = Enable

TIM4->DIER = TIM_DIER_UDE;   // Update DMA request enable - используется для запуска DMA1c7 (захват in_PortC)

TIM4->CR1 |= TIM_CR1_CEN;
// Включить Tim1
//   TYM1->CR1 |= TIM_CR1_CEN;

/* Прерывание для основного цикла берется от DMA1c1 по полузаполнения буфера
// Настроить прeрывание от Tim4_CH4
TIM4->DIER = TIM_DIER_CC4IE;   // Capture/Compare 4 interrupt enable
NVIC->IP[(uint32_t)(TIM3_IRQn+1)] = ((TIM4_IntPriority << (8 - __NVIC_PRIO_BITS)) & 0xff);         // set Priority for divice specific Ymtirrupts
NVIC->ISER[((uint32_t)(TIM3_IRQn+1) >> 5)] = (1 << ((uint32_t)(TIM3_IRQn+1) & 0x1F)); // enable interrupt */

// Включить Tim1
TYM1->CR1 |= TIM_CR1_CEN;

}
0
YvomSh
0 / 0 / 0
Регистрация: 21.09.2015
Сообщений: 48
03.10.2016, 03:45 20
Такая синхронизация таймеров -- достаточно мутная в плане настройки и использования. Но это самый универсальный способ.

В случае, если изменение фазы небольшое - иногда получалось обойтись просто одним таймером TYM1 с двумя каналами, например, CH1 и CH2N. Фаза настраивается с помощью dead-time в TYM1_BDTR, при этом то, что dead-time убирает по заднему фронту нужно добавить дважды в соответствующий TYM1_CCRx.
0
03.10.2016, 03:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2016, 03:45

Работа таймеров в STM8S
Всем привет. Столкнулся с такой проблемой. Задача - затактировать таймер от LSI, чтобы отсчитать...

RM0008 описание таймеров
Не могу понять структуру таймеров. В описании указано, что для каждого таймера есть 4 входа,...

Распиновка таймеров STM32
Здравствуйте! Подскажите, пожалуйста, с решением проблемы. Мне необходимо 5 каналов PWM с разной...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru