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

 
 
> Замечал ли кто-то странности с 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
Ответов
avva
сообщение Jul 8 2008, 12:18
Сообщение #2


Участник
*

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



Вариант 2, учитывающий абсолютно верное замечание CEBOTOR и замечание Alex03 насчёт запаздывания обновления на период и за счёт этого выигрыш в использовании предпосчитанного значения.

//InitTimer0():
215 T0MCR = 0x0601;

//
void timer0_handler(void)
{
static unsigned int i=0;
static unsigned int val=0;

if ( T0IR & 0x01 ) {
T0MR0 = val;
T0IR = (1<<0);
}

if ( T0IR & 0x08 ) {
if (i>399){
val=( (PWM_period_val-( (PWM_period_val*usin[i-400] )>>10))>>1 );
}else{
val=( ((PWM_period_val+((PWM_period_val*usin[i] )>>10))>>1));
}
i = (i != 799) ? i+1 : 0;
T0IR = (1<<3 );
}

return;
}



За сим предлагаю закончить с данной темой, содружеству спасибо! Не наступайте на такие грабли.


--------------------
С уважением,
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jul 9 2008, 09:13
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(avva @ Jul 8 2008, 16:18) *
val=( ((PWM_period_val+((PWM_period_val*usin[i] )>>10))>>1));

Не хочется создавать новой темы, мне вот сейчас тоже надо получать синусоиду с помощью ШИМ. Не могли бы Вы пояснить, как формируете длину импульса с помощью этой формулы? Дело в том, что я думал использовать конструкцию аля val=PWM_period_val*usin[i]. У Вас же, получается val=(PWM_period_val+PWM_period_val*usin[i]/1024)/2. Не понятно...

Сообщение отредактировал Lotor - Jul 9 2008, 09:14


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
avva
сообщение Jul 9 2008, 09:27
Сообщение #4


Участник
*

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



Цитата(Lotor @ Jul 9 2008, 13:13) *
Не хочется создавать новой темы, мне вот сейчас тоже надо получать синусоиду с помощью ШИМ. Не могли бы Вы пояснить, как формируете длину импульса с помощью этой формулы? Дело в том, что я думал использовать конструкцию аля val=PWM_period_val*usin[i]. У Вас же, получается val=(PWM_period_val+PWM_period_val*usin[i]/1024)/2. Не понятно...


внутри таблица синуса - половинка волны в unsigned c диапазоном значений 0-1024. по-этому нормировка амплитуды = 1/1024 ну а на 2 делится потому-что от середины половинка строится...
проект скачайте, поиграйтесь и всё поймёте..


--------------------
С уважением,
Go to the top of the page
 
+Quote Post
Lotor
сообщение Jul 9 2008, 09:34
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(avva @ Jul 9 2008, 13:27) *
внутри таблица синуса - половинка волны в unsigned c диапазоном значений 0-1024. по-этому нормировка амплитуды = 1/1024 ну а на 2 делится потому-что от середины половинка строится...
проект скачайте, поиграйтесь и всё поймёте..

Спасибо, разобрался.


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
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   Както странно, у Вас PWM_period_val и период тайме...   Jul 8 2008, 04:08
|- - avva   ЦитатаКакто странно, у Вас PWM_period_val и период...   Jul 8 2008, 07:08
|- - Alex03   Цитата(avva @ Jul 8 2008, 13:08) Кодi = ...   Jul 8 2008, 09:22
|- - avva   Alex03, спасибо, я учту в будущем. (серьёзно). Ци...   Jul 8 2008, 09:24
|- - 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
- - Alex03   Если бы PWM_period_val было чётным, то можно было ...   Jul 10 2008, 05:13


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

 


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


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