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

 
 
> G2553, PWM, джиттер.
dungeon
сообщение Aug 6 2013, 09:45
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 19-01-07
Из: Украина, Винница
Пользователь №: 24 583



Делаю ШИМ для двигателя постоянного тока на базе MSP430G2553 и возникла проблема джиттера ШИМа. Период ШИМа задается переменным резистором 10кОм на порт Р1.5. По 8 выборкам АЦП делаю усреднение и заношу это значение в TA1CCR1. Диапазон значений от 0..0x3F9. В диапазоне значений от 0х15...0х45 наблюдаю джиттер на выводе Р2.1 (см. рис.). Что я упускаю? Как это выловить в отладчике?

P.S. Весь проект в архиве. Запускается на LaunchPad. Кнопка S1 - старт/стоп.

Прикрепленный файл  DC_PWM_20pin_.rar ( 399.04 килобайт ) Кол-во скачиваний: 98

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
_pv
сообщение Aug 6 2013, 10:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



таймер тут непричём, плохо фильтруете значения АЦП.
сохраните лог значений АЦП пока резистор крутится всё станет понятно

можно сделать простой БИХ фильтр с узкой полосой.
static long acc = 0;
acc += (ADC - PWM);
PWM = acc >> K;
K выбрать такое чтобы (частота АЦП / 2^K) было около 0.1 .. 1 секунды.

ну или еще чтобы убрать выбросы во время изменения сопротивления можно на производную смотреть и пропускать часть отсчётов если она слишком большая.
Go to the top of the page
 
+Quote Post
dungeon
сообщение Aug 6 2013, 11:57
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 19-01-07
Из: Украина, Винница
Пользователь №: 24 583



За фильтр спасибо но АЦП скорей всего тут ни причем. Я после вычисления среднего значения ставил строку if (adcAverage>0x0F9) _NOP(); и breakpoint на команду _NOP(), но это ничего не дало. ШИМ глючит но процессор не останавливается.
Go to the top of the page
 
+Quote Post
_pv
сообщение Aug 6 2013, 12:19
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



ну еще может быть при смене значения с большего на меньшее, причём если текущее значение таймера будет больше чем новое значение, он досчитает до переполнения.
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 6 2013, 20:31
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Сильно в программу не вникал, но у вас похоже ошибка в логике управления периодом ШИМ. Изменять значение длительности импульса ШИМ нужно не по прерыванию от переполнения таймера, а по прерыванию от TACCR0, значением которого задается период импульса ШИМ. Разрешите прерывание от CCR0 и смените вектор прерывания на TIMER1_A0_VECTOR, убрав из него обработку TAIV и запретив прерывание от переполнения.
Ну и нужно следить/проверять, чтобы новое значение длительности импульса ШИМ (TAxCCR1) не превышало значение периода ШИМ (TAxCCR0).
Go to the top of the page
 
+Quote Post
dungeon
сообщение Aug 7 2013, 06:20
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 19-01-07
Из: Украина, Винница
Пользователь №: 24 583



Проблему решил (по крайней мере глюков больше не наблюдается). Нужно было значение длительности ШИМа записывать по прерыванию TA1CCR1. Всем откликнувшимся ОГРОМНОЕ СПАСИБО. Тему можно закрыть.
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 7 2013, 06:41
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Ваше решение не совсем корректное. Период ШИМ задается в регистре TACCR0, а в регистре TACCR1 задается длительность импульса ШИМ. Допустим вы посчитали новую длительность импульса ШИМ, увеличив его на 1 единицу от текущего. TAR досчитал до TACCR1, возникло прерывание, вы изменили значение и тут же снова попали в прерывание, т.к. TAR успел увеличиться на 1 единицу и снова совпал с новым значением TACCR1. Осознаете проблему? Поэтому я вам и советую изменять значение длительности импульса ШИМ только по окончании периода ШИМ, т.е. по совпадению TAR и TACCR0 в прерывании по вектору TIMER1_A0_VECTOR
Причем после смены длительности импульса ШИМ прерывание от таймера следует запрещать и разрешать вновь лишь только тогда, как у вас будет готово новое значение для ШИМ.
Go to the top of the page
 
+Quote Post
_pv
сообщение Aug 7 2013, 07:42
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 563
Регистрация: 8-04-05
Из: Nsk
Пользователь №: 3 954



если по прерыванию от совпадения больше ничего другого не делается, то без разницы, значение выхода уже сбросилось в ноль, второй раз просто ничего не произойдёт, но это потенциальные грабли и делать так конечно не надо.
Go to the top of the page
 
+Quote Post
dungeon
сообщение Aug 7 2013, 08:28
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 20
Регистрация: 19-01-07
Из: Украина, Винница
Пользователь №: 24 583



TA1CCR0 не только период ШИМа задает но и разрядность таймера TA1 (прерывания будут возникать одновременно от TA1CCR0 и TA1). Если TA1CCR1 изменять на 1 то "коллизии" возникнуть не должно, так как при отработке прерывания TA1 сможет посчитать гораздо больше единицы. А вот если изменять на большее число то тут вы конечно правы. Есть над чем подумать.
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 7 2013, 11:55
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(dungeon @ Aug 7 2013, 13:28) *
TA1CCR0 не только период ШИМа задает но и разрядность таймера TA1

Разрядность TimerA определена аппаратно разрядностью TAR - больше 16-и разрядов вы ему не определите sm.gif А вот у TimerB можно аппаратно ограничивать разрядность TBR от 16 до 12, 10 или 8 бит.
Я все же настаиваю, что значением регистра TAxCCR0 задается не разрядность, а период следования импульсов ШИМ. Потому, что в процессе работы таймера аппаратно изменяется значение TAR, а значение TAxCCR0 при генерации сигнала ШИМ (в режиме compare) аппаратно не меняется.
Цитата(dungeon @ Aug 7 2013, 13:28) *
(прерывания будут возникать одновременно от TA1CCR0 и TA1).

Прерывания от TAxCCR0, TAxCCR1 и TAIFG запрещаются/разрешаются по-отдельности. Правда вектора прерываний у них разные. TIMERx_A0_VECTOR для TAxCCR0 и TIMERx_A1_VECTOR для всех остальных источников TimerAx.
Цитата(dungeon @ Aug 7 2013, 13:28) *
Если TA1CCR1 изменять на 1 то "коллизии" возникнуть не должно, так как при отработке прерывания TA1 сможет посчитать гораздо больше единицы. А вот если изменять на большее число то тут вы конечно правы. Есть над чем подумать.
Проявление "коллизии" зависит всего лишь от соотношения тактовых частот ядра МК и таймера, и соответственно от длительности выполнения функции обработчика прерывания и величины шага приращения ШИМ. В общем случае тактовые частоты ядра MSP430 и таймера могут быть асинхронны и совершенно различными по величине. Так что с точки зрения надежности лучше все же изменять значение длительности импульса ШИМ именно в конце или в самом начале периода ШИМ.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 11:12
Рейтинг@Mail.ru


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