Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PWM на LPC2294
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
andrvisht
нужно менять значение ШИМ на лету, задачка вроде стандартная, и для ней предлагается решение в виде PWM.
тестовый код для инициализации канала 2
Код
    PINSEL0 = 0x00008000; // PWM 2
    PWMMCR = 0x00000081; // MR2 - Reset, MR0 - interrupt
    PWMPCR = 0x00000404; // PWMSEL 2 = 1, PWMENA 2 = 1
    PWMMR1 = 0x80;
    PWMMR2 = 0x100;
    PWMMR0 = 0x50;
    PWMLER = 0x07;
    PWMTCR = 0x09; // PWM enable, Count start

работает только в симуляторе, в железе никак.
если поставить PWMTCR = 0x01; - все вертиться, но это уже не PWM ...
проверил даташит на предмет хитростей - ничего не нашел.

в книге Тревора Мартина обнаружил подобный пример, но там есть регистр PWMEMR а в LPC2294 его нет cranky.gif
причем значимость данного регистра как раз то чего не хватает.
вырезку из книги прикрепляю (стр. 100)

Если кто сталкивался, поделитесь опытом как бороться crying.gif
GetSmart
После каждой записи в PWMMRx нужно дёргать битом в PWMLER. Для простоты можно записывать в PWMLER сразу 0xff. Иначе в теневых регистрах (и на выходах) будет старое значение ШИМ. Однако теневые регистры можно отключить, а точнее не включать битом 3 в PWMTCR. При этом на выходах ШИМ будут мгновенно появляться значения при перезаписи PWMMRx. Но в таком режиме возможны разные глюки. Так что самый оптимальный вариант - сначала записывать в PWMMRx, а потом стробировать PWMLER.
andrvisht
Цитата(GetSmart @ Aug 11 2009, 21:11) *
После каждой записи в PWMMRx нужно дёргать битом в PWMLER.


дергаю, в том то и дело, не помогает sad.gif
Код
PWMLER = 0x07;

на 0, 1 и 2 MR соответственно.
GetSmart
PWMMR0 задаёт период таймера/ШИМа. Его значение обычно должно быть больше чем в остальных PWMMR. Но у Вас почему-то оно меньше чем в остальных каналах. Нулевой канал обычно один раз устанавливается и больше не меняется. Поэтому в последствии младший бит в PWMLER не нужно дёргать. Но если PWMMR0 не трогать, то это не принципиально.

Если с PWMTCR = 0x01 работает, а с PWMTCR = 0x09 не работает, то странно. Режимы отличаются только наличием теневых регистров и всё.

И вообще, для нормальной работы ШИМа обычно в PWMMCR записывается 0x03. Плюс, для любых каналов можно ещё прерывания разрешать. Но нет смысла ставить сброс TC или остановку TC на каналы, кроме 0.
andrvisht
Цитата(GetSmart @ Aug 11 2009, 21:59) *
PWMMR0 задаёт период таймера/ШИМа. Его значение обычно должно быть больше чем в остальных PWMMR. Но у Вас почему-то оно меньше чем в остальных каналах. Нулевой канал обычно один раз устанавливается и больше не меняется. Поэтому в последствии младший бит в PWMLER не нужно дёргать. Но если PWMMR0 не трогать, то это не принципиально.


это так, но вроде только для атмеловских SAM, а у LPC сброс может проводить любой из MR конфигурация чего задается
Код
PWMMCR = 0x00000081; // MR2 - Reset, MR0 - interrupt

прерывание по MR0 сдесь лишнее, забыл убрать эксперименты.
Цитата
Если с PWMTCR = 0x01 работает, а с PWMTCR = 0x09 не работает, то странно. Режимы отличаются только наличием теневых регистров и всё.

вот я тоже так думал .... а получается нет, запускаю в отладке с MT-LINK останавливаюсь, снимаю галочку на PWM Enable и все генерит, ставлю и все пропадает, чудеса.
Цитата
И вообще, для нормальной работы ШИМа обычно в PWMMCR записывается 0x03. Плюс, для любых каналов можно ещё прерывания разрешать. Но нет смысла ставить сброс TC или остановку TC на каналы, кроме 0.

вероятно Вы с чем то путаете, 03 - сброс таймера следующим тактовым импульсом, и пока оно не станет 01 счетчик шима будет стоять, и стоит, проверил.
смысл есть, формирование охранной паузы к примеру, да и канал мне не один нужен, это лишь тестовый пример, чтобы не отвлекать от сути проблемы.
GetSmart
Цитата(andrvisht @ Aug 12 2009, 02:24) *
вероятно Вы с чем то путаете, 03 - сброс таймера следующим тактовым импульсом, и пока оно не станет 01 счетчик шима будет стоять, и стоит, проверил.
смысл есть, формирование охранной паузы к примеру, да и канал мне не один нужен, это лишь тестовый пример, чтобы не отвлекать от сути проблемы.

Вроде я не путаю. Много раз делал PWM на LPC213x и LPC2294. Абсолютно одинаковые у них ШИМ. То, что канал 0 предназначен для задания периода - чёрным по белому написано в мануале. Для него даже выхода на пин нет. Для остальных 6-ти каналов есть пины. Кроме этого, для однофронтовых каналов (Single Edge PWM) установка выхода канала в "1" происходит именно при совпадении PWMTC с PWMMR0.

Цитата(andrvisht @ Aug 12 2009, 02:24) *
вероятно Вы с чем то путаете, 03 - сброс таймера следующим тактовым импульсом, и пока оно не станет 01 счетчик шима будет стоять

В LPC213x точно сброс таймера происходит при совпадении с MRx. Сам проверял. Если в MR0 записать 1024, то TC только на мгновение установится в 1024 и сразу же сбросится в 0. Таким образом 1024 в TC можно считать никогда не будет. В LPC2294 думаю сделано аналогично.

Цитата(andrvisht @ Aug 12 2009, 02:24) *
это так, но вроде только для атмеловских SAM, а у LPC сброс может проводить любой из MR конфигурация чего задается

Это можно делать, но уже для нестандартных ШИМов, что несоответствует:
Цитата(andrvisht)
нужно менять значение ШИМ на лету, задачка вроде стандартная, и для ней предлагается решение в виде PWM.


Цитата(andrvisht @ Aug 12 2009, 02:24) *
смысл есть, формирование охранной паузы к примеру, да и канал мне не один нужен, это лишь тестовый пример, чтобы не отвлекать от сути проблемы.

Я сначала не заметил, что режим ШИМа нестандартный. Выбран сброс TC по MR2 и одновременно сброс пина PWM2 в "0" по тому же событию. Если "в железе" наблюдается постоянное присутствие "1" на выходе PWM2 при PWMTCR = 0x09, то это есть недопустимый режим для PWM. Так как TC успевает сброситься от MR2, а пин PWM2 не успевает. Вероятно потому, что проходит через мультиплексор (на блок-схеме видно).
andrvisht
Цитата(GetSmart @ Aug 11 2009, 23:43) *
Вроде я не путаю. Много раз делал PWM на LPC213x и LPC2294. Абсолютно одинаковые у них ШИМ. То, что канал 0 предназначен для задания периода - чёрным по белому написано в мануале. Для него даже выхода на пин нет. Для остальных 6-ти каналов есть пины. Кроме этого, для однофронтовых каналов (Single Edge PWM) установка выхода канала в "1" происходит именно при совпадении PWMTC с PWMMR0.

выхода нет, только на управления защелками теневых регистров и идет.
вот я со второго и начал, чтобы можно было установить и сбросить разными MRx
Цитата
В LPC213x точно сброс таймера происходит при совпадении с MRx. Сам проверял. Если в MR0 записать 1024, то TC только на мгновение установится в 1024 и сразу же сбросится в 0. Таким образом 1024 в TC можно считать никогда не будет. В LPC2294 думаю сделано аналогично.

после вашего предыдущего поста проверил, действительно так и есть. а после этого нашел таки это место в даташите ...
Again, the PWMMR0 match register controls the PWM cycle rate. а выше в описании для простого ШИМ
One match register (PWMMR0) controls the PWM cycle rate ...

вот как всегда пару слов и описание возможностей сброса любым шимом, но уже без сноски по поводу того что MR0 должен быть больше чем любой сбрасывающий ... причем только в режиме PWM, без теневых он то работает ...!

Большое спасибо за терпение.
а насчет 03 я все таки не согласен, это 0 и 1 бит в 1, кусок даташита приложил.
GetSmart
А я в своих проектах обычно всегда прерывание от ШИМа использовал. Так что нужно PWMMCR = 0x02, остальные биты прерываний по вкусу smile.gif

Цитата(andrvisht @ Aug 12 2009, 03:42) *
а насчет 03 я все таки не согласен, это 0 и 1 бит в 1, кусок даташита приложил.

Однако я писал про PWMMCR = 0x03, а не про PWMTCR, который на картинке.

И ещё, я перед любыми изменениями в управляющих регистрах (MRx и LER это не касается) делаю PWMTCR = 0x02.

Цитата(andrvisht @ Aug 12 2009, 03:42) *
вот как всегда пару слов и описание возможностей сброса любым шимом, но уже без сноски по поводу того что MR0 должен быть больше чем любой сбрасывающий ... причем только в режиме PWM, без теневых он то работает ...!

На самом деле записывать в "рабочие" MRx можно абсолютно любые значения, даже большие MR0. Никаких глюков не будет. Например чтобы полностью включить пин в "1" в соответствующий MRx можно записать число большее MR0. При равном же значении (я не проверял, но) возможно будет иголка на пине. Чтобы полностью обнулить пин нужно записать в MRx = 0.
andrvisht
Цитата(GetSmart @ Aug 12 2009, 01:14) *
А я в своих проектах обычно всегда прерывание от ШИМа использовал. Так что нужно PWMMCR = 0x02, остальные биты прерываний по вкусу smile.gif

Однако я писал про PWMMCR = 0x03, а не про PWMTCR, который на картинке.


не заметил laughing.gif

Цитата
На самом деле записывать в "рабочие" MRx можно абсолютно любые значения, даже большие MR0. Никаких глюков не будет. Например чтобы полностью включить пин в "1" в соответствующий MRx можно записать число большее MR0. При равном же значении (я не проверял, но) возможно будет иголка на пине. Чтобы полностью обнулить пин нужно записать в MRx = 0.


иголки не будет, пишут что сброс имеет больший приоритет.
If both a set and a clear of a PWM output are requested at the same time, clear takes
precedence. This can occur when the set and clear match values are the same as in,
or when the set or clear value equals 0 and the other value equals the PWM rate.

писать можно, я вообщем то так и сбрасываю генерацию, просто с этим 0 каналом .... сбило с толку что можно сбрасывать останавливать любым MRx но все это не относиться к режиму с теневыми регистрами. Обычно они в каждом месте сноски ставят, а тут одно предложение.

зато теперь запомню надолго smile.gif
richie
Привет!
Глянь мою тему на эту же тему: http://electronix.ru/forum/index.php?showtopic=43938&hl=
(пардон за тавтологию).
В начале описание проблемы, а в самом конце найденное решение.
Проверь, может и у тебя таже фигня.
andrvisht
Цитата(richie @ Aug 12 2009, 09:34) *
Привет!
Глянь мою тему на эту же тему: http://electronix.ru/forum/index.php?showtopic=43938&hl=
(пардон за тавтологию).
В начале описание проблемы, а в самом конце найденное решение.
Проверь, может и у тебя таже фигня.


нет, у меня другие грабли, хотя не такие интересные как ваши. взял на заметку, спасибо.
GetSmart
Цитата(andrvisht @ Aug 12 2009, 11:45) *
писать можно, я вообщем то так и сбрасываю генерацию, просто с этим 0 каналом .... сбило с толку что можно сбрасывать останавливать любым MRx но все это не относиться к режиму с теневыми регистрами. Обычно они в каждом месте сноски ставят, а тут одно предложение.

зато теперь запомню надолго smile.gif

Кстати, это может быть новый "неоткрытый" пунктик в еррате.
Alex_VI
Подниму тему.

С LPC2294 работаю первый раз. Столкнулся с проблемой. Пытаюсь инициализировать PWM контроллер на работу с PWM2 выходом. Прописываю регистры:

Код
    
PWMPR      = 3;    
PWMTCR |= BIT1;
PWMPCR = BIT10 + BIT12 + BIT13;    
PWMMCR |= BIT1;
PWMMR0 = 100;     
PWMMR2 = 0x00000100;    
PWMMR4 = 0x00000000;    
PWMMR5 = 0x00000000;    
PWMLER = BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6;    
PWMTCR = 0x00000009;


PINSEL0 = 0x00028055
Проблема в том, что все регистры PWM остаются нулевыми, даже если в отладчике поменять вручную их значение.

В чем может быть проблема?
RabidRabbit
Может PWM отключается в стартапе? (PCONP.PCPWM0)
Alex_VI
Цитата(RabidRabbit @ Oct 13 2012, 07:56) *
Может PWM отключается в стартапе? (PCONP.PCPWM0)

Да! А слона то я и не заметил sm.gif
Спасибо!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.