Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32 точность счета таймера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Veg@
На stm32vldiscovery генерирую таймером #1 на канале #1 частоту 100 кГц. Контроллер работает на частоте 24 МГц.
Инициализация выходного канала:
Код
  TIM_OCConfig.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCConfig.TIM_Pulse = TIM_BaseConfig.TIM_Period/2;
  TIM_OCConfig.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC1Init(TIM1, &TIM_OCConfig);
Часть кода инициализации таймера:
Код
  TIM1->PSC = 9;
  TIM1->ARR = 24;
  TIM1->CCR1 = TIM1->ARR / 2;
  TIM1->CNT = 0;
  TIM_Cmd(TIM1, ENABLE);
Логический анализатор измеряет частоту на выходе 96.000 кГц.
Для PSC=5, ARR=40 получаю 97.561 кГц. Для PSC=3, ARR=60 получаю 98.361 кГц. Для PSC=1, ARR=120 получаю 99.174 кГц. Для PSC=0, ARR=240 получаю 99.585 кГц.

Действительно ли использование предделителя существенно ухудшает точность счета (или с чем это может быть связано?) и как получить 100.000 кГц?
scifi
Цитата(Veg@ @ Aug 29 2014, 21:44) *
Для PSC=5, ARR=40 получаю 97.561 кГц

Возьмите в руки калькулятор и посчитайте: напрашивается ARR=39. Ну и в руководстве соответствующая формула есть, если мой склероз мне не изменяет.
Update: посмотрел, но этой формулы не увидел. Ну да ладно. Значит, нужно просто прочитать описание таймера, а не тыкать бездумно в кнопки и надеяться, что оно заработает.
Veg@
Цитата(scifi @ Aug 29 2014, 23:55) *
Возьмите в руки калькулятор и посчитайте: напрашивается ARR=39. Ну и в руководстве соответствующая формула есть, если мой склероз мне не изменяет.
Update: посмотрел, но этой формулы не увидел. Ну да ладно. Значит, нужно просто прочитать описание таймера, а не тыкать бездумно в кнопки и надеяться, что оно заработает.

возможно Вы об этом?:
Цитата
The counter clock frequency (CK_CNT) is equal to fCK_PSC / (PSC[15:0] + 1)
считаю: 24000000 / (5+1) / 40 = 100000

97.561 + 97.561/40 = 100.000
т.е. вопрос даже в том, почему ARR=39, а не 40 ?
SSerge
Цитата(Veg@ @ Aug 30 2014, 06:26) *
т.е. вопрос даже в том, почему ARR=39, а не 40 ?

Чтобы поделить на 40 счётчик должен пройти состояния от 0 до 39 и снова вернуться в 0, это займёт как раз 40 тактов.
Именно поэтому в оба регистра (ARR и PSC) нужно записывать желаемый коэффициент деления без единицы.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.