Решил начать изучение микроконтроллеров и написать первый проект. Сейчас схема довольно простая к 6 ножкам порта B подключены резисторы и светодиоды.
Реализация программного ШИМ на 6 каналов. (планирую сотворить контроллер RGB ленты на 2 канала с внешним управлением)
На текущий момент проблема в том, что частота включения шим очень маленькая, мерцание светодиодов заметно глазу. Не могу понять причину.
Контроллер настроен на частоту от внутреннего генератора на 8MHz, таймер запущен без делителя. То есть должно быть 8000000Mhz/255(тиков до переполнения таймера) = 31372 срабатываний таймера в секунду. Каждая нога, в данном случае у меня ch1_red, ch1_green, ch1_blue, ch2_red, ch2_green, ch2_blue имеет свой, пока жестко закрепленный порог срабатывания. описанный переменными ch1_light_red, ch1_light_green, ch1_light_blue,ch2_light_red, ch2_light_green, ch2_light_blue.
Сам код:
Код: Выделить всё
#define F_CPU 8000000 /*устанавливаем частоту микроконтроллера*/
#include <avr/io.h> /*подключаем библиотеку контроллера*/
#include <avr/interrupt.h> /* подключаем библиотеку прерываний*/
#define ch1_dir DDRB /*устанавливаем первый канал*/
#define ch1 PORTB
#define ch1_red PB2
#define ch1_green PB1
#define ch1_blue PB0
#define ch2_dir DDRB /*устанавливаем второй канал*/
#define ch2 PORTB
#define ch2_red PB5
#define ch2_green PB4
#define ch2_blue PB3
char counter=0; /*счетчик прерываний*/
uint8_t ch1_light_red = 50;
uint8_t ch1_light_green = 150;
uint8_t ch1_light_blue = 200;
uint8_t ch2_light_red = 200;
uint8_t ch2_light_green = 150;
uint8_t ch2_light_blue = 50;
ISR(TIMER0_OVF_vect)
{
if (++counter==0)
{
ch1 |=(1<<ch1_red)|(1<<ch1_green)|(1<<ch1_blue);
ch2 |=(1<<ch2_red)|(1<<ch2_green)|(1<<ch2_blue);
}
if (counter==ch1_light_red) ch1 &=~(1<<ch1_red);
if (counter==ch1_light_green) ch1 &=~(1<<ch1_green);
if (counter==ch1_light_blue) ch1 &=~(1<<ch1_blue);
if (counter==ch2_light_red) ch2 &=~(1<<ch2_red);
if (counter==ch2_light_green) ch2 &=~(1<<ch2_green);
if (counter==ch2_light_blue) ch2 &=~(1<<ch2_blue);
}
void initialization() /*инициализация программы*/
{
ch1_dir |=(1<<ch1_red)|(1<<ch1_green)|(1<<ch1_blue);
ch2_dir |=(1<<ch2_red)|(1<<ch2_green)|(1<<ch2_blue);
TCCR0A = 0b00000000;
TCCR0B |=(1<<CS00); /*clkI/O/(No prescaling) таймер без делителя*/
TIMSK |=(1<<TOIE0); /*разрешаем прерывание по перевыполнению*/
sei(); /*разрешаем глобальные прерывания*/
}
int main(void)
{
initialization();
while(1)
{
}
}
Никак не могу понять с чем связано заметное мерцание.
Ссылка на youtube:
https://youtu.be/JseHw6jMewM
[youtube]https://youtu.be/JseHw6jMewM[/youtube]
З.Ы. И как тут вставлять видео?




