Странное поведение 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Гц, не так заметно.