Программирование микроконтроллеров. Часть 7
ШИМ. Мигаем светодиодом плавно
И снова здравствуйте! Сегодня я покажу как при помощи ШИМ можно управлять яркостью светодиода.
Широтно-импульсная модуляция (ШИМ, англ. pulse-width modulation (PWM)) — процесс управления мощностью, подводимой к нагрузке, путём изменения скважности импульсов, при постоянной частоте.
Распиновка ATmega328P:
Картинка взята здесь
В микроконтроллере ATmega328P реализовано шесть каналов ШИМ. На картинке обозначены как PWM. Для этого урока я буду использовать два канала ШИМ которые подключены к 12 и 11 выводу микроконтроллера в PDIP-28P3 корпусе.
В программе Proteus я нарисовал следующую схему:
Я подключил сразу два светодиода, яркость первого светодиода будет увеличиваться, а второго уменьшаться и наоборот.
Создал новый проект в 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 не может отобразить плавного свечения светодиодов, поэтому они хаотично мигают. Но если собрать эту схему в железе, то светодиоды будут плавно менять свою яркость.
В следующем уроке я более подробно расскажу про таймеры-счетчики микроконтроллера.
Если есть вопросы и предложения по этому уроку, пишите комментарии буду рад ответить на ваши вопросы.
Часть 1
Часть 2-1 Часть 2-2
Часть 3-1 Часть 3-2
Часть 4-1 Часть 4-2
Часть 5
Часть 6-1 Часть 6-2