- Контакты PWM в микроконтроллере AVR Atmega16
- Что такое сигнал ШИМ?
- Необходимые компоненты
- Принципиальная электрическая схема
- Программирование Atmega16 для ШИМ
Широтно-импульсная модуляция (ШИМ) - это мощный метод, при котором ширина импульса изменяется за счет сохранения постоянной частоты. Сегодня этот метод используется во многих системах управления. Применение ШИМ не ограничено, и он используется в широком диапазоне приложений, таких как управление скоростью двигателя, измерение, управление мощностью и связь и т. Д. В методе ШИМ можно легко генерировать аналоговый выходной сигнал с использованием цифровых сигналов. Это руководство поможет вам понять ШИМ, его терминологию и то, как мы можем реализовать его с помощью микроконтроллера. В этом уроке мы продемонстрируем ШИМ с микроконтроллером AVR Atmega16, изменяя яркость светодиода.
Чтобы подробно понять основы ШИМ, перейдите к нашим предыдущим руководствам по ШИМ с различными микроконтроллерами:
- ARM7-LPC2148 PWM Учебное пособие: Управление яркостью светодиода
- Широтно-импульсная модуляция (ШИМ) с использованием MSP430G2: управление яркостью светодиода
- Генерация ШИМ с использованием микроконтроллера PIC с MPLAB и XC8
- Широтно-импульсная модуляция (PWM) в STM32F103C8: управление скоростью вентилятора постоянного тока
- Генерация сигналов ШИМ на выводах GPIO микроконтроллера PIC
- Учебное пособие по Raspberry Pi PWM
Контакты PWM в микроконтроллере AVR Atmega16
Atmega16 имеет четыре выделенных контакта PWM. Это контакты PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Также Atmega16 имеет два 8-битных таймера и один 16-битный таймер. Timer0 и Timer2 - это 8-битные таймеры, а Timer1 - 16-битные. Чтобы сгенерировать ШИМ, мы должны иметь обзор таймеров, поскольку таймеры используются для генерации ШИМ. Как мы знаем, частота - это количество циклов в секунду, с которыми работает таймер. Таким образом, более высокая частота даст нам более быстрый таймер. При генерации ШИМ более высокая частота ШИМ даст более точный контроль над выходом, поскольку он может быстрее реагировать на новые рабочие циклы ШИМ.
В этом руководстве по Atmega16 PWM мы будем использовать Timer2. Вы можете выбрать любой рабочий цикл. Если вы не знаете, что такое рабочий цикл в ШИМ, давайте кратко обсудим.
Что такое сигнал ШИМ?
Широтно-импульсная модуляция (ШИМ) - это цифровой сигнал, который чаще всего используется в схемах управления. Время, в течение которого сигнал остается на высоком уровне, называется «временем включения», а время, в течение которого сигнал остается низким, называется «временем выключения». Ниже описаны два важных параметра ШИМ:
Рабочий цикл ШИМ
Процент времени, в течение которого сигнал ШИМ остается ВЫСОКИМ (по времени), называется рабочим циклом.
Как и в импульсном сигнале 100 мс, если сигнал ВЫСОКИЙ в течение 50 мс и НИЗКИЙ в течение 50 мс, это означает, что импульс был половину времени ВЫСОКИЙ, а половину - НИЗКИЙ. Таким образом, можно сказать, что рабочий цикл составляет 50%. Точно так же, если импульс находится в ВЫСОКОМ состоянии 25 мс и 75 мс в НИЗКОМ состоянии из 100 мс, то рабочий цикл будет 25%. Обратите внимание, что мы рассчитываем только длительность ВЫСОКОГО состояния. Вы можете использовать изображение ниже для визуального понимания. Формула для рабочего цикла тогда:
Рабочий цикл (%) = время включения / (время включения + время выключения)
Таким образом, изменяя рабочий цикл, мы можем изменить ширину ШИМ, что приведет к изменению яркости светодиода. У нас будет демонстрация использования различных рабочих циклов для управления яркостью светодиода. Посмотрите демонстрационное видео в конце этого урока.
После выбора рабочего цикла следующим шагом будет выбор режима ШИМ. Режим ШИМ определяет, как вы хотите, чтобы ШИМ работал. В основном существует 3 типа режимов ШИМ. Это следующие:
- Быстрая ШИМ
- ШИМ с фазовой коррекцией
- ШИМ с коррекцией фазы и частоты
Быстрая ШИМ используется там, где изменение фазы не имеет значения. Используя Fast PWM, мы можем быстро выводить значения PWM. Быстрый ШИМ не может использоваться там, где изменение фазы влияет на работу, такую как управление двигателем, поэтому в таком приложении используются другие режимы ШИМ. Поскольку мы будем контролировать яркость светодиода, где изменение фазы не будет сильно влиять, мы будем использовать режим Fast PWM.
Теперь, чтобы сгенерировать ШИМ, мы будем управлять внутренним таймером, чтобы он подсчитывал, а затем сбрасывал его на ноль при определенном подсчете, поэтому таймер будет считать, а затем снова и снова сбрасывать его на ноль. Это устанавливает период. Теперь у нас есть возможность управлять импульсом, включать импульс на определенный счет в таймере, пока он идет вверх. Когда счетчик вернется к 0, выключите импульс. Это дает большую гибкость, потому что вы всегда можете получить доступ к счетчику таймера и предоставить разные импульсы с помощью одного таймера. Это замечательно, если вы хотите управлять несколькими светодиодами одновременно. Теперь приступим к сопряжению одного светодиода с Atmega16 для ШИМ.
Проверьте все проекты, связанные с ШИМ здесь.
Необходимые компоненты
- Микроконтроллер Atmega16 AVR IC
- Кристаллический осциллятор 16 МГц
- Два конденсатора по 100 нФ
- Два конденсатора 22 пФ
- Нажать кнопку
- Перемычки
- Макетная плата
- USBASP v2.0
- 2 светодиода (любого цвета)
Принципиальная электрическая схема
Мы используем OC2 для ШИМ, то есть Pin21 (PD7). Поэтому подключите один светодиод к выводу PD7 Atmega16.
Программирование Atmega16 для ШИМ
Полная программа представлена ниже. Запишите программу в Atmega16, используя JTAG и Atmel studio, и посмотрите, как на светодиодах появляется ШИМ-эффект. Его яркость будет увеличиваться и медленно уменьшаться из-за изменяющегося рабочего цикла ШИМ. Посмотрите видео, приведенное в конце.
Начните программировать Atmega16 с настройки регистра Timer2. Биты регистра Timer2 выглядят следующим образом, и мы можем соответственно устанавливать или сбрасывать биты.
Теперь мы обсудим все части Timer2, чтобы мы могли получить желаемый PWM с помощью написанной программы.
В основном регистр Timer2 состоит из четырех частей:
FOC2 (принудительное сравнение вывода для таймера 2): бит FOC2 устанавливается, когда биты WGM определяют режим без ШИМ.
WGM2 (режим генерации волны для таймера 2): эти биты управляют последовательностью счета счетчика, источником максимального (TOP) значения счетчика и используемым типом генерации сигнала.
COM2 (режим вывода сравнения для таймера 2): эти биты управляют поведением вывода. Полное описание битов поясняется ниже.
TCCR2 - = (1 <
Установите биты WGM20 и WGM21 на ВЫСОКИЙ, чтобы активировать быстрый режим ШИМ. WGM означает режим генерации сигналов. Биты выбора указаны ниже.
WGM00 |
WGM01 |
Работа в режиме Timer2 |
0 |
0 |
Нормальный режим |
0 |
1 |
CTC (сброс таймера при сопоставлении) |
1 |
0 |
ШИМ, фазовая коррекция |
1 |
1 |
Быстрый режим ШИМ |
Для получения дополнительной информации о режиме генерации сигналов вы можете обратиться к официальному техническому описанию Atmega16.
TCCR2 - = (1 <
Кроме того, мы не использовали никакого предварительного масштабирования, поэтому мы установили регистр источника синхронизации как «001».
Биты выбора часов следующие:
CS22 |
CS21 |
CS20 |
Описание |
0 |
0 |
0 |
Нет источника часов (таймер / счетчик остановлен) |
0 |
0 |
1 |
clk T2S / (без предварительного масштабирования) |
0 |
1 |
0 |
Clk T2S / 8 (от предделителя) |
0 |
1 |
1 |
Clk T2S / 32 (от предделителя) |
1 |
0 |
0 |
Clk T2S / 64 (от предделителя) |
1 |
0 |
1 |
Clk T2S / 128 (от предделителя) |
1 |
1 |
0 |
Clk T2S / 256 (от предделителя) |
1 |
1 |
1 |
Clk T2S / 1024 (от предделителя) |
Также OC2 очищается при сопоставлении путем установки бита COM21 как «1», а COM20 как «0».
Параметры выбора режима вывода сравнения (COM) для режима быстрой ШИМ приведены ниже:
COM21 |
COM21 |
Описание |
0 |
0 |
Нормальная работа порта, OC2 отключен. |
0 |
1 |
Зарезервированный |
1 |
0 |
Очистить OC2 при сопоставлении совпадений, установить OC2 в TOP |
1 |
1 |
Установите OC2 на сравнение совпадений, очистите OC2 в TOP |
Увеличьте рабочий цикл с 0% до 100%, чтобы яркость со временем увеличивалась. Возьмите значение от 0 до 255 и отправьте его на вывод OCR2.
for (duty = 0; duty <255; duty ++) // от 0 до максимального рабочего цикла { OCR2 = duty; // медленно увеличиваем яркость светодиода _delay_ms (10); }
Аналогичным образом уменьшите рабочий цикл со 100% до 0%, чтобы постепенно уменьшить яркость светодиода.
for (duty = 0; duty> 255; duty--) // рабочий цикл макс до 0 { OCR2 = duty; // медленно уменьшаем яркость светодиода _delay_ms (10); }
На этом завершается наш учебник по использованию ШИМ в Atmega16 / 32.