Wake_me
New member
Управляю RGB светодиодной лентой через полевики с помощью ШИМ. Хотел добиться плавных медленных изменений цвета, для чего сперва использовал стороннюю библиотеку, где обнаружил баг - в определенные моменты смены светов (а именно в моменты смены направления цвета) происходит очень короткий, но заметный (особенно находясь в помещении, освещенной 10 метрами ленты) импульс в виде мгновенного небольшого изменения яркости текущего цвета.
Сначала грешил на библиотеку, но потом смоделировал проблему из стандартного простого скетча Fading. Код прилагаю.
Одно из основных условий - пониженная частота ШИМа, заданная через analogWriteFreq(150);
Чем ниже частота - тем заметнее такие периодические баги.
На частоте 1000 такие короткие вспышки сложно заметить, но если специально следить, то можно заметить, что они тоже иногда происходят.
Что самое интересное, мигание недерминированно.
Все зависит от комбинации цветов. Абсолютные значения яркости значения не имеют. Главное - их относительное изменение
Вот пример скетча, в котором вспышка у меня проявляется на каждый проход:
И ВНИМАНИЕ...
В следующем коде таких вспышек нет. Хотя что принципиально изменилось то:
P.S. Код оформляю как цитату специально, чтобы сработало выделение жирным.
Такое чувство, что какой-то баг во внутренней реализации ШИМа при определенных взаимодействиях нескольких одновременных ШИМ на разных пинах.
Сначала грешил на библиотеку, но потом смоделировал проблему из стандартного простого скетча Fading. Код прилагаю.
Одно из основных условий - пониженная частота ШИМа, заданная через analogWriteFreq(150);
Чем ниже частота - тем заметнее такие периодические баги.
На частоте 1000 такие короткие вспышки сложно заметить, но если специально следить, то можно заметить, что они тоже иногда происходят.
Что самое интересное, мигание недерминированно.
Все зависит от комбинации цветов. Абсолютные значения яркости значения не имеют. Главное - их относительное изменение
Вот пример скетча, в котором вспышка у меня проявляется на каждый проход:
Код:
#define REDPIN 4
#define GREENPIN 5
#define BLUEPIN 14
void writeRgb(int r, int g, int b){
analogWrite(REDPIN, r);
analogWrite(GREENPIN, g);
analogWrite(BLUEPIN, b);
Serial.print("R: "); Serial.print(r);
Serial.print(", G: "); Serial.print(g);
Serial.print(", B: "); Serial.println(b);
delay(1000);
}
void setup() {
Serial.begin(115200);
Serial.println("");
analogWriteFreq(150);
pinMode(REDPIN,OUTPUT);
pinMode(GREENPIN,OUTPUT);
pinMode(BLUEPIN,OUTPUT);
}
void loop() {
static int count = 1;
Serial.print("---PASS №");Serial.println(count);
writeRgb(30, 997, 30);
writeRgb(31, 998, 31);
writeRgb(32, 999, 32);
writeRgb(33, 1000, 33);
Serial.println("BLINK!");
writeRgb(34, 999, 33);
writeRgb(35, 998, 33);
writeRgb(36, 997, 33);
count++;
}
И ВНИМАНИЕ...
В следующем коде таких вспышек нет. Хотя что принципиально изменилось то:
P.S. Код оформляю как цитату специально, чтобы сработало выделение жирным.
Еще один пример, когда мелкое изменение нивелирует проявление бага:void loop() {
static int count = 1;
Serial.print("---PASS №");Serial.println(count);
writeRgb(30, 997, 30);
writeRgb(31, 998, 31);
writeRgb(32, 999, 32);
writeRgb(33, 1000, 33);
Serial.println("BLINK!");
writeRgb(34, 999, 34);
writeRgb(35, 998, 35);
writeRgb(36, 997, 36);
count++;
}
Пример, подстроенный по аналогии с первым скетчем и где вспышки есть. Но значения уже совсем другие. Хотя тут теперь редко, но случаются моменты, когда на очередном проходе вспышка не случается.void loop() {
static int count = 1;
Serial.print("---PASS №");Serial.println(count);
writeRgb(30, 997, 30);
writeRgb(31, 998, 31);
writeRgb(32, 999, 32);
writeRgb(33, 1000, 33);
Serial.println("BLINK!");
writeRgb(33, 999, 33);
writeRgb(33, 998, 33);
writeRgb(33, 997, 33);
count++;
}
А вот так уже вспышек нет, несмотря на, казалось бы, резкий скачок:void loop() {
static int count = 1;
Serial.print("---PASS №");Serial.println(count);
writeRgb(780, 10, 10);
writeRgb(781, 11, 11);
writeRgb(782, 12, 12);
writeRgb(783, 13, 13);
Serial.println("BLINK!");
writeRgb(782, 13, 14);
writeRgb(781, 13, 15);
writeRgb(780, 13, 16);
count++;
}
В общем, я никак не могу собрать в кучу все эти признаки, чтобы сделать какой-то вывод...void loop() {
static int count = 1;
Serial.print("---PASS №");Serial.println(count);
writeRgb(780, 1, 1);
writeRgb(781, 1, 1);
writeRgb(782, 1, 1);
writeRgb(783, 1, 1);
Serial.println("BLINK!");
writeRgb(782, 3, 3);
writeRgb(781, 3, 3);
writeRgb(780, 3, 3);
count++;
}
Такое чувство, что какой-то баг во внутренней реализации ШИМа при определенных взаимодействиях нескольких одновременных ШИМ на разных пинах.
Последнее редактирование: