Яндекс.Метрика

AVR131

Применение высокоскоростного ШИМ AVR.

Ключевые моменты

 

  • Генерирование аналогового сигнала с применением ШИМ
  •  Высокоскоростной масштабируемый тактовый сигнал

 

Введение

 

Данная заметка является вводным курсом по применению высокоскоростного Широтно-Импульсного Модулятора, имеющегося в некоторых микроконтроллерах AVR. Пример ассемблерного кода демонстрирует, как использовать высокоскоростной ШИМ в ATtiny26. В ATtiny15 также имеется таймер с высокоскоростным ШИМ.

Высокоскоростной ШИМ используется для генерирования последовательности импульсов переменной скважности на выходе OC1A (вывод PB1). Для получения аналогового сигнала, такого, например, как синусоида, может быть использован аналоговый фильтр, осуществляющий сглаживание выходного сигнала цифрового ШИМ.

 Преимуществом высокоскоростного ШИМ является увеличенный диапазон частот аналогового сигнала и то, что высокая основная частота позволяет использовать для сглаживания сигнала меньшие по размеру и менее дорогие элементы фильтра.

 

Теория работы

 

ШИМ, объединенный с аналоговым фильтром, может быть использован для генерирования аналоговых выходных сигналов, т.е. выполнять функции цифро-аналогового преобразователя (ЦАП). В качестве основы используется последовательность цифровых импульсов с постоянным периодом следования (фиксированной основной частотой). Для генерирования различных аналоговых уровней изменяется скважность и, тем самым, ширина импульсов цифрового сигнала. Если необходим высокий аналоговый уровень, ширина импульса увеличивается, и наоборот.

Усреднение цифрового сигнала на одном периоде (путем применения аналогового низкочастотного фильтра) создает аналоговый сигнал. Величина скважности 50% дает аналоговый сигнал с уровнем в половину напряжения питания, в то время как скважность 75% создает аналоговый сигнал величиной 75% от напряжения питания. Примеры выходных сигналов после применения фильтрации показаны в конце этого документа.

В качестве аналогового низкочастотного фильтра может служить, например, простой пассивный RC-фильтр. Фильтр удаляет высокую опорную частоту ШИМ и позволяет проходить аналоговому сигналу. Частота разделения спектра фильтра должна выбираться достаточно большой, чтобы не изменять форму полезного аналогового сигнала. В тоже время для минимизации пульсаций, вызванных основной частотой ШИМ, она должна быть как можно ниже.

Рисунок 1. Низкочастотный RC-фильтр

 


В том случае, если аналоговый сигнал подается в схему с низким входным сопротивлением, между выходом фильтра и нагрузкой должен быть включен буферный усилитель. Это предотвратит разряд конденсатора и возникновение пульсаций напряжения.

Реальный пример изменяющейся скважности – Широтно-Импульсной Модуляции – показан на рис.2.

Рисунок 2. Выход ШИМ с изменяющейся скважностью

 

 

В AVR для генерирования ШИМ сигналов используются таймеры/счетчики. Для изменения основной частоты ШИМ изменяется тактовая частота и верхнее значение TOP (величина, до которой идет счет) счетчика. Применение более высокой тактовой частоты и/или меньшего верхнего значения будет увеличивать опорную частоту ШИМ, или, что равносильно, частоту переполнения таймера. При полном разрешении (верхнее значение 255) максимальная основная частота ШИМ составляет 250 кГц. Увеличение основной частоты выше этого значения достигается ценой снижения разрешения, так как при этом диапазон скважности от 0% до 100% перекрывается меньшим числом шагов.

Изменение значения, хранящегося в регистрах OCR (Output Compare Register) изменяет скважность. При увеличении OCR скважность увеличивается. Выход ШИМ находится в высоком состоянии, пока счетчиком не будет достигнуто значение OCR. После этого он будет иметь нулевой уровень до достижения счетчиком верхнего значения и обнуления. Такой режим называется Fast-PWM mode.

Рисунок 3. Значения счетчика и выход ШИМ

 

При использовании высокоскоростного ШИМ для генерирования аналоговых сигналов размер шага (ступенька) между аналоговыми уровнями определяется разрешением ШИМ. Чем выше основная частота, тем легче ее ослабить (отфильтровать) и, тем самым, минимизировать пульсации сигнала.

Таким образом, выбор разрешения в зависимости от основной частоты – это компромисс, определяемый конкретным приложением.

 

Альтернативное Применение

 

Быстродействующий таймер может быть использован и для генерации высокочастотных цифровых сигналов, которые, в свою очередь, могут являться источником тактового сигнала для других цифровых компонентов приложения. Путем установки верхнего значения счетчика на малую величину можно получать очень высокие основные частоты.

Наибольшая возможная тактовая частота для быстродействующего таймера Attiny26 составляет 64МГц (без предварительного деления). На основной частоте ШИМ 16МГц (верхнее значение счетчика 3) величина, записываемая в OCR, может быть 0, 1 (скважность 25%), 2 (скважность 50%, рис. 4 (А)) или 3 (скважность 100%).  Это показывает, что снижение верхнего значения с целью увеличения основной частоты ШИМ приводит к уменьшению разрешения.

Для получения максимально возможной выходной частоты работы таймера его необходимо запускать в режиме, не использующем ШИМ. И значение OCR и верхнее значение счетчика должны быть установлены в 0. После этого счетчик «застревает» на 0. Установка типа реакции на Output Compare Match в режим “toggle output” приводит к тому, что выход таймера переключается в противоположное состояние при каждом «тике» тактового сигнала таймера. В результате получается сигнал с частотой 32МГц (рис. 4 (B)).  

Рисунок 4. Высокочастотный цифровой выход

 

  Пример применения

 

На рисунке 5 показан пример генерирования синусоидального сигнала с использованием выхода быстродействующего ШИМ.

Код состоит из трех частей: Инициализация (Initialization), подпрограмма обработки прерываний по переполнению таймера Timer1 и цикл ожидания. Реализация подразумевает, что тактовая частота системы 8 МГц.

Рисунок 5. Основной цикл демонстрационной программы генератора синусоиды

 

Инициализация

 

Для того, чтобы иметь возможность генерировать выходной сигнал с помощью ШИМ, вывод Output Compare таймера 1 (OC1A) настраивается на вывод данных.

Затем настраивается Timer1: подготавливается источник тактового сигнала таймера – запускается PLL(ФАПЧ) и фиксируется на системной тактовой частоте (обязательно). Для захвата тактовой частоты PLL необходимо примерно 100 мс, поэтому необходимо дождаться установки флага захвата PLL. После фиксации PLL он выбирается в качестве источника тактового сигнала таймера.

После этого задается такой режим работы ШИМ, при котором вывод OC1A переключается при каждом совпадении (compare match), а верхнее значение счетчика устанавливается на 0xFF. Верхнее значение влияет на разрешение и на основную частоту ШИМ – выше верхнее значение – выше разрешение и ниже основная частота.

Теперь таймер готов к запуску. Его запуск осуществляется установкой предварительного делителя (prescaler). И в завершение всего разрешается прерывание по переполнению таймера.

Рисунок 6. Подпрограмма инициализации. Инициализирует вывод микроконтроллера и таймер Timer1 для работы в режиме Fast PWM.

 

  Подпрограмма обработки прерывания

При достижении таймером Timer1 величины, записанной в OCR1C (0xFF), выполняется подпрограмма обработки прерывания по переполнению этого таймера. Это происходит через равный интервал времени, так как значение, записанное в OCR1C – константа. Данный интервал является базовой частотой выходного сигнала быстрого ШИМ.

В подпрограмме обработки прерывания осуществляется обращение к таблице синуса. При каждом обращении  происходит увеличение индекса элемента таблицы на 1, так чтобы можно было загрузить новые значения. Значение из таблицы синуса записывается в OCR1A. Таким образом модулируется ширина импульса для получения синусоидального сигнала. Обратите внимание, что регистр OCR1A имеет промежуточный буфер и что запись данных из этого буфера в реальный регистр OCR1A имеет место при переполнении таймера.

Для выполнения подпрограммы обработки прерывания требуется 13 тактовых импульсов. К этому добавляется вызов подпрограммы и возврат из нее – всего 21 тактовый импульс. Так как Timer1 является 8-битным, прерывания происходят каждые 256/(PWM_clock/system_clock) тактовых импульсов. В предлагаемом примере устройство тактируется от внутреннего RC генератора, работающего на частоте 8МГц. Если используется максимальная тактовая частота ШИМ, 64МГц, это может означать, что прерывания от Timer1 происходят каждые 32 цикла.

Хотя и возможно тактировать ШИМ с максимальной частотой 64МГц, в данной заметке по применению (с целью проиллюстрировать работу предварительного делителя) частота снижается в 4 раза, до 16МГц.

Рисунок 7. Подпрограмма обработки прерывания от Timer1  

 

Idle 

Режим малого потребления “idle”  используется для перевода устройства в состояние сниженного энергопотребления в промежутках, когда оно ожидает прерывания. После обработки прерывания устройство возвращается в состояние “sleep”.

Осциллограммы

Представленные ниже осциллограммы являются примерами синусоидальных сигналов, генерируемых ШИМ ATtiny26.  На них изображены выходной сигнал на выводе OC1A, представляющий собой цифровой модулированный сигнал, и отфильтрованный сигнал ШИМ. Для формирования синусоидального сигнала используется простой RC фильтр. Амплитуда аналогового сигнала определяется скважностью выходного сигнала ШИМ.  В используемом фильтре применяется резистор R=10кОм и конденсатор C=100нФ, давая частоту разделения спектра 1 кГц, которая позволяет низкочастотному синусоидальному сигналу   проходить в то же время, отфильтровывая высокочастотный сигнал ШИМ.

Рисунок 8. Выход OC1A – отфильтрованный не отфильтрованный

 

Пример кода на ассемблере находится в архиве AVR131.zip

 

Бесплатный хостинг uCoz