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

Обновлено 16.12.15. Всем привет. Разобравшись в прошлой записи с памятью EEPROM, сегодня мы поговорим о том что такое ШИМ (PWM)? Расшифруется как широтно-импульсная модуляция (pulse-width modulation), это среднее значение напряжения, которое изменяется скважностью импульса. В свою очередь скважность это длительность импульса с некоторой частотой повторения. Т.е. более простыми словами все это изменение ширины импульса при неизменной их величине. Для чего это нам надо?

ШИМ (PWM) используется в транзисторной схеме для регулирования напряжения без механики, в свою очередь управление мощностью. Например управление яркостью светодиодов, управление яркостью подсветки на LCD-мониторе, управление двигателями и т.д. Если отобразить на рисунке, то выход с микроконтроллера примерно будет следующим, как на картинке ниже. Где видно что скважность это заполнение импульса, если вся ширина импульса это 5 В, то при 30% заполнении импульса, в среднем на выходе мы получим примерно 1,5В. В микроконтроллерах AVR ШИМ управление задается в восьмиразрядных таймерах/счетчиках T0/(T2) и шестнадцатиразрядный T1 (T3 в некоторых моделях). А также есть другие модели где битность ШИМа можно задавать, например ATmega 128. Рассмотрим настройку шестнадцатиразрядного таймера/счетчика Т1. Данные берем соответственно таблицам либо из справочника, либо из даташита (литература — статья №1).

В общем для такого счетчика в мк можно выбрать три режима: Fast PWM, Phase Correct PWM, Phase and Frequency Correct PWM (зависит от модели )

Рассмотрим второй режим - ШИМ с точной фазой . Здесь счетный регистр функционирует как реверсивный счетчик, изменения состояния которого изменяется от $0000 до максимального значения а затем обратно до $0000. Для управления таймером/счетчиком используем три регистра управления TCCR1A, TCCR1B, TCCR1C. В которых для выбора режима таймера/счетчика необходимо установить разряды WGMn1: WGMn0 и WGMn1: WGMn0. В зависимости от их установки максимальное значение счетчика(Разрешение ШИМ сигнала) является либо фиксированным значением, либо определяется содержимым определенных регистров таймера/счетчика. Разрешающая способность определяется выражением:

g = log (TOP+1)/log2, где ТОР – модуль счета, выбирается из таблицы соответственно разрешающей способности.

После того как определились с режимом работы таймера счетчика, необходимо выбрать режим работы блока сравнения COMnA1:COMnA0, COMnB1:COMnB0, COMnC1:COMnC0, который определяет поведение вывода OCnx при наступлении события “Совпадение”.

Ну и последний штрих определимся с частотой. Нам необходимо выставить разряды CSn2…CSn0 регистра TCCR1B, которые отвечают за определение источника тактового сигнала. Вот таким программным образом выглядит настройка ШИМ-управления на выходе OC1A. Например:

/*Настройки ШИМ */
TCCR1A=(1< /*На выводе OC1A единица, когда OCR1A==TCNT1, Сбрасывается в 0 при OCR1A==TCNT1 и устанавливается в 1 при достижении максимального значения восьми битный ШИМ Phase Correct PWM , номер режима 1 . модуль счета ТОР $00FF*/
TCCR1B=(1<OCR1A = 50; /* при модуле счета 255 и при напряжении 5 В на выходе OC1A получим примерно 1 В*/

Из программы видно, что для получения ШИМ используем регистр сравнения OCR1A. При достижении счетчиком максимального значения, в данном случае 255, происходит смена направления счета, но счетчик остается в этом состоянии в течении одного периода сигнала. В этом и заключается более медленная частота работы по сравнению с первым режимом. Но в этом и состоит симметричность изменения счетчика. Что более подходит для управления двигателем. В этом же такте происходит обновления содержимого регистра сравнения. При достижении счетчиком минимального значения также происходит смена направления счета и одновременно устанавливается флаг прерывания TOV1 регистра TIFR. Пр равенстве содержимого счетного регистра и какого-либо регистра сравнения устанавливается соответствующий флаг OCF1A/OCF1B/OCF1C регистра TIFR. Одновременно изменяется состояние выхода блока сравнения OCnx. Частота генерируемого сигнала fOCn= f/(2*N*TOP), где N – коэффициент деления пред делителя, f — частота кварца. Также можно посмотреть еще примеры настройки и использования ШИМ, например .

На этом сегодня все. В следующем посте рассмотрим контроллер любительского станка ЧПУ . Я постараюсь использовать предыдущие посты из этого блога для набора программы, как конструктор. Так будет более понятно когда один раз написали и его использовали в следующем проекте. Всем пока.

Данная версия 4-канального 8-битного ШИМ-контроллера сконструирована с использованием микроконтроллера ATmegа16. Устройство сдержит интерфейс RS232 для управления с компьютера, интерфейс для 12-кнопочной клавиатуры и 4 аналоговых 10-битных канала для подключения потенциометров. Для отображения текущих режимов работы и параметров имеется 4-х строчный LCD-дисплей. Дополнительно ШИМ-контроллер имеет: 4 выхода на светодиоды, для индикации режимов управления (могут быть задействованы в роли выходов общего назначения), 3 выхода общего назначения.

Устройство имеет очень гибкие настройки. Например, параметры работы каналов ШИМ могут управляться посредством команд с компьютера, посредством аналоговых регуляторов (потенциометры) или с помощью клавиатуры (с отображением пользовательского интерфейса на LCD-индикаторе). Самим LCD-индикатором также возможно управлять через RS232, отображение текущих установок и режимов возможен в числовом, либо в графическом формате.

Основные характеристики устройства:

  • 4-канала ШИМ, разрешение 8 бит, частота ШИМ - 31 кГц;
  • интерфейс RS232 для управления и контроля с PC;
  • простое схемотехническое решение с минимальным количеством внешних элементов;
  • 12-кнопочная клавиатура;
  • возможность аналоговой регулировки;
  • до 7 выходных линий общего назначения;
  • 4-строчный LCD-дисплей;
  • управление LCD-дисплеем через последовательный интерфейс;
  • пользовательское меню;
  • гибкие настройки;
  • программная реализация буферов FIFO для ускорения работы.

Управление выходами общего назначения (в т.ч. светодиодными индикаторами) осуществляется с компьютера (RS232), пользователь так же имеет возможность считывать историю нажатия клавиш на клавиатуре (последние 32 нажатия клавиш, либо сразу же после нажатия какой-либо клавиши).

Благодаря таким гибким настройкам, выбирая соответствующую настройку, ШИМ-контроллер может использоваться в различных приложениях и как самостоятельное устройство. В конструкции используется микроконтроллер ATmega16, минимальное количество внешних элементов, поскольку весь контроль и управление выполняет сам микроконтроллер. Для пользователя возможно использование только необходимых компонентов, например, LCD-индикатор, если в нем нет необходимости, может быть исключен.

Логическая схема устройства.

Принципиальная схема устройства

Схемотехническое решение очень простое. Для тактирования микроконтроллера выбран кварцевый резонатор 8 МГц, источник питания +5.0 В собран на интегральном стабилизаторе LM7805 , индуктивность 10 мкГн и конденсатор 100 нФ - образуют фильтр, предотвращающий проникновение помех при переключениях в аналоговых цепях. Преобразователь логических уровней MAX232 используется для реализации последовательного интерфейса. LCD-индикатор на чипсете Hitachi (HD44780) с разрешением 20×4 либо 40×2. Узел управления подсветкой индикатора реализован на транзисторе MJE3055T (возможно использование более дешевого аналога). Матрица клавиатуры, стандартная, 4×3.

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

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

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

Для примера практической реализации устройства и ШИМ управления различными внешними устройствами приведена следующая схема. В данном примере показаны схемотехнические решения для подключения к 4 каналам ШИМ двигателя вентилятора, мощного светодиода семейства , преобразователь ШИМ-напряжение на операционном усилителе LM358 . А также для возможности тестирования выходных линий общего назначения подключены светодиоды.

Пример реализации выходных каскадов ШИМ-контроллера

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

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

Таким образом, для одного канала ШИМ нам нужно знать правила, которыми определяется коэффициент заполнения (с этим проблем нет, мы их сами устанавливаем), и, кроме того, отсчитывать два момента времени от начала импульса: во-первых, сколько сигнал находится в состоянии высокого уровня и во-вторых, общее время импульса. Отлично, значит всё, что нам нужно для реализации одного ШИМ — это два счётчика. Алгоритм получится такой: запускаем оба счётчика, переключаем выход в "1". По прерыванию от первого счётчика (время высокого уровня) переключаем выход в "0", выключаем счётчик и ждём прерывание от второго счётчика. По прерыванию от второго счётчика (общее время импульса) — повторяем всё с начала.

Соответственно, для трёх каналов ШИМ нам нужно 3*2=6 счётчиков. Но, допустим у PIC12F629, есть только 2 счётчика, что же делать? Во-первых, сделаем одинаковым общее время импульса для всех каналов ШИМ (пусть все три канала работают с одной частотой), это уже минус два счётчика. Осталось только отсчитывать время высокого уровня для каждого из каналов ШИМ. Итого, осталось 4 счётчика. Не намного, но легче.

Теперь давайте вспомним, что контроллер, это не аналоговая микросхема, а цифровая, и моменты времени он отсчитывает дискретно. Все три времени высокого уровня (для каждого из каналов ШИМ) будут кратны какому-то общему кванту времени. Длительность этого кванта определяется разрядностью ШИМ и частотой импульсов. В случае, когда все каналы работают на одной частоте и имеют одинаковую разрядность, этот квант времени будет равен: T 1 =1/(f*(2 n -1)) , где n-разрядность ШИМ, f — частота импульсов.

Если ШИМ 8-ми битный и работает на частоте 100 Гц, то длительность кванта равна (1/100)/(2 8 -1)=39 мкс — общее время импульса (1/f), делённое на число возможных моментов переключения (2 n) минус 1 (если на прямой поставить N точек, то они образуют N-1 интервалов).

То есть, нам достаточно одного аппаратного счётчика, который будет отсчитывать интервалы T 1 . Далее, создаем программный счётчик, который будет подсчитывать количество таких интервалов, и задаём четыре уставки. Одна уставка определяет, — сколько нужно отсчётов программного счётчика чтобы отсчитать время высокого уровня для первого канала ШИМ, вторая — тоже самое для второго канала, третья — для третьего, четвертая соответствует общему времени импульса, а операции сравнения, переключения, увеличения или обнуления программного счётчика будем
делать по прерыванию от аппаратного счётчика.

Основной недостаток такого метода в том, что вместо (n+1) прерываний за период, мы будем обрабатывать (2 n -1) прерываний.

Давайте прикинем, какой может быть максимальная частота ШИМ при такой реализации? Очевидно, что при максимальной частоте, времени у контроллера хватает только на обработку прерывания. То есть, весь квант времени Т 1 контроллер занят обработкой прерывания, как только он выходит из прерывания — тут же происходит ещё одно.

Если обозначить максимальное число машинных циклов, за которое выполняется подпрограмма, N max — то, с учётом выражения для T 1 , получаем уравнение: N max *4/fosc=1/(f max *(2 n -1)) . Отсюда, максимальная частота ШИМ: f max =fosc/(4*N max *(2 n -1)) . Естественно, полученная формула просто оценочная, потому что мы допускали, что подпрограмма занимает всё время T 1 , но если после выполнения подпрограммы останется время для выполнения 2-х, 3-х команд, то это в общем-то тоже не сильно нас устроит. Что можно сделать в 3 команды? По нормальному, если мы хотим ещё что-то делать, например, обмениваться инфой с компом, то подсчитанное значение частоты нужно поделить ещё минимум вдвое.

От чего зависит максимальное время выполнения подпрограммы прерывания? Ну, во-первых конечно, от степени криворукости программиста, и во-вторых — от количества каналов ШИМ, которые мы хотим реализовать.

Для того, чтобы было понятно, о каких величинах идёт речь, рассчитаем конкретный пример: пусть контроллер работает на частоте fosc=4 МГц, мы написали подпрограмму, которая выполняется максимум за 40 машинных циклов и хотим получить разрядность ШИМ 8 бит. Тогда максимальная частота ШИМ будет равна 4000000/(4*40*255)=98 Гц. Как видите, при таком способе реализации, всё достаточно ограничено, но для RGB хватит. Между прочим, при 8-ми битах на цвет мы получим общее количество цветов, равное 2 8 *2 8 *2 8 =16 млн и вообще стоит подумать — надо ли нам столько?

При разрядности 2 бита на канал и той же тактовой частоте можно получить максимальную частоту ШИМ, равную 4000000/(4*40*3)=8,3 кГц, при этом будет 2 2 *2 2 *2 2 =64 различных сочетания коэффициентов заполнения (в случае с RGB это 64 цвета). Такую частоту уже можно юзать не только для RGB.

Ну вот, на этом с теорией всё.

Широтно-импульсная модуляция (ШИМ) – это метод преобразования сигнала, при котором изменяется длительность импульса (скважность), а частота остаётся константой. В английской терминологии обозначается как PWM (pulse-width modulation). В данной статье подробно разберемся, что такое ШИМ, где она применяется и как работает.

Область применения

С развитием микроконтроллерной техники перед ШИМ открылись новые возможности. Этот принцип стал основой для электронных устройств, требующих, как регулировки выходных параметров, так и поддержания их на заданном уровне. Метод широтно-импульсной модуляции применяется для изменения яркости света, скорости вращения двигателей, а также в управлении силовым транзистором блоков питания (БП) импульсного типа.

Широтно-импульсная (ШИ) модуляция активно используется в построении систем управления яркостью светодиодов. Благодаря низкой инерционности, светодиод успевает переключаться (вспыхивать и гаснуть) на частоте в несколько десятков кГц. Его работа в импульсном режиме воспринимается человеческим глазом как постоянное свечение. В свою очередь яркость зависит от длительности импульса (открытого состояния светодиода) в течение одного периода. Если время импульса равно времени паузы, то есть коэффициент заполнения – 50%, то яркость светодиода будет составлять половину от номинальной величины. С популяризацией светодиодных ламп на 220В стал вопрос о повышении надёжности их работы при нестабильном входном напряжении. Решение было найдено в виде универсальной микросхемы – драйвера питания, работающего по принципу широтно-импульсной или частотно-импульсной модуляции. Схема на базе одного из таких драйверов детально описана .

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

Масштабное применение ШИМ отражено во всех LCD панелях со светодиодной подсветкой. К сожалению, в LED мониторах большая часть ШИ-преобразователей работает на частоте в сотни Герц, что негативно отражается на зрении пользователей ПК.

Микроконтроллер Ардуино тоже может функционировать в режиме ШИМ контроллера. Для этого следует вызвать функцию AnalogWrite() с указанием в скобках значения от 0 до 255. Ноль соответствует 0В, а 255 – 5В. Промежуточные значения рассчитываются пропорционально.

Повсеместное распространение устройств, работающих по принципу ШИМ, позволило человечеству уйти от трансформаторных блоков питания линейного типа. Как результат – повышение КПД и снижение в несколько раз массы и размеров источников питания.

ШИМ-контроллер является неотъемлемой частью современного импульсного блока питания. Он управляет работой силового транзистора, расположенного в первичной цепи импульсного трансформатора. За счёт наличия цепи обратной связи напряжение на выходе БП всегда остаётся стабильным. Малейшее отклонение выходного напряжения через обратную связь фиксируется микросхемой, которая мгновенно корректирует скважность управляющих импульсов. Кроме этого современный ШИМ-контроллер решает ряд дополнительных задач, способствующих повышению надёжности источника питания:

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

Принцип работы ШИМ контроллера

Задача ШИМ контроллера состоит в управлении силовым ключом за счёт изменения управляющих импульсов. Работая в ключевом режиме, транзистор находится в одном из двух состояний (полностью открыт, полностью закрыт). В закрытом состоянии ток через p-n-переход не превышает несколько мкА, а значит, мощность рассеивания стремится к нулю. В открытом состоянии, несмотря на большой ток, сопротивление p-n-перехода чрезмерно мало, что также приводит к незначительным тепловым потерям. Наибольшее количество тепла выделяется в момент перехода из одного состояния в другое. Но за счёт малого времени переходного процесса по сравнению с частотой модуляции, мощность потерь при переключении незначительна.

Широтно-импульсная модуляция разделяется на два вида: аналоговая и цифровая. Каждый из видов имеет свои преимущества и схемотехнически может реализовываться разными способами.

Аналоговая ШИМ

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

Цифровая ШИМ

Широтно-импульсная модуляция в цифровой интерпретации является одной из многочисленных функций микроконтроллера (МК). Оперируя исключительно цифровыми данными, МК может формировать на своих выходах либо высокий (100%), либо низкий (0%) уровень напряжения. Однако в большинстве случаев для эффективного управления нагрузкой напряжение на выходе МК необходимо изменять. Например, регулировка скорости вращения двигателя, изменение яркости светодиода. Что делать, чтобы получить на выходе микроконтроллера любое значение напряжения в диапазоне от 0 до 100%?

Вопрос решается применением метода широтно-импульсной модуляции и, используя явление передискретизации, когда заданная частота переключения в несколько раз превышает реакцию управляемого устройства. Изменяя скважность импульсов, меняется среднее значение выходного напряжения. Как правило, весь процесс происходит на частоте в десятки-сотни кГц, что позволяет добиться плавной регулировки. Технически это реализуется с помощью ШИМ-контроллера – специализированной микросхемы, которая является «сердцем» любой цифровой системы управления. Активное использование контроллеров на основе ШИМ обусловлено их неоспоримыми преимуществами:

  • высокой эффективности преобразования сигнала;
  • стабильность работы;
  • экономии энергии, потребляемой нагрузкой;
  • низкой стоимости;
  • высокой надёжности всего устройства.

Получить на выводах микроконтроллера ШИМ сигнал можно двумя способами: аппаратно и программно. В каждом МК имеется встроенный таймер, который способен генерировать ШИМ импульсы на определённых выводах. Так достигается аппаратная реализация. Получение ШИМ сигнала с помощью программных команд имеет больше возможностей в плане разрешающей способности и позволяет задействовать большее количество выводов. Однако программный способ ведёт к высокой загрузке МК и занимает много памяти.

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

Пример использования ШИМ регулятора

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

Читайте так же

Мы затронули тему использования счётчика/таймера ATtiny13 в обычном режиме и в режиме подсчёта импульсов (CTC). В этой статье я продолжаю тему таймера, но теперь мы рассмотрим его применение для реализации широтно-импульсной модуляции (ШИМ).

Все микропроцессоры работают с цифровыми сигналами, т.е. с логическим нулем (0 В), и логической единицей (5 В или 3.3 В). Но что делать, если мы хотим получить на выходе какое-либо промежуточное значение? В таких случаях применяют Широтно-импульсную модуляцию (ШИМ, англ. pulse-width modulation (PWM)) — процесс управления мощностью, подводимой к нагрузке, путём изменения скважности импульсов, при постоянной частоте.
Широтно-импульсная модуляция представляет собой периодический импульсный сигнал. Существуют цифровые и аналоговые ШИМ, однополярные и двуполярные, и т.д. Но принцип их работы остается одинаковым вне зависимости от исполнения и заключается в сравнении двух видов сигналов: опорного (пилообразные или треугольные импульсы) и входного (постоянного, либо изменяемого нужным образом, в зависимости от конкретной задачи ШИМ). Эти сигналы сравниваются и, при их пересечении, изменяется уровень сигнала на выходе ШИМ. Выходное напряжение ШИМ имеет вид прямоугольных импульсов, изменяя их длительность, мы можем регулировать среднее значение напряжения на выходе ШИМ *.

* Если на выходе ШИМ использовать интегрирующую RC-цепь , то можно вместо импульсного получить постоянное напряжение нужной величины. Но в нашем примере со светодиодами можно обойтись и без этого, так как человеческий глаз всё равно не сможет разглядеть мерцания светодиода при используемой тактовой частоте.

Параметры ШИМ

  • T - период тактирования (опорного сигнала);
  • t - длительность импулься;
  • S - скважность;
  • D - коэффициент заполнения.

Скважность определяется отношением периода к длительности импульса. Коэффициент заполнения - величина, обратная скважности (может выражаться в процентах):

S=T/t=1/D

Рассмотрим подробнее, как работает ШИМ в AVR микроконтроллерах, на примере ATtiny13.
Как уже упоминалось в предыдущем примере , в ATtiny13 реализовано две разновидности ШИМ: так называемые "Быстрая ШИМ" (Fast PWM) и "ШИМ с коррекцией фазы" (Phase correct PWM). Оба варианта основаны на использовании встроенного в МК восьмибитного счётчика/таймера T0. Таймер тут используется вместо опорного сигнала. Тактовая частота таймера задаётся предделителем тактовой частоты процессора, либо от внешнего тактового генератора. Режим тактирования задаётся битами CS02 (2), CS01 (1), CS00 (0) регистра TCCR0B :

  • 000 - таймер/счетчик T0 остановлен
  • 001 - тактовый генератор CLK
  • 010 - CLK/8
  • 011 - CLK/64
  • 100 - CLK/256
  • 101 - CLK/1024
  • 110 - от внешнего источника на выводе T0 (7 ножка, PB2) по спаду сигнала
  • 111 - от внешнего источника на выводе T0 (7 ножка, PB2) по возрастанию сигнала

Настройка таймера для ШИМ

Режим работы таймера задаётся битами WGM01 (1) и WGM00 (0) регистра TCCR0A :

  • 00 - обычный режим
  • 01 - режим коррекции фазы ШИМ
  • 10 - режим подсчета импульсов (сброс при совпадении)
  • 11 - режим ШИМ

Здесь нас интересуют варианты "01" и "11".

Биты COM0A1 (7) и COM0A0 (6) регистра TCCR0A задают, какой сигнал появится на выводе OC0A (5 ножка, PB0) при совпадении счётчика (регистр TCNT0 ) с регистром сравнения A (OCR0A ).

В режиме "Быстрая ШИМ":

  • 10 - установка 0 на выводе OC0A при совпадении с A, установка 1 на выводе OC0A при обнулении счётчика (неинверсный режим)
  • 11 - установка 1 на выводе OC0A при совпадении с A, установка 0 на выводе OC0A при обнулении счётчика (инверсный режим)
  • 00 - вывод OC0A не функционирует
  • 01 - если бит WGM02 регистра TCCR0B установлен в 0, вывод OC0A не функционирует
  • 01 - если бит WGM02 регистра TCCR0B установлен в 1, изменение состояния вывода OC0A на противоположное при совпадении с A
  • 10 - установка 0 на выводе OC0A при совпадении с A во время увеличения значения счетчика, установка 1 на выводе OC0A при совпадении с A во время уменьшения значения счетчика (неинверсный режим)
  • 11 - установка 1 на выводе OC0A при совпадении с A во время увеличения значения счетчика, установка 0 на выводе OC0A при совпадении с A во время уменьшения значения счетчика (инверсный режим)

Биты COM0B1 (5) и COM0B0 (4) регистра TCCR0A задают, какой сигнал появится на выводе OC0B (6 ножка, PB1) при совпадении счётчика (регистр TCNT0 ) с регистром сравнения B (OCR0B ).

В режиме "Быстрая ШИМ":

  • 01 - резерв
  • 10 - установка 0 на выводе OC0B при совпадении с B, установка 1 на выводе OC0B при обнулении счётчика (неинверсный режим)
  • 11 - установка 1 на выводе OC0B при совпадении с B, установка 0 на выводе OC0B при обнулении счётчика (инверсный режим)

В режиме "ШИМ с коррекцией фазы":

  • 00 - вывод OC0B не функционирует
  • 01 - резерв
  • 10 - установка 0 на выводе OC0B при совпадении с B во время увеличения значения счетчика, установка 1 на выводе OC0B при совпадении с B во время уменьшения значения счетчика (неинверсный режим)
  • 11 - установка 1 на выводе OC0B при совпадении с B во время увеличения значения счетчика, установка 0 на выводе OC0B при совпадении с B во время уменьшения значения счетчика (инверсный режим)

Быстрая ШИМ (Fast PWM)

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

ШИМ с коррекцией фазы (Phase correct PWM)

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

Чтобы увидеть наглядно, как работает ШИМ, напишем небольшую программу (все опыты я провожу на своей отладочной плате , соответственно код привожу применительно к ней):

/* * tiny13_board_pwm * Демо-прошивка отладочной платы на ATtiny13. * Демонстрация работы ШИМ на двух каналах: * неинверсный сигнал на выходе OC0A, инверсный - на выходе OC0B. */ #define F_CPU 1200000UL #include #include #define LED0 PB0 // OC0A #define LED1 PB1 // OC0B int main(void) { // Светидиоды: DDRB |= (1 << LED0)|(1 << LED1); // выходы = 1 PORTB &= ~((1 << LED0)|(1 << LED1)); // по умолчанию отключены = 0 // Таймер для ШИМ: TCCR0A = 0xB3; // режим ШИМ, неинверсный сигнал на выходе OC0A, инверсный - на выходе OC0B TCCR0B = 0x02; // предделитель тактовой частоты CLK/8 TCNT0=0; // начальное значение счётчика OCR0A=0; // регистр совпадения A OCR0B=0; // регистр совпадения B while(1) { do // Нарастание яркости { OCR0A++; OCR0B = OCR0A; _delay_ms(5); } while(OCR0A!=255); _delay_ms(1000); // Пауза 1 сек. do // Затухание { OCR0A--; OCR0B = OCR0A; _delay_ms(5); } while(OCR0A!=0); _delay_ms(1000); // Пауза 1 сек. } }

Тут мы видим, что при старте МК в регистры сравнения A и B устанавливается 0, а счётчик запускается в режиме Fast PWM, с генерацией неинверсного ШИМ сигнала на выходе OC0A и инверсного - на выходе OC0B. В основном цикле значения регистров сравнения плавно меняются от 0 до максимума и обратно. В результате, светодиоды, подключенные к выводам OC0A и OC0B, будут поочерёдно плавно загораться и гаснуть, как бы в противофазе.
Но если приглядеться внимательнее, то видим, что один из светодиодов гаснет не до конца, а продолжает тускло светиться. Эта особенность характерна для Fast PWM режима. Дело в том, что в этом режиме, даже если записать в регистр сравнения 0, при обнулении счётчика на выходе всё равно устанавливается логическая единица, которая сбрасывается в следующем такте (по совпадению с регистром сравнения). Таким образом, в каждом периоде будет проскакивать по одному короткому импульсу длительностью 1 такт, но этого достаточно для засвечивания светодиода. Этот эффект отсутствует в инверсном режиме формирования выходных импульсов, т.к. в данном случае при обнулении счётчика будет происходить не короткий импульс, а наоборот - короткий провал во время максимального заполнения ШИМ. Этот провал можно увидеть на осциллографе, но такое мерцание светодиода человеческое зрение просто не заметит. Поэтому второй светодиод загорается и гаснет полностью. В режиме ШИМ с коррекцией фазы, этот эффект отсутствует независимо, инверсный сигнал формируется на выходе или нет. Поменяем значение бита WGM01 (1) регистра TCCR0A с 1 на 0.