Чтение аналогового значения при генерации сигнала ШИМ

Я пытаюсь одновременно сгенерировать яркость двух светодиодных лент, генерируя два сигнала ШИМ на основе значения потенциометра. Горшок определяет, насколько яркой будет каждая светодиодная лента. Для этого я использую Arduino Pro Micro с чипом Atmel 32u4.

схема

Я использую следующий код:

int sensorValue = 0;
int outputValue = 0;

void setup() {
}

void loop() {
  sensorValue = analogRead(A0);

  outputValue = map(sensorValue, 0, 1023, 0, 255);
  analogWrite(5, outputValue);
  analogWrite(6, 255 - outputValue);

  delay(2);
}

Проблема в том, что analogRead никогда не возвращает 1023, когда горшок полностью открыт. Значение всегда около 980. Само по себе это не имеет большого значения.

Основная проблема заключается в том, что analogRead невероятно шумен. Значение, возвращаемое для максимальной позиции, находится в диапазоне [940–1020].

Когда я не использую analogWrite для генерации ШИМ, проблема исчезает, и входной сигнал кристально чист в диапазоне [0-1023], как и ожидалось.

Я пытался отключить ШИМ перед считыванием значения, но это вызывает мерцание, поскольку светодиоды временно выключены.

Есть ли какое-либо аппаратное или программное решение этой проблемы? Я не против написать какую-нибудь сборку, если потребуется.

, 👍0

Обсуждение

Похоже на колебания мощности, вызванные переключением светодиодов. Добавьте несколько больших конденсаторов по линии питания рядом со светодиодами., @Majenko

Вы проверили свой источник питания? Если это импульсный источник, вы можете добавить несколько конденсаторов, чтобы нейтрализовать пульсации. Я предлагаю вам использовать прицел. Если у вас нет прицела, просто подключите источник напряжения к A1 и аналоговому считыванию (A1)., @RubenDefour

Попробуйте добавить некоторую задержку, скажем, пробуйте банк всего 10 или 20 раз в секунду вместо примерно 500 раз в секунду, которые ваш код делал бы сейчас. Это дает выходам ШИМ возможность работать, а не постоянно получать новые значения для использования., @CrossRoads

@Маженко, это была проблема с источником питания. Это светодиодная лента USB, поэтому я запитал ее через Arduino, что, как оказалось, было плохой идеей., @jnovacho


1 ответ


1

Проблема связана с источником питания. Это светодиодная лента USB, поэтому я запитал ее через Arduino, что, как оказалось, было плохой идеей.

Когда я добавил в схему внешний источник питания, все стало работать правильно.

,