|
Замечал ли кто-то странности с 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, 09:16
|
Участник

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

|
Уважаемый GetSmart, похоже, что вы оказались правы или где-то очень очень рядом около того.
СПАСИБО.
Во всяком случае, патч вот этих строчек в тестовом проекте привёл к желаемому результату, жаль только, что форма синуса изза остановки таймера периода в момент прерывания и перезагрузки регистров сравнения, немножечко будет искажена. думаю, искажением формы можно пренебречь
100+ T0TCR = 0x01; //перезапуск таймера после окончания прерывания таймера
218 T0MCR = 0x0E00; // добавление STOP в процедуре инита периода шима таймера0 канал3
--------------------
С уважением,
|
|
|
|
|
Jul 8 2008, 10:26
|

Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809

|
Цитата(avva @ Jul 8 2008, 13:16)  100+ T0TCR = 0x01; //перезапуск таймера после окончания прерывания таймера причина засора прояснилась, однако я совершенно не согласен что можно принебрегать формой синусоиды , вводя такие погрешности уважаемый АВВА вы из чистой синусоиды на спектре получите фиг знает что. Вопрос - почему нельзя перегружать значение по соответствующему прерыванию (для нулевого канала по прерыванию матча нулевого канала )- будет все хорошо и вперед и назад ?
--------------------
если еррата пуста - это не хорошо а плохо
|
|
|
|
|
Jul 8 2008, 10:56
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(cebotor @ Jul 8 2008, 16:26)  Вопрос - почему нельзя перегружать значение по соответствующему прерыванию (для нулевого канала по прерыванию матча нулевого канала )- будет все хорошо и вперед и назад ?  Вот это хорошая идея. Если при срабатывании MATCH-а вызывать прерывание, то можно сразу же перезагружать этот MR регистр. Этот алгоритм подходит когда в сигнале нет резких скачков, как раз для синусоиды. Однако нельзя будет загружать в MR значение большее или равное периоду. Таким образом за один период для трёхканального ШИМа будет три раза срабатывать одно и то же прерывание, в котором анализируя флаг TxIR можно узнать какой MR сработал. Цитата(avva) К сожалению в данном случае мне нужен весь диапазон значений PWM и не удастся ввести постоянную корректировочную составляющую. Остановив таймер Вы её уже ввели  То есть после обнуления таймера появляются те же ~20 тактов паузы, только они теперь увеличили период с 375 до грубо 395 тактов PCLK. При этом получился плавающий период и нестабильная частота, особенно в присутствии других прерываний.
Сообщение отредактировал GetSmart - Jul 8 2008, 11:04
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
Сообщений в этой теме
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    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
|
|
|