реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F107RCT6 Настройки таймера
Auratos
сообщение May 31 2018, 09:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 6-10-14
Пользователь №: 83 032



Добрый день. У меня контроллер STM32F107RCT6. Настраиваю таймеры TIM1 и TIM2 для генерации частоты на выводах.

Код
TIM_TimeBaseInitTypeDef timer;
TIM_OCInitTypeDef TIM_OCConfig;

void TIM1_Init(uint16_t presc, uint16_t period, uint16_t repCnt)
{
  TIM_TimeBaseInitTypeDef timer;
  TIM_OCInitTypeDef TIM_OCConfig;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  // тактирование таймера
  // выход TIM1_CH1 (F1)
  GPIO_mInit(GPIO_Speed_50MHz, GPIO_Mode_AF_PP, GPIOA, GPIO_Pin_8);

  TIM_TimeBaseStructInit(&timer);                       // заполнение поля структуры дефолтными значениями
  timer.TIM_Prescaler = presc;                          // предделитель
  timer.TIM_Period = period;                            // период
  timer.TIM_RepetitionCounter = repCnt;                 // счетчик повторений
  TIM_TimeBaseInit(TIM1, &timer);                       // инициализация TIM1
  TIM_ARRPreloadConfig(TIM1, ENABLE);
  
  TIM1->BDTR |= TIM_BDTR_MOE;                           // включение выхода таймера TIM1
  TIM_OCStructInit(&TIM_OCConfig);
  TIM_OCConfig.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OC1Init(TIM1, &TIM_OCConfig);                     // включение канал1 таймера TIM1
  TIM_Cmd(TIM1, ENABLE);                                // включение таймера TIM1_CH1(F1)
}

TIM1_Init(7, 17999, 1);
TIM2_Init(7, 17999);


Шина APB1 работает на частоте 36МГц, а APB2 - на 72МГц. Причем частоту фиксирую непосредственно перед инициализацией таймеров.

Из даташита на таймеры на STM32 я вижу формулу, по ней произвожу расчет выходной частоты


Взять, например, таймер TIM1: 72000000 / ((7 + 1) * (17999 + 1) * (0 + 1)) = 500Гц. Но фактически на осциллографе вижу частоту 249,9Гц, то есть делиться ровно в 2 раза. Пробовал на разных частотах - результат тот же. Подскажите, пожалуйста, в чем может быть косяк? И еще одна непонятная ситуация - изменения значения RepetitionCounter не влияет на выходную частоту. Пробовал и 1, и 2, и 170 - результат один. Как работает этот RepetitionCounter?
Go to the top of the page
 
+Quote Post
adnega
сообщение May 31 2018, 11:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 665
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Auratos @ May 31 2018, 12:51) *
в чем может быть косяк?

Может, в этом?
Цитата
TIM_OCMode_Toggle


Рекомендую TIM_OCMode_PWM1 или TIM_OCMode_PWM2, но и CCR1 нужно будет определить.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение May 31 2018, 13:31
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 445
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(Auratos @ May 31 2018, 13:51) *
...
в чем может быть косяк?

Считаем. Входная синхронизация 72МГц. Предделитель 8, то есть на вход счетчика подается частота 9МГц. Чтобы возникло событие сравнения, нужно, чтобы сравнялись значения счетного регистра и регистра сравнения, а это значит, что частота событий этих совпадений будет равна 9МГц/18000 = 500Гц. Но полный период сигнала, который Вы видите на осциллографе, равен сумме двух таких событий совпадения таймера. 1/500 = 0,002с, 0,002*2 = 0,004. Отсюда 1/0,004 = 250Гц. Все верно.
Ну а насчет счетчика повторений Repetition Counter - он при каждом событии переполнения декрементируется. И как только он равен 0 и возникло событие переполнения - выставляется флаг Update и формируется прерывание (если разрешено). В режиме ШИМ используется для кратного ограничения частоты ШИМ. В мануале ж четко все написано...

Сообщение отредактировал Arlleex - May 31 2018, 13:36
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th August 2018 - 23:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01068 секунд с 7
ELECTRONIX ©2004-2016