Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: G2553, PWM, джиттер.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
dungeon
Делаю ШИМ для двигателя постоянного тока на базе MSP430G2553 и возникла проблема джиттера ШИМа. Период ШИМа задается переменным резистором 10кОм на порт Р1.5. По 8 выборкам АЦП делаю усреднение и заношу это значение в TA1CCR1. Диапазон значений от 0..0x3F9. В диапазоне значений от 0х15...0х45 наблюдаю джиттер на выводе Р2.1 (см. рис.). Что я упускаю? Как это выловить в отладчике?

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

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

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

ну или еще чтобы убрать выбросы во время изменения сопротивления можно на производную смотреть и пропускать часть отсчётов если она слишком большая.
dungeon
За фильтр спасибо но АЦП скорей всего тут ни причем. Я после вычисления среднего значения ставил строку if (adcAverage>0x0F9) _NOP(); и breakpoint на команду _NOP(), но это ничего не дало. ШИМ глючит но процессор не останавливается.
_pv
ну еще может быть при смене значения с большего на меньшее, причём если текущее значение таймера будет больше чем новое значение, он досчитает до переполнения.
rezident
Сильно в программу не вникал, но у вас похоже ошибка в логике управления периодом ШИМ. Изменять значение длительности импульса ШИМ нужно не по прерыванию от переполнения таймера, а по прерыванию от TACCR0, значением которого задается период импульса ШИМ. Разрешите прерывание от CCR0 и смените вектор прерывания на TIMER1_A0_VECTOR, убрав из него обработку TAIV и запретив прерывание от переполнения.
Ну и нужно следить/проверять, чтобы новое значение длительности импульса ШИМ (TAxCCR1) не превышало значение периода ШИМ (TAxCCR0).
dungeon
Проблему решил (по крайней мере глюков больше не наблюдается). Нужно было значение длительности ШИМа записывать по прерыванию TA1CCR1. Всем откликнувшимся ОГРОМНОЕ СПАСИБО. Тему можно закрыть.
rezident
Ваше решение не совсем корректное. Период ШИМ задается в регистре TACCR0, а в регистре TACCR1 задается длительность импульса ШИМ. Допустим вы посчитали новую длительность импульса ШИМ, увеличив его на 1 единицу от текущего. TAR досчитал до TACCR1, возникло прерывание, вы изменили значение и тут же снова попали в прерывание, т.к. TAR успел увеличиться на 1 единицу и снова совпал с новым значением TACCR1. Осознаете проблему? Поэтому я вам и советую изменять значение длительности импульса ШИМ только по окончании периода ШИМ, т.е. по совпадению TAR и TACCR0 в прерывании по вектору TIMER1_A0_VECTOR
Причем после смены длительности импульса ШИМ прерывание от таймера следует запрещать и разрешать вновь лишь только тогда, как у вас будет готово новое значение для ШИМ.
_pv
если по прерыванию от совпадения больше ничего другого не делается, то без разницы, значение выхода уже сбросилось в ноль, второй раз просто ничего не произойдёт, но это потенциальные грабли и делать так конечно не надо.
dungeon
TA1CCR0 не только период ШИМа задает но и разрядность таймера TA1 (прерывания будут возникать одновременно от TA1CCR0 и TA1). Если TA1CCR1 изменять на 1 то "коллизии" возникнуть не должно, так как при отработке прерывания TA1 сможет посчитать гораздо больше единицы. А вот если изменять на большее число то тут вы конечно правы. Есть над чем подумать.
rezident
Цитата(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 и таймера могут быть асинхронны и совершенно различными по величине. Так что с точки зрения надежности лучше все же изменять значение длительности импульса ШИМ именно в конце или в самом начале периода ШИМ.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.