Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Таймер как генератор ШИМ
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры
repairDV
Традиционно ШИМ формируется таймерами посредством операций с прерыванием. Но - не у всех микроконтроллеров. Серия 56F8xx Freescale имеет такие свойства: таймеры программируются как генераторы, работающие независимо от процессора, т.е., при этом операция прерывания не нужна. Для изменения периода и скважности в любых пределах имеется 2 регистра сравнения: верхний и нижний, который процессор использует для этих целей без остановки таймеров. Т.е., в одном корпусе получается как бы несколько независимо работающих устройств: собственно сам проц исполняет потихоньку свою программу, не мешая ему работают таймеры. Имеются специальные выводы у контроллера для вывода полученных частот. Я думаю, понятно, что это значит для обеспечения бесперебойности работы программы, когда процу не нужны прерывания по таймерам для получения частоты. Такое свойство имеют либо все 16 16-разрядных таймеров, либо несколько.
У бочки мёда обнаружилась ложка дёгтя. Я, правда, пока использую проц из этой серии ещё с буквами "XC" на корпусе, т.е., это ещё опытный образец. Хорошо было бы, если бы в более поздних номерах этой серии этот глюк был устранён. А именно: временами(не постоянно) при изменении частоты с более высокой на более низкую таймер на 1-2 сек "зависает", потом опять включается. А это - глюк серьёзный.
Просто интересно: есть ли у других фирм микроконтроллеры с такими свойствами таймеров?
rezident
Цитата(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-битного таймера).
Надеюсь понятно пояснил?
repairDV
Цитата(rezident @ Dec 24 2007, 05:26) *
Если вы захотите уменьшить период,

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

Еще раз повторяю, что я не знаком с CF. Но в любом случае изменение периода "на лету" нужно делать синхронно со счетом/перезагрузкой таймера.
Sild
Вот, например, Renesas занимается PWM генераторами вполне независимыми от прерываний. Достаточно выставить 2-3 регистра и заниматься другими делами.

http://www.renesas.com/fmwk.jsp?fp=/produc...tes&lid=143
Murk
Sild
В этих процессорах требуется останов таймера для перезагрузки.
Sild
Цитата(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.
Murk
Вот как раз сегодня, а нет уже вчера, пришлось писать значение в счетчик 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.
repairDV
Цитата(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
Ага, а всё-таки я оказался немного не прав, но только на 50%. Сейчас кое-что изменил, последоательность стала:
1. Останов таймера
2. Запись значения 0
3. Новая запись в регистр сравнения
4. Запуск таймера
И дёргания исчезли. Но, я неправ только на 50%, ибо прерывания-то по таймерам здесь не нужны. А это-главное, чтобы он не отвлекался от своих задач.
rezident
Еще две проблемы, о которых я не упомянул. Первая связана с различием в разрядности МК и разрядности таймера. Вторая накладывается на первую и связана с возможностью асинхронного тактирования таймера.
В первом случае (если разрядность МК меньше разрядности таймера) следует останавливать таймер для записи нового значения capture.
Во втором случае необходимость остановки зависит от особенностей архитектуры таймера. Если у него (у таймера) имеется возможность буферизации записи нового значения capture, то останов не требуется в обязательном порядке.
Sild
Цитата(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 я согласен - без бутылки портвейна гарантировать работу - нереально.
VadimPlotnikov
По поводу других процессоров. Во многих PICах есть модуль ШИМ. Сам постоянно использую в качестве 8-битного ЦАПа. Работает независимо от основной программы. В процессе работе необходимо только переписывать регистр например CPL1L (для 8-битного режима) без всяких остановок и синхронизации.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.