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

 
 
 
Reply to this topicStart new topic
> PWM на LPC2294, не получается запустить в режиме PWM
andrvisht
сообщение Aug 11 2009, 16:57
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



нужно менять значение ШИМ на лету, задачка вроде стандартная, и для ней предлагается решение в виде 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
Прикрепленные файлы
Прикрепленный файл  p0100_sel.bmp ( 957.09 килобайт ) Кол-во скачиваний: 16
 
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 11 2009, 18:11
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



После каждой записи в PWMMRx нужно дёргать битом в PWMLER. Для простоты можно записывать в PWMLER сразу 0xff. Иначе в теневых регистрах (и на выходах) будет старое значение ШИМ. Однако теневые регистры можно отключить, а точнее не включать битом 3 в PWMTCR. При этом на выходах ШИМ будут мгновенно появляться значения при перезаписи PWMMRx. Но в таком режиме возможны разные глюки. Так что самый оптимальный вариант - сначала записывать в PWMMRx, а потом стробировать PWMLER.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Aug 11 2009, 18:33
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(GetSmart @ Aug 11 2009, 21:11) *
После каждой записи в PWMMRx нужно дёргать битом в PWMLER.


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

на 0, 1 и 2 MR соответственно.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 11 2009, 18:59
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

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

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

Сообщение отредактировал GetSmart - Aug 11 2009, 19:01


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Aug 11 2009, 20:24
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(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 счетчик шима будет стоять, и стоит, проверил.
смысл есть, формирование охранной паузы к примеру, да и канал мне не один нужен, это лишь тестовый пример, чтобы не отвлекать от сути проблемы.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 11 2009, 21:17
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(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 не успевает. Вероятно потому, что проходит через мультиплексор (на блок-схеме видно).


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Aug 11 2009, 21:42
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(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, кусок даташита приложил.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 11 2009, 22:14
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



А я в своих проектах обычно всегда прерывание от ШИМа использовал. Так что нужно 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.

Сообщение отредактировал GetSmart - Aug 11 2009, 22:01


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Aug 12 2009, 05:45
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(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
Go to the top of the page
 
+Quote Post
richie
сообщение Aug 12 2009, 06:34
Сообщение #10


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

Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261



Привет!
Глянь мою тему на эту же тему: http://electronix.ru/forum/index.php?showtopic=43938&hl=
(пардон за тавтологию).
В начале описание проблемы, а в самом конце найденное решение.
Проверь, может и у тебя таже фигня.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Aug 12 2009, 11:10
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



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


нет, у меня другие грабли, хотя не такие интересные как ваши. взял на заметку, спасибо.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 13 2009, 19:47
Сообщение #12


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



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

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

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


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Alex_VI
сообщение Oct 12 2012, 19:45
Сообщение #13


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 17-11-08
Из: Москва
Пользователь №: 41 710



Подниму тему.

С 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 остаются нулевыми, даже если в отладчике поменять вручную их значение.

В чем может быть проблема?
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Oct 13 2012, 03:56
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Может PWM отключается в стартапе? (PCONP.PCPWM0)
Go to the top of the page
 
+Quote Post
Alex_VI
сообщение Oct 13 2012, 09:02
Сообщение #15


Участник
*

Группа: Свой
Сообщений: 56
Регистрация: 17-11-08
Из: Москва
Пользователь №: 41 710



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

Да! А слона то я и не заметил sm.gif
Спасибо!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 08:53
Рейтинг@Mail.ru


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