Уважаемые пользователи Голос!
Сайт доступен в режиме «чтение» до сентября 2020 года. Операции с токенами Golos, Cyber можно проводить, используя альтернативные клиенты или через эксплорер Cyberway. Подробности здесь: https://golos.io/@goloscore/operacii-s-tokenami-golos-cyber-1594822432061
С уважением, команда “Голос”
GOLOS
RU
EN
UA
evgenij-byvshev
7 лет назад

Программирование микроконтроллеров. Часть 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

26
769.402 GOLOS
На Golos с February 2017
Комментарии (1)
Сортировать по:
Сначала старые