|
|
  |
PWM на LPC2294, не получается запустить в режиме PWM |
|
|
|
Aug 11 2009, 16:57
|
Местный
  
Группа: Свой
Сообщений: 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 его нет причем значимость данного регистра как раз то чего не хватает. вырезку из книги прикрепляю (стр. 100) Если кто сталкивался, поделитесь опытом как бороться
|
|
|
|
|
Aug 11 2009, 18:33
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(GetSmart @ Aug 11 2009, 21:11)  После каждой записи в PWMMRx нужно дёргать битом в PWMLER. дергаю, в том то и дело, не помогает  Код PWMLER = 0x07; на 0, 1 и 2 MR соответственно.
|
|
|
|
|
Aug 11 2009, 20:24
|
Местный
  
Группа: Свой
Сообщений: 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 счетчик шима будет стоять, и стоит, проверил. смысл есть, формирование охранной паузы к примеру, да и канал мне не один нужен, это лишь тестовый пример, чтобы не отвлекать от сути проблемы.
|
|
|
|
|
Aug 11 2009, 21:17
|
.
     
Группа: Участник
Сообщений: 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 не успевает. Вероятно потому, что проходит через мультиплексор (на блок-схеме видно).
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 11 2009, 21:42
|
Местный
  
Группа: Свой
Сообщений: 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, кусок даташита приложил.
Эскизы прикрепленных изображений
|
|
|
|
|
Aug 11 2009, 22:14
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
А я в своих проектах обычно всегда прерывание от ШИМа использовал. Так что нужно PWMMCR = 0x02, остальные биты прерываний по вкусу  Цитата(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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 12 2009, 05:45
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(GetSmart @ Aug 12 2009, 01:14)  А я в своих проектах обычно всегда прерывание от ШИМа использовал. Так что нужно PWMMCR = 0x02, остальные биты прерываний по вкусу  Однако я писал про PWMMCR = 0x03, а не про PWMTCR, который на картинке. не заметил Цитата На самом деле записывать в "рабочие" 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 но все это не относиться к режиму с теневыми регистрами. Обычно они в каждом месте сноски ставят, а тут одно предложение. зато теперь запомню надолго
|
|
|
|
|
Aug 12 2009, 06:34
|
Частый гость
 
Группа: Свой
Сообщений: 147
Регистрация: 5-07-04
Из: Обнинск
Пользователь №: 261

|
Привет! Глянь мою тему на эту же тему: http://electronix.ru/forum/index.php?showtopic=43938&hl= (пардон за тавтологию). В начале описание проблемы, а в самом конце найденное решение. Проверь, может и у тебя таже фигня.
|
|
|
|
|
Aug 12 2009, 11:10
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

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

Группа: Свой
Сообщений: 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 остаются нулевыми, даже если в отладчике поменять вручную их значение. В чем может быть проблема?
|
|
|
|
|
Oct 13 2012, 09:02
|
Участник

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

|
Цитата(RabidRabbit @ Oct 13 2012, 07:56)  Может PWM отключается в стартапе? (PCONP.PCPWM0) Да! А слона то я и не заметил  Спасибо!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|