Вы здесь: Главная » Использование высокоскоростного широтно-импульсного модулятора (ШИМ) микроконтроллеров AVR

Использование высокоскоростного широтно-импульсного модулятора (ШИМ) микроконтроллеров AVR

1. Принцип действия

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

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

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

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

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

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

Реальный пример импульсов с различным коэффициентом заполнения - широтно-импульсной модуляции - показан на рисунке 2.

ШИМ-сигнал с различным коэффициентом заполнения импульсов

Рисунок . ШИМ-сигнал с различным коэффициентом заполнения импульсов

В AVR для генерации ШИМ-сигналов используются таймеры-счётчики. Настройка базовой частоты ШИМ выполняется с помощью установки частоты таймера и верхнего значения счёта. Установка более высокой частоты таймера и/или более низкого верхнего значения счёта увеличивает тактовую частоту ШИМ (она же частота переполнения таймера). При максимальном разрешении (верхнее значение счёта равно 255) максимальная базовая частота ШИМ составляет 250 кГц. Увеличение базовой частоты возможно только за счёт сокращения разрешения.

Изменение значения регистра сравнения (OCR) изменяет коэффициент заполнения импульса. Увеличение значения регистра OCR приводит к увеличению коэффициент заполнения импульса. Пока значение счётчика не достигнет значения в регистре OCR, на выходе ШИМ присутствует высокий логический уровень. После этого, пока таймер не достигнет максимального значения счёта и не сбросится в ноль, на выходе ШИМ присутствует низкий логический уровень. Это и есть режим быстрой ШИМ (Fast-PWM).

Значения счётчика и выхода ШИМ

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

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

2. Альтернативные области применения

Кроме генерации аналоговых сигналов высокоскоростной таймер может также использоваться для генерации цифрового сигнала высокой частоты, который может быть использован для тактирования других цифровых элементов схемы. Задание небольших значений для верхнего предела счёта позволяет получить очень высокие базовые частоты.

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

Для достижения максимальной выходной частоты таймер должен работать не в ШИМ режиме. Значения регистра OCR и регистра верхнего значения счёта должны быть установлены в 0. В этом случае счетчик зависнет на нуле. Установка действия по совпадению равным "toggle output" (инвертирование выхода) приведет к тому, что таймер будет переключать значение выхода на каждый тик таймера. В результате получится сигнал частотой 32 МГц (рисунок 4.B).

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

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

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

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

Код состоит из 3 частей: инициализация, обработчик прерывания по переполнению таймера 1 и цикл, переводящий микроконтроллер в режим сна. В данной реализации предполагается, что системная тактовая частота устройства составляет 8 МГц.

Основной цикл генератора синусоидального сигнала

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

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

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

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

Затем следует выбрать режим ШИМ с инвертированием значения на выводе OC1A по совпадению, а верхний предел счёта таймера установить в значение 0xFF. Значение верхнего предела счёта влияет на разрешение и базовую частоту ШИМ - чем выше это значение, тем больше разрешение и ниже базовая частота.

Теперь таймер готов к запуску. Для запуска таймера настраивается предделитель. И наконец, разрешаются прерывания по переполнению счётчика.

Блок-схема функции Init

Рисунок 6. Блок-схема функции Init - инициализирует линии ввода-вывода и таймер 1 для работы в режиме быстрой ШИМ

3.2. Процедура обработки прерывания

Когда значение счётчика таймера 1 достигает значения в регистре OCR1C (в нашем случае 0xFF), выполняется процедура обработки прерывания по переполнению таймера. Так как значение регистра OCR1C не изменяется, обработчик прерывания вызывается через равные промежутки времени. Этот период определяет базовую частоту выходного сигнала ШИМ.

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

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

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

Блок-схема процедуры обработки прерывания по переполнению таймера 1

Рисунок 7. Блок-схема процедуры обработки прерывания по переполнению таймера 1

3.3. Холостой ход

На время ожидания генерации прерывания микроконтроллер переводится в спящий режим "Idle". После окончания обработки прерывания микроконтроллер снова переводится в спящий режим.

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

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

Выход OC1A - фильтрованный и не фильтрованный

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

Выход OC1A - фильтрованный и не фильтрованный - с большим масштабом