Регулятор силы свечения светодиода на микроконтроллере AVR ATmega32

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

Регулятор силы свечения светодиода на микроконтроллере AVR ATmega32: внешний вид устройства

Общий принцип управления яркостью свечения

Управляя скоростью модуляции ШИМ (Pulse Width Modulation, PWM) можно регулировать силу свечения светодиода – данный принцип пояснен на следующем рисунке.

Общий принцип управления яркостью свечения светодиода с момощью ШИМ

Если на представленном рисунке выключатель будет замкнут на протяжении некоторого времени, то на протяжении этого же времени лампочка будет гореть. Если переключатель будет замкнут в течение 8ms и будет разомкнут 2ms в течение интервала 10ms, тогда лампочка будет гореть только в течение интервала 8ms. В рассмотренном примере можно сказать, что среднее выходное напряжение (на лампочке) будет составлять 80% от напряжения батареи.

В другом случае выключатель замыкается на 5ms и размыкается на эти же самые 5ms в течение интервала 10ms, таким образом среднее напряжение на лампочке будет составлять 50% от напряжения батареи. Принято говорить, что если напряжение батареи 5В и цикл занятости составляет 50%, то среднее напряжение на оконечном устройстве (лампочке) будет составлять 2.5В.

В третьем рассмотренном на рисунке случае цикл занятости составляет 20% и поэтому среднее напряжение на оконечном устройстве (лампочке) будет составлять 20% от напряжения батареи.

В микроконтроллере ATmega32 мы имеем четыре ШИМ канала (PWM channels), которые обозначаются как OC0, OC1A, OC1B и OC2. В нашей схеме мы будем использовать канал OC0 для изменения яркости свечения светодиода.

Необходимые компоненты

Аппаратное обеспечение

Микроконтроллер ATmega32
Источник питания с напряжением 5 Вольт
Программатор AVR-ISP или
Конденсатор на 100 мкФ,
Светодиод на 1 Ватт
Транзистор TIP127
Кнопки (2 шт.)
Конденсатор на 100 нФ (104) (2 шт),
Резисторы на 100 Ом and 1 кОм (2 шт).

Программное обеспечение

Atmel Studio версии 6.1 (или выше)
Progisp или flash magic (необязательно)

Принцип работы схемы

Рассматриваемая схема устройства регулирования силы свечения светодиода на микроконтроллере AVR ATmega32 приведена на следующем рисунке.

Схема устройства регулирования силы свечения светодиода на микроконтроллере AVR ATmega32

В микроконтроллере ATmega32 четыре ШИМ (PWM) канала используются на четырех контактах. Мы можем использовать только выход ШИМ на этих контактах. Поскольку мы решили использовать PWM0 (8-битный канал) мы должны использовать ШИМ сигнал с контакта OC0 (PORTB 3-й контакт). Как можно видеть из схемы, мы соединяем базу транзистора к контакту OC0 микроконтроллера чтобы управлять мощным светодиодом.

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

В микроконтроллерах ATmega есть два способа генерации ШИМ:

  1. Фазовая (правильная) ШИМ.
  2. Быстрая ШИМ.

Мы будем использовать более простой способ – быстрый метод формирования ШИМ.

Сначала необходимо выбрать частоту ШИМ, которая будет зависеть от используемого приложения (применения). Для светодиода эта частота должна быть не менее 50 Гц. Мы выберем частоту счетчика времени 1 МГц. Теперь чтобы получить быструю ШИМ 50 Гц на микроконтроллере ATmega, мы должны задействовать соответствующие биты в регистре TCCR0 – это единственный регистр, который нам будет нужен для получения 8 битной быстрой ШИМ.

Регистр TCCR0 микроконтроллера ATmega32

На представленном рисунке:

1. CS00, CS01, CS02 (выделены желтым цветом) – выбирают prescalar (предварительное масштабирование) для выбора частоты временного интервала. Таблица для соответствующих prescalar показана на рисунке ниже. Таким образом, для предварительного масштабирования, равного 1, oscillator clock=counter clock (шкала осциллятора равна шкале счетчика). То есть установим CS00=1, остальным двум битам установим нулевые значения.

Установка битов CS00, CS01, CS02 регистра TCCR0

2. Биты WGM01 и WGM00 изменяют чтобы выбрать нужный режим генерации формы сигнала. Исходя из необходимых нам параметров (быстрая ШИМ – Fast PWM) по таблице, представленной на следующем рисунке, выбираем WGM00=1 и WGM01=1.

Установка битов WGM01 и WGM00 регистра TCCR0

3. Теперь мы знаем, что ШИМ – это сигнал с различными интервалами ON и OFF сигнала (различными продолжительностями включения). Для получения различных продолжительностей включения (отношение длительности импульса к периоду повторения) нам необходимо выбрать значение между 0 и 255 (от 0 до 2^8 поскольку мы используем 8 битную ШИМ). Допустим мы выбрали значение 180, это значит что счетчик начинает счет от 0 и когда он достигает значения 180, то отклик на выходе может быть приведен в действие (запустится триггер). Этот триггер может быть инвертирующим и неинвертирующим. То есть выход можно сконфигурировать так, чтобы по достижении счетчиком заданного значения он либо опускал фронт импульса, либо поднимал его. Этот выбор производится с помощью установки битов CM00 и CM01 (выделены зеленым цветом на рисунке выше).

Как показано в следующей таблице, с помощью установки этих битов можно выбрать режим как с инвертированием, так и без инвертирования. Мы выберем режим с инвертированием, таким образом установим эти биты в COM00=1 и COM01=1.

Установка битов CM00 и CM01 регистра TCCR0

За установку того самого значения, которое задает различные продолжительности включения (отношение длительности импульса к периоду повторения), в микроконтроллере ATmega32 отвечает байт OCR0 (Output Compare Register 0) – в нем сохраняется нужное нам значение от 0 до 255. Пример выбранного нами режима инвертирования показан на рисунке ниже. Таким образом, если мы запишем в OCR0=180, то контроллер будет изменять уровень сигнала на выходе когда счетчик досчитает до 180 (начиная с 0).

Регулировка параметров ШИМ с помощью значения байта OCR0

Если необходимо будет изменить яркость свечения светодиода, то тогда в байт OCR0 следует записать другое число (вместо 180). В представленной схеме присутствуют 2 кнопки. Одна кнопка служит для увеличения числа в байте OCR0 (увеличение яркости свечения), а другая – для уменьшения числа в байте OCR0 (уменьшение яркости свечения).

Исходный код программы на языке C (Си)

Программа для рассматриваемой схемы представлена следующим фрагментом кода на языке C (Си).

// C Code for ATmega32 Microcontroller PWM
#include <avr/io.h>
#define F_CPU 1000000UL
#include <util/delay.h>
int main(void)
{
DDRD = 0;
DDRB = 0xFF;
TCCR0 |=(1<<WGM00)|(1<<WGM01)|(1<<COM00)|(1<<COM01)|(1<<CS00);
OCR0 = 0;
while(1)
{
if (bit_is_clear(PIND,5))
{
if (OCR0<255)
{
OCR0++;
}
_delay_ms(50);
}
if (bit_is_clear(PIND,6))
{
if (OCR0>0)
{
OCR0--;
}
_delay_ms(50);
}
}
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
122 просмотров


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

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