ARDUINO Не работают должным образом PWM порты на Arduino Mega

Daminski

✩✩✩✩✩✩✩
26 Май 2021
23
1
Приветствую! Столкнулся недавно с такой проблемой - не работают элементарнейшие функции PWM для включения двух и более светодиодов одновременно. Не понимаю в чём дело и как заставить Ардуино работать нормально. Ранее все выходы PWM работали нормально и каждому отдельному светодиоду можно было назначить разную яркость одновременно. А сейчас если я обозначаю в программе два светодиода, независимо от порта, по факту включается только один.

Если обоим задать одинаковую яркость, тогда включатся оба. А если поменять значение на одном из них на единицу больше или меньше, то всё, этот один перестанет работать. Код прикреплю ниже, он реально элементарнейший, но не работает. Если задавать нижнему (LED_white) светодиоду яркость выше, чем верхнему (LED_blue), то почему-то LED_blue начинает работать на той яркости, которая была задана LED_white. А этот самый LED_white в свою очередь не работает совсем. Это ну очень странно...

Однажды мне при загрузке скетча выдало вот такую ошибку:

java.io.IOException: jssc.SerialPortException: Port name - COM5; Method name - setEventsMask(); Exception type - Can't set mask.
at processing.app.Serial.dispose(Serial.java:166)
at processing.app.SerialMonitor.close(SerialMonitor.java:145)
at processing.app.AbstractMonitor.suspend(AbstractMonitor.java:113)
at processing.app.Editor$UploadHandler.run(Editor.java:2041)
at java.lang.Thread.run(Thread.java:748)
Caused by: jssc.SerialPortException: Port name - COM5; Method name - setEventsMask(); Exception type - Can't set mask.
at jssc.SerialPort.setEventsMask(SerialPort.java:279)
at jssc.SerialPort.removeEventListener(SerialPort.java:1064)
at jssc.SerialPort.closePort(SerialPort.java:1090)
at processing.app.Serial.dispose(Serial.java:163)
... 4 more

Также возможно этому предшествовало то, что раньше я подключал дисплей Nextion через порт Serial2. Именно при работе с ним, в коде, я заметил, что функция analogWrite() не работает. А когда написал код для светодиодов отдельно, то и вовсе в этом убедился. То есть если в коде используется более одной команды analogWrite(), вторая и последующие не работают. Ещё хочу заметить, что через функцию digitalWrite() все PWM порты работают. В чём может быть проблема? Может плата физически как-то подпортилась?

код:
C++:
int LED_blue = 2; //синий
int LED_white = 3;//белый

void setup() {
pinMode(LED_blue, OUTPUT);
pinMode(LED_white, OUTPUT);

}

void loop() {
analogWrite(LED_blue, 10);
analogWrite(LED_white, 2);

}
 

poty

★★★★★★✩
19 Фев 2020
3,480
994
А задержку в loop не пробовали ставить?
 

bort707

★★★★★★✩
21 Сен 2020
3,219
941
@Daminski, при значениях 2 и 10 в analogWrite() ни один из светодиодов и не должен светится.
Во вторых, перепищите код вот так и попробуйте:
C++:
int LED_blue = 2; //синий
int LED_white = 3;//белый

void setup() {
analogWrite(LED_blue, 100);
analogWrite(LED_white, 200);

}

void loop() {
}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
601
178
@Daminski,
Какая у вас версия IDE? На некоторых версиях (например 1.8.12) неправильно компилировался код для PWM на 2560. На 1.8.13 у меня работает без ошибок.
 

Daminski

✩✩✩✩✩✩✩
26 Май 2021
23
1
@Daminski, при значениях 2 и 10 в analogWrite() ни один из светодиодов и не должен светится.
Во вторых, перепищите код вот так и попробуйте:
Они должны светиться, даже если в analogWrite() указано значение "1", просто это будет очень-очень тускло. Я пробовал и "120" ставить, не работало.
 

Daminski

✩✩✩✩✩✩✩
26 Май 2021
23
1
Какая у вас версия IDE? На некоторых версиях (например 1.8.12) неправильно компилировался код для PWM на 2560. На 1.8.13 у меня работает без ошибок.
Воистину, так оно и получилось, спасибо за подсказку! Хоть я и на час раньше нашел ответ на свой вопрос прежде чем зашел сюда на форум. Уже чтобы описать решение.

Я использовал Arduino IDE 1.8.12 и как оказалось это глючная версия для Arduino Mega 2560. Нашел на одном форуме вопрос с точно такой же проблемой и там указали что нужно дописать чтобы всё заработало. Код с дополнительной строчкой приведу ниже.

Решение нашел здесь https://question-it.com/questions/8...vuh-posledovatelnyh-obraschenij-k-analogwrite

А тут более подробно обсуждали данную проблему https://github.com/arduino/ArduinoCore-avr/issues/339
Я не знаю что означает эта строчка, но я рад, что с ней нормально заработали светодиоды на разных яркостях.
Или ещё как вариант - обновить IDE до более старших версий. Сейчас я поставил Arduino IDE 2.0.0 beta 12 и всё заработало с первого раза без дополнительной строчки кода.

код:
int LED_blue = 6; //синий
int LED_white = 7;//белый

void setup() {
pinMode(LED_blue, OUTPUT);
pinMode(LED_white, OUTPUT);
}

void loop() {
analogWrite(LED_blue, 180);
analogWrite(LED_white, 5);
}

//void setup() attribute((optimize("-O1"))); //без этой строчки в принципе работает
void loop() attribute((optimize("-O1"))); //без этой строчки один светодиод не работает. А с ней работают все и на нужной (настроенной выше) яркости