Программирование AVR AVR131: использование высокоскоростного ШИМ Wed, November 06 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


AVR131: использование высокоскоростного ШИМ Печать
Добавил(а) microsin   

В апноуте AVR131 рассматриваются вопросы генерации сигнала с помощью PWM, высокоскоростные режимы тактирования счетчика таймера с использованием прескалера. Аббревиатура PWM означает Pulse Width Modulation (Широтно-Импульсная Модуляция, ШИМ). Такой аппаратный модулятор имеется в некоторых микроконтроллерах AVR. Предоставлены примеры кода на ассемблере, показывающие использование быстрой ШИМ (fast PWM, high-speed PWM) на микроконтроллере ATtiny26. В маленьком микроконтроллере ATtiny15 тоже есть таймер с возможностью PWM.

Режим fast PWM используется для генерации импульсной последовательности с изменяемой скважностью на ножке микроконтроллера OC1A (выходной порт PB1). Для сглаживания импульсов и получения огибающей сигнала может использоваться аналоговый фильтр (ФНЧ). Таким способом можно генерировать звуки к примеру, синусоидальной формы.

Достоинство high-speed PWM состоит в увеличенной полосе генерируемого выходного аналогового сигнала, и упрощении ФНЧ за счет высокой частоты PWM - можно применить сопротивления и конденсаторы ФНЧ меньшего номинала и меньшего размера.

[Немного теории: как это работает]

PWM в комбинации с аналоговым фильтром может использоваться для получения синтезированных аналоговых выходных сигналов, т. е. в результате получается цифро-аналоговый преобразователь (Digital-Analog Converter, DAC). Сигнал в виде цифровых импульсов 0 и 1 генерируется на базе фиксированной частоты и переменной скважности (т. е. соотношение длительности 0 и 1 меняется). Если нужно увеличить уровень аналогового сигнала на выходе, то длительность лог. 1 увеличивается, а длительность лог. 0 уменьшается, и наоборот.

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

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

AVR131-Low-pass-RC-filter

Рис. 1. Простейший ФНЧ первого порядка.

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

Пример осциллограммы реального сигнала PWM, у которого меняется скважность, показан на рис. 2.

AVR131-PWM-Output

Рис. 2. Выходной сигнал PWM с изменяемой скважностью.

В AVR таймеры/счетчики используются для генерации сигналов PWM. Чтобы поменять базовую частоту PWM, меняют частоту тактирования таймера и верхнее значение для счетчика. Чем выше частота тактирования, и/или меньше верхнее значение для счета, тем будет выше базовая частота PWM, или частота событий переполнения таймера. С полным разрешением (верхнее значение счетчика 255) максимальная базовая частота PWM составит 250 кГц. Увеличение базовой частоты выше этого значения может происходить за счет уменьшения разрешения, поскольку получается более грубый шаг в диапазоне от 0% до 100% скважности. Изменение значения регистров сравнения (Output Compare Registers, OCR) меняет скважность сигнала PWM.

Увеличение значения OCR увеличивает скважность. Выход PWM равен 1, пока счетчик не достиг еще значения OCR, и равен 0, когда счетчик перевалил за значение OCR и продолжает считать до верхнего значения. Этот режим генерации ШИМ называется Fast-PWM mode (быстрый режим PWM), или high-speed PWM (высокоскоростной PWM).

AVR131-PWM-Output-and-counter-values

Рис. 3. Значения счетчика и выходной сигнал PWM.

Когда для генерации аналоговых сигналов используется high-speed PWM, размер шага между аналоговыми уровнями зависит от разрешающей способности PWM. Чем выше базовая частота, тем её проще отфильтровать на выходе, и получить сигнал с меньшими пульсациями. Выбор между разрешающей способностью и базовой частотой является компромиссом при создании приложения.

[Альтернативное использование]

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

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

Чтобы достичь максимальной выходной частоты, получаемой от таймера, он должен быть запущен не в режиме PWM. Обе величины, и OCR и верхний предел счета должны быть установлены в 0. Тогда счетчик застревает на значении 0. Установка действия Output Compare Match на переключение выхода (toggle output) сделает частоту переключения таймера с каждым тиком тактов, в результате получится сигнал с частотой 32 МГц(B на рис. 4).

AVR131-High-Frequency-Digital-Output

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

На рис. 5 показано, как генерируется синусоидальный сигнал из выхода high-speed PWM.

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

AVR131-Main-Loop-Sine-Wave-Generator-Example

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

Инициализация. Чтобы заработал выход от PWM, ножка Output Compare Timer1 (OC1A) должна быть настроена как выходной порт.

Далее нужно настроить таймер: подготавливается источник для тактирования таймера – запускается PLL, и устанавливается системная частота (это требуется для работы). Для стабилизации PLL нужно примерно 100 мс, поэтому перед запуском основного кода происходит ожидание окончания стабилизации PLL с опросом флага захвата PLL (PLL lock flag). Как только произошел захват PLL, выбирается нужная тактовая частота для таймера.

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

Теперь таймер готов к работе, и установка коэффициента деления прескалера запускает таймер. Последним шагом разрешается работа прерывания по переполнению (Overflow interrupt).

AVR131-Init-Routine

Рис. 6. Подпрограмма Init, инициализация выхода и Timer1 для работы в режиме Fast PWM.

;--------------------------------------------------------
; main.asm
;
; Описание: пример использования fast PWM на микроконтроллере
; ATtiny26 для генерации синусоидального сигнала.
;---------------------------------------------------------
.include "tn26def.inc"
 
;Начало таблицы векторов прерываний. Вектор сброса:
   rjmp init
 
; Вектор прерывания для timer1 output compare match A:
.org OC1Aaddr
   rjmp OC1A_isr
 
;Основной код:
init:
   ldi r16, RAMEND      ; Инициализация указателя стека
   out SP, r16
 
   ldi   r16, 0x10      ; Загрузка байта калибровки генератора
   out   EEAR, r16
   ldi   r16, (1 << EERE)
   out   EECR, r16
   in    r16, EEDR
   out   OSCCAL, r16
 
   ldi r16, (1 << PB1)    ; Настройка PB1 как выхода
   out DDRB, r16
   ldi   r16, (1 << PLLE) ; Разрешить работу PLL
   out   PLLCSR, r16
 
waitPLL:
   in    r16, PLLCSR    ; Ожидание захвата PLL (примерно 100 мс)
   sbrs r16, PLOCK
   rjmp waitPLL
 
   in    r16, PLLCSR      ; Установка PLL в качестве источника
   ldi   r17, (1 << PCKE) ; тактирования PWM
   or    r16, r17
   out   PLLCSR, r16
   
   ldi r16, (1 << COM1A0) | (1 << PWM1A) ; Установка режима PWM:
                                         ; переключение OC1A при сравнении
   out TCCR1A, r16      ; Разрешить PWM
 
   ldi r16, 0xFF        ; Установка передела счета для PWM: OCR1C = 0xFF
   out OCR1C, r16
 
   ldi r16, (1 << CS11) | (1 << CS10) | (1 << CTC1)
   out TCCR1B, r16        ; Разрешение таймера установкой тактирования PWM
                          ; через прескалер с частотой CK/4 (16 МГц)
   ldi r16, (1 << OCIE1A) ; Разрешение прерывания Timer1 OVF
   out TIMSK, r16
 
   clr r17
   clr r18
 
   sei                  ; Разрешить глобальные прерывания

Обработчик прерывания (Interrupt Service Routine, ISR). Когда счетчик таймера достигает своего установленного верхнего предела в регистре OCR1C (0xFF), запускается обработчик прерывания по переполнению (Timer1 Overflow ISR). Это происходит через постоянные интервалы времени, потому что OCR1C не меняется. Этот интервал является периодом базовой частотой выходного сигнала fast PWM.

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

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

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

AVR131-Timer1-OVF-ISR

Рис. 7. Обработчик прерывания переполнения Timer1.

OC1A_isr:
   ldi ZH, high(sine_table*2)    ; Установка Z на начало таблицы
   ldi ZL, low(sine_table*2)     ; синуса sine_table
   add ZL, r17                   ; Добавление смещения к Z из r18:r17
   adc ZH, r18
   lpm                           ; Загрузка значения из sine_table в OCR1A
   out OCR1A, r0
   inc r17
   reti
 
sine_table:
   .db 128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174
   .db 177,179,182,185,188,191,193,196,199,201,204,206,209,211,213,216
   .db 218,220,222,224,226,228,230,232,234,235,237,239,240,241,243,244
   .db 245,246,248,249,250,250,251,252,253,253,254,254,254,254,254,254
   .db 254,254,254,254,254,254,254,253,253,252,251,250,250,249,248,246
   .db 245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220
   .db 218,216,213,211,209,206,204,201,199,196,193,191,188,185,182,179
   .db 177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131
   .db 128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82
   .db 79,77,74,71,68,65,63,60,57,55,52,50,47,45,43,40
   .db 38,36,34,32,30,28,26,24,22,21,19,17,16,15,13,12
   .db 11,10,8,7,6,6,5,4,3,3,2,2,2,1,1,1
   .db 1,1,1,1,2,2,2,3,3,4,5,6,6,7,8,10
   .db 11,12,13,15,16,17,19,21,22,24,26,28,30,32,34,36
   .db 38,40,43,45,47,50,52,55,57,60,63,65,68,71,74,77
   .db 79,82,85,88,91,94,97,100,103,106,109,112,116,119,122,125

Ожидание (Idle). Режим сна (sleep mode) Idle используется для перевода устройства в режим пониженного энергопотребления, когда происходит ожидание возникновения следующего прерывания. После обработки прерывания устройство снова переходит в режим сна.

idle:
   ldi r16, (1 << SE)     ; Разрешить вход в режим сна
   out MCUCR, r16
   sleep
   rjmp idle

Осциллограммы. На скриншотах осциллограмм ниже показаны примеры формирования синусоидального сигнала, формируемого PWM на ATtiny26. Осциллограммы показывают выходной сигнал вывода OC1A, который производит широтно-импульсный модулированный сигнал, и вместе с ним отфильтрованный сигнал PWM. Используется простой RC-фильтр для сглаживания сигнала PWM и превращения его в синусоидальный сигнал – аналоговый сигнал, у которого амплитуда зависит от скважности выходного сигнала PWM. В RC-фильтры стоят номиналы R = 10 кОм C = 100 nF, в результате чего частота среза фильтра получается 1 кГц, что позволяет низкой частоте синусоидального сигнала проходить через фильтр, при этом успешно подавляется высокая базовая частота PWM.

AVR131-OC1A-Filtered-and-Not-Filtered

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

AVR131-OC1A-Filtered-and-Not-Filtered-Details

Рис. 9. Выход OC1A – фильтрованный и без фильтра (с растяжкой по оси времени).

[Ссылки]

1. AVR131: Using the AVR’s High-speed PWM site:atmel.com.

 

Добавить комментарий


Защитный код
Обновить

Top of Page