Вэтом уроке мы увидим, как генерация PWM осуществляется с микроконтроллерами.Генерация сигналов PWM такая общая потребность, что все современные микроконтроллеры AVR,есть специализированная аппаратура для этих целей. Специализированная аппаратураустраняет нагрузку генерации сигнала PWM от программного обеспечения (такимобразом, освобождает CPU).

ВAVR микроконтролерах PWM сигналы генерируются таймером. В данной статье я дам вам основы отом, как PWM сигналы генерируются AVR таймер. Существует два способа с помощью которого можно генерировать PWM от AVR Timer0 (дляОднокристальный микроконтроллер ATmega16 и AtMega32 MCU).

 

 1.  FastPWM

  2. Phase Correct PWM

 

Мы будем использовать простейший таймер, Timer0 для генерации PWM. В этой части мыне будем иметь дело ни с каким кодом, а просто анализируем. У нас есть счетчик на 8 битов от 0-255. Это можетбыть показано на графике.

 

 

 

 

 

Период зависит от первичной настройки.Теперь для генерации PWM от этой последовательности счета используем OCR0. Мы можем хранить любое значение между 0-255 в OCR0, скажем, мы храним в 64 OCR0то, график изменится следующим образом (красная линия). 

 

 

 

 

Когда Timer0 настроен на быстрый режим PWM,то когда значение Timer0 соответствуетOCR0 то на выходе мы получаем низкое напряжение (0В),при следующем цикле все начинаетсяснова с 0 и напряжение растет до максимума (5В). Это показано на рисунке 3.  

 

 

 

 

 

Из рисунка видно, что волна скважностью 64/256 = 25% производится путем установкиOCR0 = 64. Вы можете установитьOCR0 любое значение и получить ШИМ скважностью (OCR0 / 256). Когда вы установите его в 0 выполучите 0% при установке его на 255 вы получаете 100% производительность. Таким образом, изменяя рабочего цикламожно получить аналоговый выход.  

 

Настройка Timer0 В быстром режиме PWM

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

TCCR0 - Этотрегистр используется для конфигурирования Timer0.  

Bit Нет

7

6

5

4

3

2

1

0

Имя

FOC0

WGM00

COM01

COM00

WGM01

CS02

CS01

CS00

Первоначальный Вал

0

0

1

0

0

0

0

0

(Обратитевнимание, на биты выделенные красным)

WGM

Приведеннаяниже таблица показывает различные режимы Timer0. Мы будем использовать быстыйрежим(выделен красным). 

Режим

WGM00

WGM01

Режим работы

0

0

0

Нормальный

1

0

1

PWM Фаза Правильный

2

1

0

КТК

3

1

1

Быстрый PWM

 

Дляэтого мы должны установить WGM00 = 1 и WGM01= 1

 

COM

 

Эти биты используются для установки режима вывода. Для быстрого режима PWM они могут быть: 

COM01

COM00

Output Mode

0

0

Нормальное Порт операции (OC0 отключен)

1

0

ЗАЩИЩЕНЫ

0

1

Номера Перевернутый PWM

1

1

Перевернутый PWM

 

Мы должны использоватль 3 режим вывода,тем самым устанавливаем COM01 = 0 и COM00 =1

 

CS 

Они используются для установки входной импульса для таймера. Мы ставим их следующим образом, чтобыполучить Ftimer = F_CPU.

 

  • CS02 = 0
  • CS01 = 0
  • CS00 = 1

Теперь таймер в быстрый режим PWM,чтобы изменить его выходную производительность, мы только должны установить ORC0.Например, если поставим значение в 0будет генерировать PWM с производительностью 0% (выключенное состояние) приустановке его в 128 будет генерировать 50% производительность и255 будет генерировать 100% производительность.

 

 

Пример программы.

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

 

ПРИЛОЖЕНИЯ: 
 
  Полный проект в AVR Studio