|
Замечал ли кто-то странности с PWM на lpc2103 ?, непонятное поведение регистра сравнения в PWM режиме |
|
|
|
Jul 7 2008, 14:46
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 15-02-07
Из: Москва
Пользователь №: 25 386

|
Уважаемый ALL, может быть кто-то сталкивался, помогите в какую сторону копнуть... IAR 5.11, IAR Elf Linker for ARM 5.11.0.50622 (5.11.0.50622) IAR C/C++ Compiler for ARM 5.11.0.20622 (5.11.0.20622) Вывожу с помощью PWM синус по 800 точкам. таблица синуса объявлена полуволной!!! из констант unsigned int const sin1024[400]={\ ... }; константы в сегменте флэш-памяти lpc2103. Задача вывода PWM тривиальная - по прерыванию 3-го канала (период) обновляю данные регистра сравнения T0MR0. после RC цепочки на ноге МАТ0.0 смотрим синус осциллографом. Имею абсолютно непонятную ситуацию - "задир" (то есть T0MR0 имеет сильно неверное значение) (иногда два "задира", а иногда - ни одного) на синусе, причем этот задир только на одной (левой "верхней" то бишь значенияT0MR0 должны лежать в диапазоне [0 .. 1/2Period ] ) полуволне, и самое поразительное, что в зависимости от положения звёзд на рабочем проекте "задир(ы)" то проявляются, то не проявляется. На тестовом проекте задир всегда постоянен и всегда один. Таблица синуса правильная, в пошаговом режиме проблем не возникает, на кристалле в головном проекте крутится ещё несколько прерываний, они не являются причиной (иногда синус абсолютно чистый, а иногда именно в данном месте то один, то два "задира"). Проблема проявляется даже на прилагаемом тестовом проекте (должен заработать у каждого под иар5.11 ). кварц 12мГц, обычная отладка от Олимекса с 2103. Прошу оказать конструктивную помощь, высказать замечание или кинуть в меня соответствующей ссылкой. Умозрительные предположения прошу делать аккуратно, ибо пока все умозрительные предположения стукнулись головой о реальный камень... ПРИЛАГАЕМЫЙ ПРОЕКТ
test_pwm_issue_lpc2103.rar ( 89.07 килобайт )
Кол-во скачиваний: 114
Сообщение отредактировал avva - Jul 7 2008, 14:54
--------------------
С уважением,
|
|
|
|
|
 |
Ответов
|
Jul 8 2008, 04:08
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Както странно, у Вас PWM_period_val и период таймера (задающий частоту ШИМ) и амплитуда синуса.... Вот тут: Код if (i>399){ // it seems problem in this part of val=( (PWM_period_val-( (PWM_period_val*usin[i-400] -1 )>>10))>>1 ); }else{ val=( ((PWM_period_val+((PWM_period_val*usin[i] -1 )>>10))>>1)); } зачем "-1" ? Искажений добавляете? Впрочем возможно что в вашем случае они не появятся (при перермножении 375 на табличные значения наверняка не будет произведения где младшие 10 бит нулевые). Может хотели ((PWM_period_val-1)*usin[i]) ? Да и вообще весь этот код упростить можно. И почему у Вас в таблице полуволны синуса первый элемент 3 а не 0? А если заменить на 0 то как раз та самая "-1" то и вылезет.  Вот эта конструкция Код i = (i != 799) ? ++i : 0; тоже достойна похвалы...
|
|
|
|
|
Jul 8 2008, 07:08
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 15-02-07
Из: Москва
Пользователь №: 25 386

|
Цитата Както странно, у Вас PWM_period_val и период таймера (задающий частоту ШИМ) и амплитуда синуса.... ... зачем "-1" ? Искажений добавляете? Впрочем возможно что в вашем случае они не появятся (при перермножении 375 на табличные значения наверняка не будет произведения где младшие 10 бит нулевые). Может хотели ((PWM_period_val-1)*usin[i]) ? Да и вообще весь этот код упростить можно. Alex03, проблема абсолютно в другом.... (я согласен с вами, что "-1" это лишнее, но это всё-равно. таблица полу-синуса хоть с 10 может начинаться - она на 0х3FF отнормирована, так что там всё-равно.). проблема в том, что каким-то непонятным образом в tmrmr0 !однократно! попадает!? значение больше или равное периоду pwm, что вызывает установку соответсвтующей ноги в 0 на период шима. как такое происходит - ума не приложу. пока все догадки и эксперименты были из области фантастики, по-этому я решил обратиться к многоуважаемому сообществу. Цитата И почему у Вас в таблице полуволны синуса первый элемент 3 а не 0? А если заменить на 0 то как раз та самая "-1" то и вылезет.  Вот эта конструкция Код i = (i != 799) ? ++i : 0; тоже достойна похвалы...  это стандартная конструкция языка ANSI C, думаю это вопрос не принципиальный ) Цитата(GetSmart @ Jul 7 2008, 19:41)  Могу сказать, что делал почти точно так же на LPC2132 и всё работало чудесно. Только перезагрузку MACH регистра делал по прерыванию 0-ого канала, который задаёт период PWM, то бишь обнуляет счётчик. В возникающем при этом прерывании обновлял PWMMR1 и стробировал PWMLER, а затем сразу же выходил из прерывания.
Кстати, таймер отличается от PWM тем, что у него нет защёлок на MACH регистрах (регистра PWMLER). Может в этом косяк. я использую именно описанный в доке режим PWM, канал 3 - задаёт период PWM, а каналы 0 1 и 2 в рабочем проекте - разные PWM с одним периодом (канал 3) собственно в данном случае проблему надо глазами видеть. Понимаете, я бы понял, если бы проблема проявлялась на "пике" какого-то канала, тогда можно было бы говорить о переполнении и всякой такой простой ерунде, однако "задир" проявляется - фото (качество не очень, синус - идеальный но имеет "задир") Буду благодарен за умную мысль по теме. ФОТО "ЗАДИРА"
--------------------
С уважением,
|
|
|
|
|
Jul 8 2008, 09:22
|
Местный
  
Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034

|
Цитата(avva @ Jul 8 2008, 13:08)  Код i = (i != 799) ? ++i : 0; это стандартная конструкция языка ANSI C, думаю это вопрос не принципиальный ) ИМХО это из области Код i += i++ + ++i; Не рекомендовал бы так писать. К тому же если объявить i как volatile то переменная будет прописываться в памяти дважды (да и в некоторых других случаях, как то debug, тоже), хоть и одним значением. Лучше/правильнее Код i = (i != 799) ? i+1 : 0; или уж Код if(i != 799) ++i; else i = 0; Впрочем, ДА, к теме топика не имеет отношения. Цитата(avva @ Jul 8 2008, 13:08)  Понимаете, я бы понял, если бы проблема проявлялась на "пике" какого-то канала, тогда можно было бы говорить о переполнении и всякой такой простой ерунде, однако "задир" проявляется - фото RC-цепочка двигает фазу, так что возможно что на фото и есть пик синусоиды...
|
|
|
|
|
Jul 8 2008, 09:24
|
Участник

Группа: Участник
Сообщений: 21
Регистрация: 15-02-07
Из: Москва
Пользователь №: 25 386

|
Alex03, спасибо, я учту в будущем. (серьёзно). Цитата RC-цепочка двигает фазу, так что возможно что на фото и есть пик синусоиды... Фигню полную написали вы сейчас насчёт возможного пика.
Сообщение отредактировал avva - Jul 8 2008, 09:27
--------------------
С уважением,
|
|
|
|
Сообщений в этой теме
avva Замечал ли кто-то странности с PWM на lpc2103 ? Jul 7 2008, 14:46 GetSmart Могу сказать, что делал почти точно так же на LPC2... Jul 7 2008, 15:41    Alex03 Цитата(avva @ Jul 8 2008, 15:24) Alex03, ... Jul 8 2008, 10:01 GetSmart Вобщем так. Без LER регистра будет наблюдаться сле... Jul 8 2008, 08:32 avva Уважаемый GetSmart, похоже, что вы оказались правы... Jul 8 2008, 09:16  cebotor Цитата(avva @ Jul 8 2008, 13:16) 100+ T... Jul 8 2008, 10:26   GetSmart Цитата(cebotor @ Jul 8 2008, 16:26) Вопро... Jul 8 2008, 10:56    cebotor Цитата(GetSmart @ Jul 8 2008, 14:56) Одна... Jul 8 2008, 11:13     GetSmart Цитата(cebotor @ Jul 8 2008, 17:13) Cмысл... Jul 8 2008, 11:35 GetSmart Цитата(avva)Уважаемый GetSmart, похоже, что вы ока... Jul 8 2008, 09:36 avva Цитата(GetSmart @ Jul 8 2008, 13:36) Я ок... Jul 8 2008, 10:34 alexander55 Цитата(GetSmart @ Jul 8 2008, 13:36) Я ок... Jul 8 2008, 10:41 avva Вариант 2, учитывающий абсолютно верное замечание ... Jul 8 2008, 12:18 Lotor Цитата(avva @ Jul 8 2008, 16:18) val=( ((... Jul 9 2008, 09:13  avva Цитата(Lotor @ Jul 9 2008, 13:13) Не хоче... Jul 9 2008, 09:27   Lotor Цитата(avva @ Jul 9 2008, 13:27) внутри т... Jul 9 2008, 09:34 Alex03 Если бы PWM_period_val было чётным, то можно было ... Jul 10 2008, 05:13
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|