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

 
 
 
Reply to this topicStart new topic
> STM32 точность счета таймера
Veg@
сообщение Aug 29 2014, 17:44
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416



На 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 кГц?
Go to the top of the page
 
+Quote Post
scifi
сообщение Aug 29 2014, 19:55
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Veg@ @ Aug 29 2014, 21:44) *
Для PSC=5, ARR=40 получаю 97.561 кГц

Возьмите в руки калькулятор и посчитайте: напрашивается ARR=39. Ну и в руководстве соответствующая формула есть, если мой склероз мне не изменяет.
Update: посмотрел, но этой формулы не увидел. Ну да ладно. Значит, нужно просто прочитать описание таймера, а не тыкать бездумно в кнопки и надеяться, что оно заработает.
Go to the top of the page
 
+Quote Post
Veg@
сообщение Aug 29 2014, 23:26
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 90
Регистрация: 16-09-09
Пользователь №: 52 416



Цитата(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 ?

Сообщение отредактировал Veg@ - Aug 29 2014, 23:37
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 29 2014, 23:55
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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

Чтобы поделить на 40 счётчик должен пройти состояния от 0 до 39 и снова вернуться в 0, это займёт как раз 40 тактов.
Именно поэтому в оба регистра (ARR и PSC) нужно записывать желаемый коэффициент деления без единицы.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:53
Рейтинг@Mail.ru


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