Шим на avr. Использование ШИМ в микроконтроллерах AVR: подробное руководство

Что такое широтно-импульсная модуляция. Как работает ШИМ в микроконтроллерах AVR. Какие режимы ШИМ поддерживаются в AVR. Как настроить и использовать ШИМ на примере ATmega16. Какие преимущества дает применение ШИМ.

Содержание

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

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

ШИМ широко применяется для:

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

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


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

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

  • Таймер/счетчик — выполняет роль генератора пилообразного напряжения
  • Регистр сравнения — задает порог срабатывания компаратора
  • Компаратор — сравнивает значение таймера с регистром сравнения
  • Логика управления выходом — формирует выходной ШИМ-сигнал

Процесс генерации ШИМ-сигнала происходит следующим образом:

  1. Таймер непрерывно считает от 0 до максимального значения (зависит от разрядности)
  2. Значение таймера постоянно сравнивается с регистром сравнения
  3. При совпадении значений происходит переключение выхода
  4. При переполнении таймера выход снова переключается

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

Основные режимы ШИМ в микроконтроллерах AVR

В микроконтроллерах AVR поддерживается несколько режимов ШИМ:

1. Режим быстрой ШИМ (Fast PWM)

В этом режиме таймер считает от 0 до максимального значения, а затем сбрасывается. Преимущества:


  • Высокая частота ШИМ
  • Хорошо подходит для регулировки мощности

2. Режим ШИМ с фазовой коррекцией (Phase Correct PWM)

Таймер считает от 0 до максимума, а затем обратно до 0. Особенности:

  • Более низкая максимальная частота по сравнению с Fast PWM
  • Симметричные импульсы — подходит для управления двигателями

3. Режим ШИМ с фазовой и частотной коррекцией (Phase and Frequency Correct PWM)

Похож на Phase Correct PWM, но использует дополнительный регистр для задания верхнего предела счета. Преимущества:

  • Переменная частота ШИМ
  • Симметричные импульсы

Выбор конкретного режима зависит от требований к частоте ШИМ и характера нагрузки.

Настройка и использование ШИМ на примере ATmega16

Рассмотрим процесс настройки и использования ШИМ на примере микроконтроллера ATmega16. Будем использовать Timer1 в режиме Fast PWM для управления яркостью светодиода.

Шаг 1: Настройка регистров

Для настройки Timer1 в режим Fast PWM необходимо установить следующие биты в регистрах:

  • WGM10 = 1, WGM11 = 1, WGM12 = 1, WGM13 = 0 (режим Fast PWM, 10-bit)
  • COM1A1 = 1, COM1A0 = 0 (неинвертирующий режим)
  • CS10 = 1, CS11 = 0, CS12 = 0 (предделитель 1)

Код настройки регистров:


«`c #include void PWM_init() { // Настройка Timer1 TCCR1A |= (1 << COM1A1) | (1 << WGM11) | (1 << WGM10); TCCR1B |= (1 << WGM12) | (1 << CS10); // Настройка пина OC1A (PD5) на выход DDRD |= (1 << PD5); // Установка начального значения скважности (50%) OCR1A = 512; // 512 для 10-битного режима } void PWM_set_duty(uint16_t duty) { OCR1A = duty; } int main() { PWM_init(); while(1) { // Основной цикл программы } return 0; } ```

Шаг 2: Изменение скважности ШИМ

Для изменения скважности ШИМ достаточно записать новое значение в регистр OCR1A. В 10-битном режиме значения могут быть от 0 до 1023.

Пример изменения яркости светодиода:

«`c // В основном цикле программы for(uint16_t i = 0; i < 1024; i++) { PWM_set_duty(i); _delay_ms(5); // Требуется подключить } «`

Этот код будет плавно увеличивать яркость светодиода от минимума до максимума.

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

Использование ШИМ в проектах на базе микроконтроллеров AVR дает ряд существенных преимуществ:

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

Типичные применения ШИМ в проектах на AVR

ШИМ находит широкое применение в различных проектах на базе микроконтроллеров AVR:


  1. Управление яркостью светодиодов и подсветки LCD-дисплеев
  2. Регулировка скорости вращения двигателей постоянного тока
  3. Генерация звуковых сигналов различной частоты
  4. Управление сервоприводами в робототехнике
  5. Реализация аналогового выхода в цифро-аналоговых преобразователях
  6. Регулировка мощности в зарядных устройствах и блоках питания
  7. Управление нагревательными элементами с высокой точностью

Ограничения и особенности использования ШИМ

При работе с ШИМ в микроконтроллерах AVR следует учитывать некоторые ограничения и особенности:

  • Ограниченное количество ШИМ-каналов: зависит от конкретной модели микроконтроллера.
  • Влияние на работу таймеров: использование ШИМ может ограничить доступность таймеров для других задач.
  • Необходимость фильтрации: для получения аналогового сигнала может потребоваться дополнительная фильтрация.
  • Ограничения по частоте: максимальная частота ШИМ зависит от тактовой частоты микроконтроллера.
  • Возможные помехи: высокочастотный ШИМ-сигнал может создавать электромагнитные помехи.

Понимание этих ограничений поможет эффективно использовать ШИМ в ваших проектах.


Заключение: эффективное использование ШИМ в проектах на AVR

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

Ключевые моменты для эффективного использования ШИМ:

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

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


Занятие №8. Реализация ШИМ — Микроконтроллеры и Технологии

Под режимом работы 16-разр. таймера понимается его алгоритм счета и поведение связанного с ним выхода формирователя импульсов, что определяется комбинацией бит, задающих режим работы таймера (WGMn3-0) и режим формирования выходного сигнала (COMnx1:0). При этом биты задания режима формирования выходного сигнала не влияют на алгоритм счета, т.к. алгоритм счета зависит только от состояния бит задания режима работы таймера. В режимах с ШИМ биты COMnx1:0 позволяют включить/отключить инверсию на генерируемом ШИМ-выходе (т.е. выбрать ШИМ с инверсией или ШИМ без инверсии). Для режимов без ШИМ биты COMnx1:0 определяют, какое действие необходимо выполнить при возникновении совпадения: сбросить, установить или инвертировать выход (см. также “Блок формирования выходного сигнала” и «Временные диаграммы 16-разр. таймеров-счетчиков»).

Нормальный режим работы

Самым простым режимом работы является нормальный режим (WGMn3-0 = 0b0000). В данном режиме счетчик работает как суммирующий (инкрементирующий), при этом сброс счетчика не выполняется. Переполнение счетчика происходит при переходе через максимальное 16-разр. значение (0xFFFF) к нижнему пределу счета (0x0000). В нормальном режиме работы флаг переполнения таймера-счетчика TOVn будет установлен на том же такте синхронизации, когда TCNTn примет нулевое значение.

Фактически, флаг переполнения TOVn является 17-ым битом таймера-счетчика за тем исключением, что он только устанавливается и не сбрасывается. Однако программно это свойство может быть использовано для повышения разрешающей способности таймера, если использовать прерывание по переполнению таймера, при возникновении которого флаг TOVn сбрасывается автоматически. Для нормального режима работы не существует каких-либо особых ситуаций, поэтому запись нового состояния счетчика может быть выполнена в любой момент.

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

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

Режим сброса таймера при совпадении (СТС)

В режиме СТС (WGM01, WGM00 =0b10) регистр OCR0 используется для задания разрешающей способности счетчика. Если задан режим CTC и значение счетчика (TCNT0) совпадает со значением регистра OCR0, то счетчик обнуляется (TCNT0=0). Таким образом, OCR0 задает вершину счета счетчика, а, следовательно, и его разрешающую способность. В данном режиме обеспечивается более широкий диапазон регулировки частоты генерируемых прямоугольных импульсов. Он также упрощает работу счетчика внешних событий.

В режиме сброса таймера при совпадении (WGMn3-0 = 0b0100 или 0b1100) разрешающая способность таймера задается регистрами OCRnA или ICRn. В режиме СТС происходит сброс счетчика (TCNTn), если его значение совпадает со значением регистра OCRnA (WGMn3-0 = 0b0100) или с ICRn (WGMn3-0 = 0b1100). Значение регистра OCRnA или ICRn определяет верхний предел счета, а, следовательно, и разрешающую способность таймера. В данном режиме обеспечивается более широкий диапазон регулировки частоты генерируемых прямоугольных импульсов. Он также упрощает работу счетчика внешних событий. Временная диаграмма работы таймера в режиме СТС показана на рисунке 1. Счетчик (TCNTn) инкрементирует свое состояние до тех пор, пока не возникнет совпадение со значением OCRnA или ICRn, а затем счетчик (TCNTn) сбрасывается.

Рисунок 1 – Временная диаграмма для режима СТС

По достижении верхнего предела счета может генерироваться прерывание с помощью флагов OCFnA или ICFn, соответствующим используемым регистрам для задания верхнего предела счета. Если прерывание разрешено, то процедура обработки прерывания может использоваться для обновления верхнего предела счета. Однако, задание значения вершины счета близкого к значению нижнего предела счета, когда счетчик работает без предделения или с малым значением предделения, необходимо выполнять с особой осторожностью, т.к. в режиме СТС нет двойной буферизации. Если значение, записанное в OCRnA или ICRn, меньше текущего значения TCNTn, то сброс счетчика по условию совпадения наступит, когда он достигнет максимального значения (0xFFFF), затем перейдет в исходное состояние 0x0000 и достигнет нового значения OCRnA или ICRn. Во многих случаях возникновение такой ситуации не желательно. В качестве альтернативы может выступить режим быстрой ШИМ, где регистр OCRnA определяет верхний предел счета (WGMn3-0 = 0b1111), т.к. в этом случае OCRnA имеет двойную буферизацию.

Для генерации сигнала в режиме CTC выход OCnA может использоваться для изменения логического уровня при каждом совпадении, для чего необходимо задать режим переключения (COMnA1, COMnA0 = 0b01). Значение OCnA будет присутствовать на выводе порта, только если для данного вывода задано выходное направление. Максимальная частота генерируемого сигнала равна fOC0 = fclk_I/O/2, если OCRnA = 0x0000. Для других значений OCRn частоту генерируемого сигнала можно определить по формуле:

где переменная N задает коэффициент деления предделителя (1, 8, 32, 64, 128, 256 или 1024).

Также как и для нормального режима работы, флаг TOV0 устанавливается на том же такте таймера, когда его значение изменяется с 0xFFFF на 0x0000.

Режим быстрой ШИМ (FAST PWM)

Режим быстрой широтно-импульсной модуляции (ШИМ) (WGMn3-0 = 0b0101, 0b0110, 0b0111, 0b1110, 0b1111) предназначен для генерации ШИМ-импульсов повышенной частоты. В отличие от других режимов работы в этом используется однонаправленная работа счетчика. Счет выполняется в направлении от нижнего к верхнему пределу счета.

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

Разрешающая способность ШИМ может быть фиксированной 8, 9 или 10 разрядов или задаваться регистром ICRn или OCRnA, но не менее 2 разрядов (ICRn или OCRnA = 0x0003) и не более 16 разрядов (ICRn или OCRnA = 0xFFFF). Разрешающая способность ШИМ при заданном значении верхнего предела (ВП) вычисляется следующим образом:

В режиме быстрой ШИМ счетчик инкрементируется до совпадения его значения с одним из фиксированных значений 0x00FF, 0x01FF или 0x03FF (если WGMn3:0 = 0b0101, 0b0110 или 0b0111, соответственно), значением в ICRn (если WGMn3:0 = 0b1110) или значением в OCRnA (если WGMn3:0 = 0b1111), а затем сбрасывается следующим тактом синхронизации таймера. Временная диаграмма для режима быстрой ШИМ представлена на рисунке 2. На рисунке показан режим быстрой ШИМ, когда для задания верхнего предела используется регистр OCRnA или ICRn. Значение TCNTn на временной диаграмме показано в виде графика функции для иллюстрации однонаправленности счета. На диаграмме показаны как инвертированный, так и неинвертированный ШИМ-выходы. Короткой горизонтальной линией показаны точки на графике TCNTn, где совпадают значения OCRnx и TCNTnx. Флаг прерывания OCnx устанавливается при возникновении совпадении.

Рисунок 2 – Временная диаграмма для режима быстрой ШИМ

Флаг переполнения таймера-счетчика (TOVn) устанавливается всякий раз, когда счетчик достигает верхнего предела. Дополнительно тем же тактовым импульсом вместе с флагом TOVn могут установиться флаги OCnA или ICFn, если для задания верхнего предела используется регистр OCRnA или ICRn, соответственно. Если одно из этих прерываний разрешено, то в процедуре обработки прерывания может быть выполнено обновление верхнего предела счета и порогов сравнения.

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

Механизм модификации регистра ICRn отличается от OCRnA в том случае, если он используется для задания верхнего предела. Регистр ICRn не имеет двойной буферизации. Это означает, что если в ICRn записывается малое значение во время работы счетчика с малым предделением или без него, то имеется опасность записи в регистр ICRn значения, которое окажется меньше текущего значения TCNTn. Как результат, в такой ситуации будет пропущено совпадение на вершине счета. В этом случае счетчик дойдет до максимального значения (0xFFFF), перезапустится со значения 0x0000, а только затем возникнет совпадение. Регистр OCRnA содержит схему двойной буферизации, поэтому, его можно модифицировать в любой момент времени.

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

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

В режиме быстрой ШИМ блоки сравнения позволяют генерировать ШИМ-сигналы на выводах OCnx. Если COMnx1:0 =0b10, то задается ШИМ без инверсии выхода, а если COMnx1:0 = 0b11, то задается режим ШИМ с инверсией на выходе (см. таблицу 59). Фактическое значение OCnx можно наблюдать на выводе порта, если для него задано выходное направление (DDR_OCnx). ШИМ-сигнал генерируется путем установки (сброса) регистра OCnx при возникновении совпадения между OCRnx и TCNTn, а также путем сброса (установки) регистра OCnx вместе со сбросом счетчика (переход с верхнего предела на нижний предел).

Частота ШИМ выходного сигнала для заданного значения верхнего предела (ВП) определяется выражением:

где N – переменная, которая задает значение коэффициента предделения (1, 8, 32, 64, 128, 256 или 1024).

Запись предельных значений в регистр OCRnx связана с особыми случаями в генерации ШИМ-импульсов. Если OCRnx установить равным нижнему пределу (0x0000), то на выходе будет возникать короткий импульс каждый (ВП+1)-ый такт синхронизации таймера. Запись в OCRnx значения равного верхнему пределу приведет к установке постоянного уровня лог. 1 или 0 на выходе (зависит от выбранной с помощью бит COMnx1:0 полярности выходного сигнала).

Если требуется генерация меандра (прямоугольные импульсы со скважностью 2 или заполнением 50%) высокой частоты, то необходимо использовать режим быстрой ШИМ с установкой бит COMnA1:0 = 0b01, которая вызывает переключение (инвертирование) логического уровня на выходе OCnA при каждом совпадении. Данное применимо, только если OCRnA используется для задания верхнего предела (WGMn3-0 =0b1111). Максимальная генерируемая частота меандра в этом случае fOCnA = fclk_I/O/2, если OCRnA =0x0000. Данная особенность аналогична переключению OCnA в режиме СТС за исключением двойной буферизации, которая имеется в режиме быстрой ШИМ.

Режим широтно-импульсной модуляции с фазовой коррекцией (Phase Correct)

Режим широтно-импульсной модуляции с фазовой коррекцией (ШИМ ФК) (WGMn3-0 = 0b0001, 0b010, 0b0011, 0b1010 или 0b1011) предназначен для генерации ШИМ сигнала с фазовой коррекцией и высокой разрешающей способностью. Режим ШИМ ФК основан на двунаправленной работе таймера-счетчика. Счетчик циклически выполняет счет в направлении от нижнего предела (0x0000) до верхнего предела, а затем обратно от верхнего предела к нижнему пределу. Если задан неинвертирующий режим выхода формирователя импульсов, то выход OCnx сбрасывается/устанавливается при совпадении значений TCNTn и OCRnx во время прямого/обратного счета. Если задан инвертирующий режим выхода, то, наоборот, во время прямого счета происходит установка, а во время обратного – сброс выхода OCnx. При двунаправленной работе максимальная частота ШИМ-сигнала меньше, чем при однонаправленной работе, однако, за счет такой особенности, как симметричность в режимах ШИМ с двунаправленной работой, данные режимы предпочитают использовать при решении задач управления приводами.

Разрешающая способность ШИМ в данном режиме может быть либо фиксированной (8, 9 или 10 разрядов) либо задаваться с помощью регистра ICRn или OCRnA. Минимальная разрешающая способность равна 2-м разрядам (ICRn или OCRnA = 0x0003), а максимальная -16-ти разрядам (ICRn или OCRnA =0xFFFF). Если задан верхний предел, то разрешающая способность ШИМ в данном режиме определяется следующим образом:

В режиме ШИМ ФК счетчик инкрементируется пока не достигнет одного из фиксированных значений 0x00FF, 0x01FF или 0x03FF (соответственно для WGMn3-0 = 0b0001, 0b0010 или 0b0011), а также значения равного ICRn (если WGMn3-0 = 0b1010) или OCRnA (если WGMn3:0 = 0b1011). Далее, при достижении верхнего предела, счетчик изменяет направление счета. Значение TCNTn остается равным верхнему пределу в течение одного такта синхронизации таймера. Временная диаграмма для режима ШИМ ФК представлена на рисунке 3. На рисунке показан режим ШИМ ФК с использованием регистра OCRnA или ICRn для задания верхнего предела. Состояние TCNTn представлено в виде графика функции для иллюстрации двунаправленности счета. На рисунке представлены, как неинвертированный, так и инвертированный ШИМ-выход. Короткие горизонтальные линии указывают точки на графике изменения TCNTn, где возникает совпадение со значением OCRnx. Флаг прерывания OCnx устанавливается при возникновении совпадения.

Рисунок 3 – Временная диаграмма для режима ШИМ ФК

Флаг переполнения таймера-счетчика (TOVn) устанавливается всякий раз, когда счетчик достигает нижнего предела. Если для задания верхнего предела используется регистр OCRnA или ICRn, то, соответственно устанавливается флаг OCnA или ICFn тем же тактовым импульсом, на котором произошло обновление регистра OCRnx из буферного регистра (на вершине счета). Флаги прерывания могут использоваться для генерации прерывания по достижении счетчиком нижнего или верхнего предела.

При изменении значения верхнего предела счета необходимо следить, чтобы оно было больше или равно значениям во всех регистрах сравнения. В противном случае совпадение между TCNTn и OCRnx никогда не возникнет. Обратите внимание, что при использовании фиксированных значений верхнего предела счета во время записи в регистры OCRnx неиспользуемые разряды обнуляются. Третий период на рисунке 53 иллюстрирует случай, когда динамическое изменение верхнего предела счета приводит к генерации несимметричного импульса. Данная особенность основывается на времени обновления регистра OCRnx. Поскольку, обновление OCRnx возникает на вершине счета, то и период ШИМ начинается и заканчивается на вершине счета. Это подразумевает, что длительность обратного счета определяется предыдущим значением верхнего предела, а прямого – новым значением верхнего предела. Если два этих значения разные, то и длительность прямого и обратного счета будет также отличаться. Различие в длительности приводит несимметричности выходных импульсов.

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

В режиме ШИМ ФК блоки сравнения позволяют генерировать ШИМ-сигналы на выводах OCnx. Если установить COMnx1:0 = 0b10, то выход ШИМ будет без инверсии, а если COMnx1:0=0b11, то с инверсией. Фактическое значение OCnx можно наблюдать на выводе порта, если в регистре направления данных для данного вывода порта задано выходное направление (DDR_OCnx). ШИМ-сигнал генерируется путем установки (сброса) регистра OCnx при совпадении значений OCRnx и TCNTn во время прямого счета, а также путем сброса (установки) регистра OCnx при совпадении между OCRnx и TCNTn во время обратного счета. Результирующая частота ШИМ-сигнала в режиме ШИМ ФК при заданном верхнем пределе (ВП) может быть вычислена по следующему выражению:


где N – коэффициент деления предделителя (1, 8, 32, 64, 128, 256 или 1024).

Запись предельных значений в регистр OCRnx связано с особыми случаями в генерации ШИМ-сигналов в режиме ШИМ ФК. Если задать режим ШИМ без инверсии и OCRnx установить равным нижнему пределу, то на выходе непрерывно будет установлен лог. 0, а если равным верхнему пределу, то на выходе постоянно присутствует лог. 1. Для ШИМ с инверсией указанные уровни необходимо заменить противоположными.

Если задать использование OCnA в качестве верхнего предела (WGMn3:0 = 0b1011) и установить COMnA1:0 =0b01, то на выходе OCnA будет генерироваться меандр.

Режим широтно-импульсной модуляции с фазовой и частотной коррекцией (Phase and Frequency Correct)

Режим широтно-импульсной модуляции с фазовой и частотной коррекцией (ШИМ ФЧК) (WGMn3-0 = 0b1000 или 0b1001) предназначен для генерации ШИМ-импульсов высокой разрешающей способности с фазовой и частотной коррекцией. Также как и режим ШИМ ФК режим ШИМ ФЧК основан на двунаправленной работе счетчика. Счетчик циклически считает от нижнего предела (0x0000) до верхнего предела, а затем обратно от верхнего предела к нижнему пределу. Если задан неинвертирующий режим ШИМ, то выход OCnx сбрасывается, если возникает совпадение между TCNTn и OCRnx во время прямого счета, и устанавливается, если возникает совпадение во время обратного счета. В инвертирующем режиме работа инверсная. Двунаправленная работа, по сравнению с однонаправленной, связана с генерацией более низких частот. Однако, благодаря симметричности в режимах ШИМ с двунаправленным счетом, их применение предпочтительно в задачах управления приводами.

Основное отличие между режимами ШИМ ФК и ШИМ ФЧК состоит в моменте обновления регистра OCRnx из буферного регистра OCRnx (см. рисунок 3 и рисунок 4).

Разрешающая способность ШИМ в этом режиме может задаваться с помощью регистра ICRn или OCRnA. Минимальная разрешающая способность равна 2-ум разрядам (ICRn или OCRnA = 0x0003), а максимальная разрешающая способность — 16-ти разрядам (ICRn или OCRnA = 0xFFFF). Разрешающая способность ШИМ в разрядах может быть вычислена по следующему выражению:

В режиме ШИМ ФЧК счетчик инкрементируется до совпадения со значением в ICRn (WGMn3:0 = 0b1000) или в OCRnA (WGMn3:0 = 0b1001). Это означает достижение вершины счета, после чего происходит изменение направления счета. Значение TCNTn остается равным вершине счета в течение одного такта синхронизации таймера. Временная диаграмма для режима ШИМ ФЧК показана на рисунке 54. На рисунке показан режим ШИМ ФЧК, когда вершину счета задает регистр OCRnA или ICRn. Значение TCNTn показано в виде графика функции для иллюстрации двунаправленности счета. На диаграмме показан как неинвертирующий, так и инвертирующий ШИМ выходы. Короткие горизонтальные линии указывают на точки график TCNTn, где возникает совпадение между OCRnx и TCNTn. Флаг прерывания OCnx устанавливается после возникновения совпадения.

Рисунок 4 – Временная диаграмма режима ШИМ с фазовой и частотной коррекцией

Флаг переполнения таймера-счетчика (TOVn) устанавливается тем же тактом, когда произошло обновление регистров значением из буферного регистра (на нижнем пределе счета). Если для задания верхнего предела используется регистр OCRnA или ICRn, то по достижении счетчиком верхнего предела устанавливается флаг OCnA или ICFn, соответственно. Флаги прерывания могут использоваться для генерации прерывания при достижении счетчиком верхнего или нижнего предела.

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

На рисунке 4 показано, что в отличие от режима ШИМ ФК, генерируемый выходной сигнал симметричен на всех периодах. Поскольку, регистры OCRnx обновляются на нижнем пределе счета, то длительности прямого и обратного счетов всегда равны. В результате выходные импульсы имеют симметричную форму, а, следовательно, и откорректированную частоту.

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

В режиме ШИМ ФЧК блоки сравнения позволяют генерировать ШИМ-импульсы на выводе OCnx. Если COMnx1:0 = 0b10, то задается неинвертирующий ШИМ выход, а, если COMnx1:0=0b11, то инвертирующий (см. таблицу 60). Значение OCnx будет присутствовать на соответствующем выводе порта только в случае, если для него задано выходное направление. ШИМ сигнал генерируется путем установки (сброса) регистра OCnx при совпадении между OCRnx и TCNTn во время прямого счета и сброса (установки) регистра OCnx при совпадении между OCRnx и TCNTn во время обратного счета. Частота ШИМ в данном режиме при заданном верхнем пределе (ВП) счета определяется следующим образом:

где N – коэффициент деления предделителя (1, 8, 32, 64, 128, 256 или 1024).

Запись предельных значений в регистр OCRnx связана с особыми случаями в генерации ШИМ-сигналов в данном режиме. Если задать OCRnx равным нижнему пределу (0x0000), то в неинвертирующем режиме на выходе будет постоянного присутствовать низкий логический уровень, а при записи значения равного верхнему пределу на выходе будет длительно присутствовать высокий логический уровень. В инвертирующем режиме приведенные уровни будут противоположными.

Если OCRnA используется для задания верхнего предела (WGMn3:0 = 0b1001) и COMnA1:0 = 0b01, то на выходе OCnA будет генерироваться меандр.

Урок 13. Аппаратная ШИМ на микроконтроллере « схемопедия


В этом уроке мы научимся реализовывать ШИМ сигнал на микроконтроллере AVR с помощью BASCOM-AVR. В микроконтроллерах AVR, ШИМ можно реализовать посредством таймеров, для этой цели в микроконтроллере есть ШИМ выходы на порты вводавывода. Например, в микроконтроллере Attiny13 есть один таймер (

Timer0) и два канала вывода ШИМ Pwm0a и Pwm0b, которые находиться на портах PB.0 и PB.1. В документации на микроконтроллер ШИМ каналы подписываются так: OC0A – ШИМ канал A на таймере 0, OC0B – ШИМ канал B на таймере 0, OC1A – ШИМ канал A на таймере 1, OC1B – ШИМ канал B на таймере 1 и т.д.

Работа с ШИМ в микроконтроллере

Для начала работы нужно сконфигурировать таймер на работу ШИМ для этого есть команда:

Config Timer1 = Pwm, Pwm = Разрядность, Compare A Pwm = Состояние канала A, Compare B Pwm = Состояние канала B, Prescale = Частота ШИМ

Разрядность можно задать 8, тогда будет скважность ШИМ от 0 до 255.

Для Timer1 разрядность можно задать 9 или 10. Состояние канала A или B можно задать Clear Up – скважность при 0 = логической 1 и Clear Down – скважность при 0 = логической 0. Частоту ШИМ можно задать: 1, 8, 64, 256 и 1024.

Пример команды конфигурирования: Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8

После конфигурирования таймера нужно сконфигурировать порты ШИМ на вывод командой Config порт = Output, например: Config Portb.0 = Output

Потом нужно запустить таймер командой Start таймер, например: Start Timer0.

Теперь можно записать скважность в ШИМ канал для канала A таймера 0 это можно сделать так: Pwm0a = скважность, например: Pwm0a = 150

Практический пример

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

Теперь напишем простую программку на BASCOM-AVR, применяя полученные знания:

$regfile = “attiny13.dat” $crystal = 9600000 Config Timer0 = Pwm , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8 Config Portb.0 = Output Config Portb.1 = Output Start Timer0 Do Incr Pwm0a Decr Pwm0b Waitms 5 Loop End

Откомпилируем её, прошьём микроконтроллер и установим фьюз биты микроконтроллера на тактирование от внутреннего тактового генератора на 9.6 МГц без делителя на 8. Пример установки фьюз битов в программе SinaProg:

Я использовал свою отладочную плату и вот что получилось:

Видео работы:

Скачать файлы для урока (проект в Proteus, исходник, прошивка)

Автор: Яковлев Александр Вячеславович (г.Витебск, Беларусь)

PWM в микроконтроллере AVR — javatpoint

следующий → ← предыдущая

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

Существуют различные термины, связанные с широтно-импульсной модуляцией (ШИМ):

  • Off-Time: Продолжительность периода времени, когда сигнал низкий.
  • On-Time: Продолжительность периода времени, когда сигнал высокий.
  • Рабочий цикл: Это процент периода времени, когда сигнал остается включенным в течение периода сигнала широтно-импульсной модуляции.
  • Период: Это сумма времени выключения и времени включения сигнала широтно-импульсной модуляции.

Рабочий цикл:

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


Период:

Как показано на рисунке выше, Toff представляет время выключения, а Ton представляет время включения сигнала. Период представляет собой сумму времени включения и выключения, и период рассчитывается, как показано в уравнении ниже:


ШИМ: регулирование напряжения

Сигналы ШИМ

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

  • Аудио
  • Светодиодные диммеры
  • Генерация аналогового сигнала
  • Импульсные регуляторы
  • и многое другое..

Операция регулирования напряжения выполняется путем усреднения сигнала ШИМ. Выходное напряжение рассчитывается, как показано в уравнении ниже:

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


Таймеры AVR как ШИМ:

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

Как и в случае с микроконтроллером (AT90S8515), Timer1 можно использовать в режиме PWM, установив биты PWM10 и PWM11 в регистре TCCR1A.

В ШИМ микроконтроллера AVR доступны следующие режимы:

PWM10 PWM11 Описание
0 0 PWM.0003 0 1 таймер/счетчик 1 в 9-битном режиме ШИМ
1 1 Таймер/счет может быть выбран с помощью битов выбора часов в регистре TCCR1B.

Длительность импульса загружается в регистры сравнения выхода таймера OCR1A (OCR1AL и OCR1AH) и OCR1B (OCR1BL и OCR1BH). Счетчик 1/таймер действует как счетчик прямого/обратного счета, считая от $0000 до TOP, как показано в таблице ниже:

PWM Resolution Timer Top Value Frequency
10-bit PWM $03FF (1023) Ftck1/2046
9-bit PWM $01FF (511) Ftck1/1022
8-битный ШИМ $00FF (255) Ftck1/510

Здесь происходит подсчет и снова обнуление перед повторением цикла. Когда значение счетчика совпадает с содержимым 10 младших битов OCR1B или OCR1A, выводы OC1B/PD5 (OC1A) сбрасываются или устанавливаются в соответствии с настройками битов COM1A0/COM1A1 или COM1B1/COM1B0 в регистре управления таймером/счетчиком 1 (TCCR1A). ), как показано в таблице ниже:

COM1X0 COM1X1 Effect on OCX1
0 0 Not Connected
1 0 Not Connected
0 1 Cleared on compare match , счет вверх. Устанавливается при совпадении сравнения (неинвертированный ШИМ)
1 1 Сбрасывается при совпадении сравнения, обратный счет. Установить счет совпадения при сравнении (инвертированный ШИМ)

Примечание: X может быть регистром A или B.


AVR: Код сборки для запуска PWM:

;Это пример 8-битного неинвертированного ШИМ-кода на ассемблере. .equ pulse_width = 40 долларов США ;Ширина импульса сигнала может быть изменена от 0 до TOP ШИМ_СТАРТ: ldi temp, pulse_width ;Загрузить значение ширины импульса вне OCR1AL, темп ; Ширина импульса = OCR1A clr temp выход OCR1AH, темп. ldi temp, $81; работает в 8-битном ШИМ-режиме. out TCCR1A, temp ; не инвертированный режим работы в temp, DDRD ;используйте PortD.5 в качестве вывода исходная температура, (1<<5) вне DDRD, темп. ldi temp, $1 ;Запуск широтно-импульсной модуляции (ШИМ) выход TCCR1B, темп. ret ;Возврат в главное окно программы ; PWM работает в фоновом режиме автоматически


AVR: Настройка ШИМ в C:

/* Глобальные переменные и их определение */ #определить PULSE_WIDTH 0x40 недействительным pwm_start () { OCR1AL = ШИРИНА_ИМПУЛЬСА; /* Загружаем значение ширины импульса */ ОКР1АХ = 0; ДДРД |= (1

Следующая темаВнешние прерывания в микроконтроллере AVR

← предыдущая следующий →

Таймеры AVR — режим ШИМ

Широтно-импульсная модуляция (ШИМ) — очень распространенный метод в телекоммуникациях и управлении питанием. Узнайте, как легко вы можете сделать это с помощью AVR! В этом посте обсуждаются все необходимые теоретические концепции, связанные с ШИМ. Вот так…

С возвращением! До сих пор в разделе «Таймеры AVR» мы обсуждали концепции таймеров, предварительные делители, прерывания, режим ctc и т. д. Для получения информации о них обратитесь к следующим руководствам.

  • Введение в таймеры AVR
  • ТАЙМЕР АВР0
  • ТАЙМЕР АРН1
  • ТАЙМЕР АВР2
  • Таймеры AVR – режим CTC

В этом уроке я познакомлю вас с другим режимом таймеров AVR — PWM Mode.

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

Двигатель 12 В, 300 об/мин

Двигатель рассчитан на 12 В, 300 об/мин. Это означает, что (при идеальных условиях) двигатель будет работать со скоростью 300 об/мин только при подаче на него 12 В постоянного тока. Если мы применим 6 В, двигатель будет работать только со скоростью 150 об / мин. Дополнительные сведения об управлении двигателем постоянного тока с помощью AVR см. здесь. Теперь давайте подадим следующий сигнал (12 В постоянного тока) на двигатель.

Питание 12 В постоянного тока

Двигатель будет вращаться со скоростью 300 об/мин. Теперь давайте изменим уровень напряжения следующим образом (6 В постоянного тока).

Питание 6 В постоянного тока

Мы видим, что двигатель вращается со скоростью 150 об/мин. Теперь давайте снова изменим уровень напряжения следующим образом (0 В постоянного тока).

Питание 0 В постоянного тока

На этот раз, что неудивительно, двигатель вообще не работает. Хорошо, так давайте сделаем это более интересным. Что делать, если  мы обеспечиваем следующее питание двигателя.

ШИМ 50% рабочего цикла

Как теперь будет реагировать двигатель? Будет ли он запускаться какое-то время, потом через какое-то время останавливается, потом начинается, потом останавливается, потом снова начинается и так далее. Или он запутается и просто взорвется? 😀

Что ж, у каждого тела в этом мире есть какая-то инерция. Скажем, двигатель выше вращается всякий раз, когда он включен. Как только он будет выключен, он будет стремиться остановиться. Но это не прекращается сразу, на это требуется время. Но прежде чем он полностью остановится, он снова включается! Таким образом, он начинает двигаться. Но даже сейчас для достижения полной скорости требуется некоторое время. Но прежде чем это произойдет, его выключают и так далее. Таким образом, общий эффект этого действия заключается в том, что двигатель вращается непрерывно, но с более низкой скоростью. В приведенном выше случае мотор будет вести себя точно так же, как если бы на него подали 6В постоянного тока, т.е. вращаться со скоростью 150 об/мин!

Итак, теперь давайте изменим сигнал следующим образом.

Рабочий цикл ШИМ 25%

Теперь  что произойдет? Да! Вы правильно угадали! (Надеюсь на это ;)) Поскольку время включения меньше времени выключения, эффективная скорость двигателя снижается. В этом случае скорость становится равной 75 об/мин (поскольку время выключения = 3 раза времени включения, т. е. скорость = 300/4 = 75 об/мин).

Теперь ваша очередь сказать, что происходит в этом случае:

75% рабочего цикла ШИМ

Это то, что мы называем Широтно-импульсная модуляция , широко известная как PWM .

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

Генерация ШИМ

предопределенной формы сигнала с фиксированным уровнем напряжения, как показано ниже.

Сравните PWM

На диаграмме, показанной выше, у нас есть предопределенная форма волны, пилообразная форма волны. Мы сравниваем эту форму сигнала с фиксированным уровнем постоянного тока. Он имеет три режима вывода сравнения  работы:

  • Инвертированный режим —  В этом режиме, если значение формы сигнала больше, чем уровень сравнения, то на выходе устанавливается высокий уровень, в противном случае выходной сигнал низкий. Это показано на рисунке А выше.
  • Неинвертированный режим —  В этом режиме выходной сигнал имеет высокий уровень, когда уровень сравнения превышает уровень сигнала, и низкий уровень в противном случае. Это показано на рисунке B выше.
  • Режим переключения —  В этом режиме вывод переключается всякий раз, когда есть совпадение сравнения. Если выход высокий, он становится низким, и наоборот.

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

ШИМ модуляция

Здесь можно четко  видеть и понимать значение «ширины» в импульсе Ширина  Модуляция! 😉

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

Рабочий цикл

Рабочий цикл сигнала ШИМ задается как

 Это поясняется на следующей диаграмме.

Объяснение рабочего цикла

В этом разделе мы рассмотрим некоторые важные и необходимые понятия, связанные с таймерами. Рассмотрим следующую диаграмму таймера.

Фиксированный и переменный TOP в таймерах

Нам очень хорошо известно, что AVR предоставляет нам возможность выбора 8- и 16-битных таймеров. 8-битные таймеры считают от 0 до 255, затем обратно до нуля и так далее. 16-битные таймеры считают от 0 до 65535, а затем обратно до нуля. Таким образом, для 8-битного таймера MAX = 255, а для 16-битного таймера MAX = 65535.

Таймер всегда считает от 0 до TOP, а затем возвращается к нулю. На рисунке A, показанном выше, TOP = MAX. Теперь, я думаю, вы все знакомы с таймерами в режиме CTC, в котором вы можете сбрасывать таймер всякий раз, когда происходит совпадение сравнения. За счет этого значение TOP может быть уменьшено, как показано на рисунке Б. Желтая линия показывает, как шел бы таймер в обычном режиме. Теперь режим CTC можно расширить, чтобы ввести переменную TOP, как показано на рисунке C (однако в этом нет никакой практической пользы).

TOP никогда не превышает MAX. ВЕРХ <= МАКС.

Теперь, когда вы знакомы с терминологией ВЕРХ, НИЗ и МАКС, мы можем перейти к различным режимам работы.

В целом существует три режима работы ШИМ-таймеров:

  • Быстрый ШИМ
  • Фазокорректирующий ШИМ
  • Коррекция частоты и фазы ШИМ

Быстрый ШИМ

Рассмотрим следующую схему.

Быстрый ШИМ

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

В этом режиме, поскольку используется пилообразный сигнал, счетчик таймера TCNTn (n = 0,1,2) считает от НИЖНЕГО до ВЕРХНЕГО, а затем он просто переполняется (или сбрасывается при совпадении сравнения) до НИЖНЕГО.

Коррекция фазы ШИМ

Теперь взгляните на следующую диаграмму.

ШИМ с корректировкой фазы

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

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

ШИМ с коррекцией частоты и фазы

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

ШИМ с коррекцией частоты и фазы Описание

Таким образом, для этого нам понадобится ШИМ с коррекцией частоты и фазы. Поскольку в большинстве случаев значение TOP остается прежним, не имеет значения, что мы выбираем — Phase Correct или Frequency and Phase Correct PWM.

Теперь, когда вы знакомы со всеми понятиями ШИМ, вам решать

  • Какой таймер выбрать?
  • Какой режим работы выбрать?
  • Какой режим вывода сравнения выбрать?

Выбор таймера

В AVR режим ШИМ доступен для всех таймеров. TIMER0 и TIMER2 обеспечивают 8-битную точность, тогда как TIMER1 обеспечивает 16-битную точность. При 8-битной точности у вас есть 256 отдельных шагов, тогда как при 16-битной точности у вас есть 65536 шагов.

Теперь предположим, что вы хотите управлять скоростью двигателя постоянного тока. В этом случае 65536 шагов совершенно бесполезны! Таким образом, мы можем использовать для этого 8-битный таймер. Даже 8bit это слишком, но другого выхода нет. Очевидно, что нет большой разницы в скорости между 123/256-й и 124/256-й полной скоростью в случае двигателя! Но если вы используете серводвигатели, вы должны использовать 16-битный таймер. Подробнее об этом позже.

Если вам нужно достаточно высокое разрешение в вашем приложении, выберите 16-битный таймер.

Выбор режима работы

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

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *