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

 
 
> Замечал ли кто-то странности с PWM на lpc2103 ?, непонятное поведение регистра сравнения в PWM режиме
avva
сообщение Jul 7 2008, 14:46
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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


--------------------
С уважением,
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Alex03
сообщение Jul 8 2008, 04:08
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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" то и вылезет. smile.gif


Вот эта конструкция
Код
i = (i != 799) ? ++i : 0;
тоже достойна похвалы... sad.gif
Go to the top of the page
 
+Quote Post
avva
сообщение Jul 8 2008, 07:08
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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" то и вылезет. smile.gif
Вот эта конструкция
Код
i = (i != 799) ? ++i : 0;
тоже достойна похвалы... sad.gif

это стандартная конструкция языка 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)

собственно в данном случае проблему надо глазами видеть. Понимаете, я бы понял, если бы проблема проявлялась на "пике" какого-то канала, тогда можно было бы говорить о переполнении и всякой такой простой ерунде, однако "задир" проявляется - фото (качество не очень, синус - идеальный но имеет "задир")

Буду благодарен за умную мысль по теме.

ФОТО "ЗАДИРА"
Прикрепленное изображение


--------------------
С уважением,
Go to the top of the page
 
+Quote Post
Alex03
сообщение Jul 8 2008, 09:22
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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-цепочка двигает фазу, так что возможно что на фото и есть пик синусоиды...
Go to the top of the page
 
+Quote Post
avva
сообщение Jul 8 2008, 09:24
Сообщение #5


Участник
*

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



Alex03, спасибо, я учту в будущем. (серьёзно).

Цитата
RC-цепочка двигает фазу, так что возможно что на фото и есть пик синусоиды...


Фигню полную написали вы сейчас насчёт возможного пика.

Сообщение отредактировал avva - Jul 8 2008, 09:27


--------------------
С уважением,
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 04:18
Рейтинг@Mail.ru


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