Странное поведение analogWrite

Савелий
Offline
Зарегистрирован: 26.10.2019

Делаю к нг елочку с 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);
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

Может стоит согласовать частоту переключения с частотой ШИМ? 1 кГц против 490Гц это сильно.

Савелий
Offline
Зарегистрирован: 26.10.2019

Но почему тогда красный и зеленый работают нормально?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Восприятие человеческого глаза. 

b707
Offline
Зарегистрирован: 26.05.2017

Савелий пишет:

Но почему тогда красный и зеленый работают нормально?


потому что частота шим на пинах 5 и 6 - и на пине 9 - разная

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Савелий пишет:

Но почему тогда красный и зеленый работают нормально?

А у Вас есть уверенность, что именно "нормально", а не мерцают на другой частоте, которую Вы не замечаете?

И потом, Вам уже явно подсказали, в чем проблема, какой смысл задавать дополнительные вопросы вместо того, чтобы внести необходимые изменения в программу и посмотреть, что будет?

Савелий
Offline
Зарегистрирован: 26.10.2019

Т.е. надо TIME_UPDATE перевести на микросекунды и выставить 1000000/490 = 2040 мкс?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:
какой смысл задавать дополнительные вопросы
А поговорить?

-NMi-
Offline
Зарегистрирован: 20.08.2018

Тут либо выбрать другой таймер с бОльшей частотой ШИМ, либо написать БЕЗ ардуины на С и настроить таймеры уже самому.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Савелий пишет:

Т.е. надо TIME_UPDATE перевести на микросекунды и выставить 1000000/490 = 2040 мкс?

Нахрена так часто-то? Чего Вы этим добиться хотите? Вы знаете какие частоты обновления экрана, например, у телевизоров или мониторов?

Савелий
Offline
Зарегистрирован: 26.10.2019

Не так и часто получается 2040*17=34680 мкс - время одного полного обновления всех светодиодов. 1000000/34680 = 28 Гц У моего монитора частота обновления больше чем в два раза больше - 60 Гц

Савелий
Offline
Зарегистрирован: 26.10.2019

А вообще - проблему уже решил - поднял частоту шим на 9 пине до 976 Гц и все работает, без видимых мерцаний. Спасибо всем за ответы!

b707
Offline
Зарегистрирован: 26.05.2017

Савелий пишет:

А вообще - проблему уже решил - поднял частоту шим на 9 пине до 976 Гц и все работает, без видимых мерцаний. Спасибо всем за ответы!


код еще перепиши. Процедура сеттинг - просто кровь из глаз.

Савелий
Offline
Зарегистрирован: 26.10.2019

Это я уже понял)))) Переписал на цикл for

rkit
Offline
Зарегистрирован: 23.11.2016

Если частота шим не кратна частоте цикла - пульсации есть. Только сейчас получается около 0.1Гц, не так заметно.