Странное поведение analogWrite
- Войдите на сайт для отправки комментариев
Вс, 13/12/2020 - 11:43
Делаю к нг елочку с 17 RGB светодиодами. Управлять решил динамически. Пины, к которым подключены пины управления цветом - 6,5,9 (R,G,B). Написал код. Зеленый и красный управляются хорошо - мерцаний не заметно, но синий (9 пин) сильно мерцает. Примерно 3-10 мерцаний в секунду. Как это исправить?
#define TIME_UPDATE 1 // Время в миллисекундах, период таймера обновления светодиодов
unsigned long timer_1;
int pins [17] = {13, 12, 15, 14, 16, 10, 7, 8, 1, 4, 11, 0, 3, 19, 18, 17, 2};
float buf [17] [3]; // Буфер цветов светодиодов
void setup() {
setting ();
buf [5][0]=50;
buf [5][1]=50;
buf [5][2]=50;
}
void loop() {
update_LED (); // Опрашивать как можно чаще - работает на внутреннем таймере
}
void update_LED () {
if (millis () - timer_1 >= TIME_UPDATE) {
timer_1 = millis ();
static volatile int8_t counter = 0;
digitalWrite(pins[ (counter == 0) ? 16 : (counter - 1) ], 1);
analogWrite (6,buf[counter][0]);
analogWrite (5,buf[counter][1]);
analogWrite (9,buf[counter][2]);
digitalWrite(pins[counter], 0);
if (++counter >= 17) counter = 0;
}
}
void setting () {
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
digitalWrite(0, 1);
digitalWrite(1, 1);
digitalWrite(2, 1);
digitalWrite(3, 1);
digitalWrite(4, 1);
digitalWrite(5, 0);
digitalWrite(6, 0);
digitalWrite(7, 1);
digitalWrite(8, 1);
digitalWrite(9, 0);
digitalWrite(10, 1);
digitalWrite(11, 1);
digitalWrite(12, 1);
digitalWrite(13, 1);
digitalWrite(A0, 1);
digitalWrite(A1, 1);
digitalWrite(A2, 1);
digitalWrite(A3, 1);
digitalWrite(A4, 1);
digitalWrite(A5, 1);
}
Может стоит согласовать частоту переключения с частотой ШИМ? 1 кГц против 490Гц это сильно.
Но почему тогда красный и зеленый работают нормально?
Восприятие человеческого глаза.
Но почему тогда красный и зеленый работают нормально?
потому что частота шим на пинах 5 и 6 - и на пине 9 - разная
Но почему тогда красный и зеленый работают нормально?
А у Вас есть уверенность, что именно "нормально", а не мерцают на другой частоте, которую Вы не замечаете?
И потом, Вам уже явно подсказали, в чем проблема, какой смысл задавать дополнительные вопросы вместо того, чтобы внести необходимые изменения в программу и посмотреть, что будет?
Т.е. надо TIME_UPDATE перевести на микросекунды и выставить 1000000/490 = 2040 мкс?
Тут либо выбрать другой таймер с бОльшей частотой ШИМ, либо написать БЕЗ ардуины на С и настроить таймеры уже самому.
Т.е. надо TIME_UPDATE перевести на микросекунды и выставить 1000000/490 = 2040 мкс?
Нахрена так часто-то? Чего Вы этим добиться хотите? Вы знаете какие частоты обновления экрана, например, у телевизоров или мониторов?
Не так и часто получается 2040*17=34680 мкс - время одного полного обновления всех светодиодов. 1000000/34680 = 28 Гц У моего монитора частота обновления больше чем в два раза больше - 60 Гц
А вообще - проблему уже решил - поднял частоту шим на 9 пине до 976 Гц и все работает, без видимых мерцаний. Спасибо всем за ответы!
А вообще - проблему уже решил - поднял частоту шим на 9 пине до 976 Гц и все работает, без видимых мерцаний. Спасибо всем за ответы!
код еще перепиши. Процедура сеттинг - просто кровь из глаз.
Это я уже понял)))) Переписал на цикл for
Если частота шим не кратна частоте цикла - пульсации есть. Только сейчас получается около 0.1Гц, не так заметно.