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

 
 
 
Reply to this topicStart new topic
> Таймер как генератор ШИМ, А есть ли ещё микроконтроллеры?
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
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
repairDV
сообщение Dec 23 2007, 20:30
Сообщение #3


Знающий
****

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



Цитата(rezident @ Dec 24 2007, 05:26) *
Если вы захотите уменьшить период,

такое наблюдается только при увеличении периода, потом, длительность зависания на 1-2 сек - это несоизменимо с частотой 2 кГц. Это - гораздо больше, чем переполнение.


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


Гуру
******

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



Цитата(repairDV @ Dec 24 2007, 01:30) *
такое наблюдается только при увеличении периода, потом, длительность зависания на 1-2 сек - это несоизменимо с частотой 2 кГц. Это - гораздо больше, чем переполнение.

Еще раз повторяю, что я не знаком с CF. Но в любом случае изменение периода "на лету" нужно делать синхронно со счетом/перезагрузкой таймера.
Go to the top of the page
 
+Quote Post
Sild
сообщение Dec 26 2007, 13:57
Сообщение #5


Участник
*

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



Вот, например, Renesas занимается PWM генераторами вполне независимыми от прерываний. Достаточно выставить 2-3 регистра и заниматься другими делами.

http://www.renesas.com/fmwk.jsp?fp=/produc...tes&lid=143
Go to the top of the page
 
+Quote Post
Murk
сообщение Dec 27 2007, 00:16
Сообщение #6


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

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



Sild
В этих процессорах требуется останов таймера для перезагрузки.


--------------------
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Чем больше слёз тем больше облегчения, в слезах и заключается лечение.
Go to the top of the page
 
+Quote Post
Sild
сообщение Dec 27 2007, 13:20
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
Murk
сообщение Dec 27 2007, 23:33
Сообщение #8


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

Группа: Участник
Сообщений: 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.


--------------------
Политика России будет выглядеть неоднозначной до тех пор, пока не будет решен исход битвы.
Чем больше слёз тем больше облегчения, в слезах и заключается лечение.
Go to the top of the page
 
+Quote Post
repairDV
сообщение Dec 28 2007, 00:25
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 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


--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
Go to the top of the page
 
+Quote Post
repairDV
сообщение Dec 28 2007, 02:23
Сообщение #10


Знающий
****

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



Ага, а всё-таки я оказался немного не прав, но только на 50%. Сейчас кое-что изменил, последоательность стала:
1. Останов таймера
2. Запись значения 0
3. Новая запись в регистр сравнения
4. Запуск таймера
И дёргания исчезли. Но, я неправ только на 50%, ибо прерывания-то по таймерам здесь не нужны. А это-главное, чтобы он не отвлекался от своих задач.


--------------------
Маленький нанайца. А-а. А-а. Оморочком плыл. Маленький проточка. Осетра ловил.
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 28 2007, 06:38
Сообщение #11


Гуру
******

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



Еще две проблемы, о которых я не упомянул. Первая связана с различием в разрядности МК и разрядности таймера. Вторая накладывается на первую и связана с возможностью асинхронного тактирования таймера.
В первом случае (если разрядность МК меньше разрядности таймера) следует останавливать таймер для записи нового значения capture.
Во втором случае необходимость остановки зависит от особенностей архитектуры таймера. Если у него (у таймера) имеется возможность буферизации записи нового значения capture, то останов не требуется в обязательном порядке.
Go to the top of the page
 
+Quote Post
Sild
сообщение Dec 28 2007, 11:57
Сообщение #12


Участник
*

Группа: Новичок
Сообщений: 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 я согласен - без бутылки портвейна гарантировать работу - нереально.
Go to the top of the page
 
+Quote Post
VadimPlotnikov
сообщение Dec 30 2007, 12:53
Сообщение #13


Участник
*

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



По поводу других процессоров. Во многих PICах есть модуль ШИМ. Сам постоянно использую в качестве 8-битного ЦАПа. Работает независимо от основной программы. В процессе работе необходимо только переписывать регистр например CPL1L (для 8-битного режима) без всяких остановок и синхронизации.
Go to the top of the page
 
+Quote Post

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

 


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


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