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

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

01.10.2016, 14:35. Просмотров 5288. Ответов 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...

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

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

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

23
dosykus_2
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 4,017
03.10.2016, 10:05 21
Цитата Сообщение от Vyktor12
logic analyzer cy7c68013a с прошивкой sykrock. На компе прога putsi view.
Результаты всегда одинаковые замерял несколько раз.
С идентификатором saleae может быть? Прошивка там льется с PC обслуживающим софтом каждый раз при подключении.
И второй вопрос - в чем причина использовании сырого софта, чем родной от Saleae не угодил?
0
vt340
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
03.10.2016, 12:48 22
Я бы просто использовал четыре канала одного таймера и соединил выходы - первый со вторым, третий с четвёртым.
0
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
03.10.2016, 17:35 23
Цитата Сообщение от u37
фрагмент
Код
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
Vyktor12
0 / 0 / 0
Регистрация: 28.09.2016
Сообщений: 17
03.10.2016, 17:38 24
Цитата Сообщение от dosykus_2
Цитата Сообщение от Vyktor12
logic analyzer cy7c68013a с прошивкой sykrock. На компе прога putsi view.
Результаты всегда одинаковые замерял несколько раз.
С идентификатором saleae может быть? Прошивка там льется с PC обслуживающим софтом каждый раз при подключении.
И второй вопрос - в чем причина использовании сырого софта, чем родной от Saleae не угодил?
Тут я не могу ответить. Так как анализатор взял у товарища, он мне показал как им пользоваться я и пользуюсь по его наставлениям.
0
03.10.2016, 17:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2016, 17:38

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

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

STM32F103 Параллельное соединение таймеров
Господа, подскажите. Хотел параллельно соединить таймеры: TIM2 - ведущий, TIM3...


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

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

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