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

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

|
Традиционно ШИМ формируется таймерами посредством операций с прерыванием. Но - не у всех микроконтроллеров. Серия 56F8xx Freescale имеет такие свойства: таймеры программируются как генераторы, работающие независимо от процессора, т.е., при этом операция прерывания не нужна. Для изменения периода и скважности в любых пределах имеется 2 регистра сравнения: верхний и нижний, который процессор использует для этих целей без остановки таймеров. Т.е., в одном корпусе получается как бы несколько независимо работающих устройств: собственно сам проц исполняет потихоньку свою программу, не мешая ему работают таймеры. Имеются специальные выводы у контроллера для вывода полученных частот. Я думаю, понятно, что это значит для обеспечения бесперебойности работы программы, когда процу не нужны прерывания по таймерам для получения частоты. Такое свойство имеют либо все 16 16-разрядных таймеров, либо несколько. У бочки мёда обнаружилась ложка дёгтя. Я, правда, пока использую проц из этой серии ещё с буквами "XC" на корпусе, т.е., это ещё опытный образец. Хорошо было бы, если бы в более поздних номерах этой серии этот глюк был устранён. А именно: временами(не постоянно) при изменении частоты с более высокой на более низкую таймер на 1-2 сек "зависает", потом опять включается. А это - глюк серьёзный. Просто интересно: есть ли у других фирм микроконтроллеры с такими свойствами таймеров?
Сообщение отредактировал repairDV - Dec 23 2007, 11:47
--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
|
|
|
|
|
Dec 23 2007, 19:26
|
Гуру
     
Группа: Свой
Сообщений: 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-битного таймера). Надеюсь понятно пояснил?
|
|
|
|
|
Dec 26 2007, 13:57
|
Участник

Группа: Новичок
Сообщений: 26
Регистрация: 30-06-06
Пользователь №: 18 497

|
Вот, например, Renesas занимается PWM генераторами вполне независимыми от прерываний. Достаточно выставить 2-3 регистра и заниматься другими делами. http://www.renesas.com/fmwk.jsp?fp=/produc...tes&lid=143
|
|
|
|
|
Dec 27 2007, 13:20
|
Участник

Группа: Новичок
Сообщений: 26
Регистрация: 30-06-06
Пользователь №: 18 497

|
Цитата(Murk @ Dec 27 2007, 02:16)  Sild В этих процессорах требуется останов таймера для перезагрузки. Я не занимался изменением плавным изменением, интересовали только конкретные значения. Только (плиз) хотел бы понять почему нужен останов? Тем более что таковой в семействах Н8, Н8S, H8SX отсутствует или Вы думаете что нужно (в 14 - битном например) обнулить PWDRU PWDRL предварительно (потом подождать 1 conversion period???)??? Даташиты молчат по этому поводу. Эта фраза как то подкупает: Set the output waveform data in PWDRU and PWDRL. Be sure to write byte data first to PWDRL and then to PWDRU. When the data is written in PWDRU, the contents of these registers are latched in the PWM waveform generator, and the PWM waveform generation data is updated in synchronization with internal signals.
Сообщение отредактировал Sild - Dec 27 2007, 13:40
|
|
|
|
|
Dec 27 2007, 23:33
|

Частый гость
 
Группа: Участник
Сообщений: 150
Регистрация: 15-02-06
Из: ЛНР Рубежное
Пользователь №: 14 357

|
Вот как раз сегодня, а нет уже вчера, пришлось писать значение в счетчик H8S/2612 было в падлу делать целую кучу операций по останову ну мы и писанули на ходу, пишется и потом отрабатывается (В принципе), но что происходит во время записи (именно такой: на ходу) одному богу известно, т. к. на данном этапе идёт отладка и операции выполняются "по такту".
Обратите внимание на 6 номер, если есть старт то понятно что есть и стоп,
[1] Select the counter clock with bits TPSC2 to TPSC0 in TCR. At the same time, select the input clock edge with bits CKEG1 and CKEG0 in TCR. [2] Use bits CCLR2 to CCLR0 in TCR to select the TGR to be used as the TCNT clearing source. [3] Use TIOR to designate the TGR as an output compare register, and select the initial value and output value. [4] Set the cycle in the TGR selected in [2], and set the duty in the other the TGR. [5] Select the PWM mode with bits MD3 to MD0 in TMDR. [6] Set the CST bit in TSTR to 1 start the count operation.
--------------------
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы. Чем больше слёз тем больше облегчения, в слезах и заключается лечение.
|
|
|
|
|
Dec 28 2007, 00:25
|

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

|
Цитата(Murk @ Dec 28 2007, 09:33)  [1] Select the counter clock with bits TPSC2 to TPSC0 in TCR. At the same time, select the input clock edge with bits CKEG1 and CKEG0 in TCR. [2] Use bits CCLR2 to CCLR0 in TCR to select the TGR to be used as the TCNT clearing source. [3] Use TIOR to designate the TGR as an output compare register, and select the initial value and output value. [4] Set the cycle in the TGR selected in [2], and set the duty in the other the TGR. [5] Select the PWM mode with bits MD3 to MD0 in TMDR. [6] Set the CST bit in TSTR to 1 start the count operation. Что-то как-то много. В CodeWarrior там всего одна строчка asm (move #$ffd6,X:TMRD1_CMP1); Это в один из регистров сравнения, таймер не останавливается.
Сообщение отредактировал repairDV - Dec 28 2007, 00:28
--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
|
|
|
|
|
Dec 28 2007, 11:57
|
Участник

Группа: Новичок
Сообщений: 26
Регистрация: 30-06-06
Пользователь №: 18 497

|
Цитата(Murk @ Dec 28 2007, 01:33)  Вот как раз сегодня, а нет уже вчера, пришлось писать значение в счетчик H8S/2612 было в падлу делать целую кучу операций по останову ну мы и писанули на ходу, пишется и потом отрабатывается (В принципе), но что происходит во время записи (именно такой: на ходу) одному богу известно, т. к. на данном этапе идёт отладка и операции выполняются "по такту".
Обратите внимание на 6 номер, если есть старт то понятно что есть и стоп,
[1] Select the counter clock with bits TPSC2 to TPSC0 in TCR. At the same time, select the input clock edge with bits CKEG1 and CKEG0 in TCR. [2] Use bits CCLR2 to CCLR0 in TCR to select the TGR to be used as the TCNT clearing source. [3] Use TIOR to designate the TGR as an output compare register, and select the initial value and output value. [4] Set the cycle in the TGR selected in [2], and set the duty in the other the TGR. [5] Select the PWM mode with bits MD3 to MD0 in TMDR. [6] Set the CST bit in TSTR to 1 start the count operation. Это Вы случайно не о 16-битном TPU (по описанию похоже) в режиме PWM? Я об этом: http://documentation.renesas.com/eng/produ...79_h8300lap.pdfС 16-bit TPU я согласен - без бутылки портвейна гарантировать работу - нереально.
|
|
|
|
|
Dec 30 2007, 12:53
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 20-03-07
Из: Красноярск
Пользователь №: 26 321

|
По поводу других процессоров. Во многих PICах есть модуль ШИМ. Сам постоянно использую в качестве 8-битного ЦАПа. Работает независимо от основной программы. В процессе работе необходимо только переписывать регистр например CPL1L (для 8-битного режима) без всяких остановок и синхронизации.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|