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

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> STM32F303RE и его таймеры.
Jenya7
сообщение Jul 25 2017, 14:25
Сообщение #16


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(scifi @ Jul 25 2017, 19:19) *
А почему вы спрашиваете?
А если серьёзно, что строим? Космический корабль или соковыжималку? Я ж не телепат laughing.gif

хочу пульт ИР декодировать.
сделать что то вроде
cnt_val = TIMx->CCRx - prev_cnt_val;
prev_cnt_val = TIMx->CNT;
нужно следить за переполнением TIMx->CNT
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 25 2017, 15:10
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Jul 25 2017, 17:25) *
cnt_val = TIMx->CCRx - prev_cnt_val;
prev_cnt_val = TIMx->CNT;
нужно следить за переполнением TIMx->CNT
Вот только
CODE
auto Tmp = TIMx->CCRx;
cnt_val = Tmp - prev_cnt_val;
prev_cnt_val = Tmp;
Если время между фронтами не превышает периода таймера - следить за переполнениями не нужно. Если превышает - заводим дополнительный счетчик и увеличиваем его в прерывании по переполнению.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 25 2017, 15:14
Сообщение #18


Гуру
******

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



Цитата(Сергей Борщ @ Jul 25 2017, 18:10) *
заводим дополнительный счетчик и увеличиваем его в прерывании по переполнению.

Там бывают варианты, когда один таймер тактируется сигналом переполнения другого. В этом случае и прерывание не нужно.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 25 2017, 15:59
Сообщение #19


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Сергей Борщ @ Jul 25 2017, 20:10) *
Вот только
Код
auto Tmp = TIMx->CCRx;
cnt_val = Tmp - prev_cnt_val;
prev_cnt_val = Tmp;
Если время между фронтами не превышает периода таймера - следить за переполнениями не нужно. Если превышает - заводим дополнительный счетчик и увеличиваем его в прерывании по переполнению.

что то я не понял. допустим время между фронтами 120 а период таймера 500. на 5 фронте возникнет переполнение.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 25 2017, 16:44
Сообщение #20


Гуру
******

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



Цитата(Jenya7 @ Jul 25 2017, 18:59) *
что то я не понял. допустим время между фронтами 120 а период таймера 500. на 5 фронте возникнет переполнение.

К сведению: если счётчик имеет тип, например, uint16_t, и период счётчика равен 2^16, то разность между двумя его значениями, вычисленная по правилам языка Си и приведённая к тому же типу uint16_t, равна числу отсчётов между ними, если этих отсчётов было менее периода счётчика. И переполнение счётчика на это никак не влияет. Домашнее задание: возьмите бумагу, карандаш и проверьте сами.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 25 2017, 21:27
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Jul 25 2017, 18:59) *
допустим время между фронтами 120 а период таймера 500. на 5 фронте возникнет переполнение.
чему будет равна разница между значениями?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 26 2017, 06:01
Сообщение #22


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(scifi @ Jul 25 2017, 21:44) *
К сведению: если счётчик имеет тип, например, uint16_t, и период счётчика равен 2^16, то разность между двумя его значениями, вычисленная по правилам языка Си и приведённая к тому же типу uint16_t, равна числу отсчётов между ними, если этих отсчётов было менее периода счётчика. И переполнение счётчика на это никак не влияет. Домашнее задание: возьмите бумагу, карандаш и проверьте сами.

таки да.

Цитата(Сергей Борщ @ Jul 26 2017, 02:27) *
чему будет равна разница между значениями?

в случае переполнения максимального значения это работает. но в данном случае будет 65156. хотя нет 100. счетчик сделает roll over и продолжит считать. значение до 480, значение после 100. 100-480=65156.
0xFFFF - 65156 даст нам разницу.

Сообщение отредактировал Jenya7 - Jul 26 2017, 06:13
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 26 2017, 06:41
Сообщение #23


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Jenya7 @ Jul 26 2017, 09:01) *
0xFFFF - 65156 даст нам разницу.

как-то сложно все и цифры, которых не было в условии. Период 500, переполнение на пятом фронте - значит prev_cnt_val = 500-5=495, TIMx->CCRx = 120-5=115. Итого 115-495=-380. -380 mod 500 = 120. Чтобы упростить вычисление остатка от деления, целесообразно брать период кратный степени двойки, например, в вашем случае, 512. Тогда prev_cnt_val = 512-5=507, TIMx->CCRx = 120-5=115, 115-507 = -392 = 0xF...FE78, 0xF...FE78 & 0x1FF = 0x78 = 120.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:34
Рейтинг@Mail.ru


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