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

 
 
> Таймер как генератор ШИМ, А есть ли ещё микроконтроллеры?
repairDV
сообщение Dec 23 2007, 11:46
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 578
Регистрация: 7-11-06
Из: Хабаровск
Пользователь №: 22 044



Традиционно ШИМ формируется таймерами посредством операций с прерыванием. Но - не у всех микроконтроллеров. Серия 56F8xx Freescale имеет такие свойства: таймеры программируются как генераторы, работающие независимо от процессора, т.е., при этом операция прерывания не нужна. Для изменения периода и скважности в любых пределах имеется 2 регистра сравнения: верхний и нижний, который процессор использует для этих целей без остановки таймеров. Т.е., в одном корпусе получается как бы несколько независимо работающих устройств: собственно сам проц исполняет потихоньку свою программу, не мешая ему работают таймеры. Имеются специальные выводы у контроллера для вывода полученных частот. Я думаю, понятно, что это значит для обеспечения бесперебойности работы программы, когда процу не нужны прерывания по таймерам для получения частоты. Такое свойство имеют либо все 16 16-разрядных таймеров, либо несколько.
У бочки мёда обнаружилась ложка дёгтя. Я, правда, пока использую проц из этой серии ещё с буквами "XC" на корпусе, т.е., это ещё опытный образец. Хорошо было бы, если бы в более поздних номерах этой серии этот глюк был устранён. А именно: временами(не постоянно) при изменении частоты с более высокой на более низкую таймер на 1-2 сек "зависает", потом опять включается. А это - глюк серьёзный.
Просто интересно: есть ли у других фирм микроконтроллеры с такими свойствами таймеров?

Сообщение отредактировал repairDV - Dec 23 2007, 11:47


--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rezident
сообщение Dec 23 2007, 19:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(repairDV @ Dec 23 2007, 16:46) *
У бочки мёда обнаружилась ложка дёгтя. Я, правда, пока использую проц из этой серии ещё с буквами "XC" на корпусе, т.е., это ещё опытный образец. Хорошо было бы, если бы в более поздних номерах этой серии этот глюк был устранён. А именно: временами(не постоянно) при изменении частоты с более высокой на более низкую таймер на 1-2 сек "зависает", потом опять включается. А это - глюк серьёзный.
Просто интересно: есть ли у других фирм микроконтроллеры с такими свойствами таймеров?
Это не глюк. Скорее всего вы просто недопонимаете работу таймера в режиме compare.
Изменение периода нужно делать синхронно с перезагрузкой счетчика таймера. Вот для этого-то как раз удобнее использовать прерывание.
Пояснение. С терминологией и обозначениями CF я не знаком, поэтому поясню так как смогу. Пускай у нас есть 3 регистра "счетчик", "период", "совпадение". Регистр "счетчик" увеличивает свое значение от нуля на каждый такт таймера. Регистр "период" хранит значение при совпадении с которым значения "счетчик" регистр "счетчик" перезагружается (сбрасывается в нуль). В регистре "совпадение" лежит значение при совпадении с которым значения "счетчик" происходит какое-либо изменение состояния выходного пина (установка или сброс или инверсия состояния). Для простоты пускай разрядность таймера 4 бит. Т.е. "счетчик" может считать от 0 до 15. Если "период" = 7, а "совпадение" = 3, то выходной пин будет изменять свое состояние на каждый 4й такт от нуля с периодом 8 тактов. "Счетчик" будет изменять свое значение так 0-1-2-3-4-5-6-7-0-1-2-3-4-5-6-7-0-1..... Если вы захотите уменьшить период, то нужно загружать новое значение "период" только когда "счетчик" равен 0. Тогда последовательность счета не собьется. В противном случае вы можете получить неправильную последовательность. Пусть новое значение "период" = 2.
Так правильно.
Код
0-1-2-3-4-5-6-7-0-1-2-0-1-2-0-1-2-...
                ^
                |
здесь меняем значение "период" на 2, синхронно с перезагрузкой "счетчик"
А так неправильно.
Код
0-1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-0-1-2-0-1-2-0-1-2-...
            ^   ^                   ^
            |   |---лишние такты----|
            |
здесь меняем значение "период" в произвольный момент, когда новое значение, меньше старого (2<7)

Если вы не синхронизируете запись нового значения "периода" с перезагрузкой "счетчика" таймера, а записываете его когда вздумается, то вы получаете не "зависание", а простой счет таймера до его естественного переполнения (65535 в случае 16-битного таймера).
Надеюсь понятно пояснил?
Go to the top of the page
 
+Quote Post



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

 


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


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