Найти в Дзене
Евгений Бывшев

Программирование микроконтроллеров. Часть 7

ШИМ. Мигаем светодиодом плавно

Сегодня я покажу как при помощи ШИМ можно управлять яркостью светодиода.

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

Распиновка ATmega328P:
Распиновка ATmega328P:

В микроконтроллере ATmega328P реализовано шесть каналов ШИМ. На картинке обозначены как PWM. Для этого урока я буду использовать два канала ШИМ которые подключены к 12 и 11 выводу микроконтроллера в PDIP-28P3 корпусе.

В программе Proteus я нарисовал следующую схему:

-2

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

Создал новый проект в AtmelStudio к нему подключил заголовочный файл main.h:

#ifndef MAIN_H_
#define MAIN_H_

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>

void port_ini(void);
void PWM_ini(void);

#endif

И создал еще один файл port_ini.c в который добавил следующие строки:

#include "main.h"

void port_ini(void)
{
DDRD=0xff;
}

void PWM_ini(void)
{
TCCR0A=0b10100011; //выбираем неинверсный режим шим для обоих светодиодов
TCCR0B=0b00000001; //выбираем работу таймера без предделителя тактовой
}

Код файла main.c:

#include "main.h"

int main(void)
{
port_ini();
PWM_ini();
OCR1A = 0;
while(1)
{
//увеличиваем яркость первого диода, и уменьшаем яркость второго каждые 5 мс
for(int i=0;i<256;i++)
{
OCR0A=i;
OCR0B=255-i;
_delay_ms(5);
}

//увеличиваем яркость второго диода, и уменьшаем яркость первого каждые 5 мс
for(int i=255;i>0;i--)
{
OCR0A=i;
OCR0B=255-i;
_delay_ms(5);
}
}
}

Для проверки работы кода я подключил к схеме осциллограф как показано на рисунке:

Симуляция работы схемы в программе Proteus:
Симуляция работы схемы в программе Proteus:

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

В следующем уроке я более подробно расскажу про таймеры-счетчики микроконтроллера.

Программирование микроконтроллеров:

Часть 1 Часть 2-2 Часть 2-2 Часть 3-1 Часть 3-2 Часть 4-1 Часть 4-2 Часть 5 Часть 6-1 Часть 6-2