Как убедиться, что импульсы ШИМ Arduino сдвинуты по фазе?

Я хотел бы осветить свою комнату исключительно с помощью нескольких светодиодных лент RGB с использованием ШИМ Arduino (вместе со светодиодным усилителем и несколькими транзисторами).

Я хочу, чтобы Arduino управлял двумя независимыми цепочками светодиодных лент, и я хочу быть уверен, что светодиоды не мигнут одновременно, создавая очень сильный стробоскопический эффект в моей комнате.

Как задержать три контакта ШИМ Arduino на половину фазы относительно трех других?

, 👍2

Обсуждение

Как вы думаете, почему вы будете наблюдать мигание светодиода?, @Mert Gülsoy

@MertGülsoy Я не увижу мигания светодиода, но увижу стробоскопический эффект, который может вызвать мигание., @Adam Ryczkowski

Какую задержку вы имеете в виду? Несколько микросекунд? Полсекунды? Какова частота ШИМ? Каков его рабочий цикл? Какие булавки вы используете?, @Nick Gammon

@NickGammon Мне нужно сдвинуть половину фазы, поэтому, если бы я запустил PWN с частотой 32 Гц, это означало бы 1/64 секунды. Я планирую использовать стандартные контакты ШИМ, но сейчас действительно рассматриваю внешний генератор ШИМ, который мог бы дать мне гораздо более высокую, неслышимую частоту (чтобы избежать раздражающего жужжания источника питания)., @Adam Ryczkowski

Я не уверен, что понимаю здесь. Ваши глаза не заметят разницы в 1/64 секунды (или меньше). Здесь есть две цифры: частота ШИМ, которая помогает сделать светодиоды тусклыми, и скорость, с которой они мигают, которая должна быть довольно медленной, иначе вы этого не заметите., @Nick Gammon

@NickGammon Да, глаза не заметят 1/64 напрямую, но они БУДУТ замечать стробоскопический эффект этой частоты. Я говорю только о частоте ШИМ. Я никогда не писал, что хочу, чтобы мои светодиоды мигали., @Adam Ryczkowski

Вы упомянули: «Я хочу сделать так, чтобы светодиоды не мигали одновременно». Значит в вопросе есть отсылка к морганию светодиодов. Теперь мне немного любопытно, почему вы хотите использовать ШИМ на частоте 32 Гц. Почему бы не, скажем, 7813 Гц? Я хотел бы ответить на вопрос, но я хочу убедиться, что отвечаю на правильный вопрос. :), @Nick Gammon

@NickGammon Большое спасибо. Я очень ценю ваши усилия. Возможно, мой английский не идеален, это не мой родной язык. Я хочу просто заменить традиционное освещение комнаты светодиодами RGB., @Adam Ryczkowski

С английским у тебя все в порядке, я просто пытаюсь понять требования. Есть ли какая-то конкретная причина, по которой частота должна быть такой низкой, как вы упомянули выше? (32 Гц) И вообще, зачем две полоски? Будут ли они находиться на разных уровнях? Например. один яркий и один тусклый?, @Nick Gammon

@Nick Две полоски — это абсолютный минимум для приемлемой яркости. Они будут смонтированы вместе. Светодиоды RGB не слишком яркие... Извините, я хотел написать 32кГц, а не Гц, я виноват., @Adam Ryczkowski

Вы можете увидеть влияние частоты сети на светодиоды при некоторых условиях. Раньше у меня было зарядное устройство для самолета на радиоуправлении с двухцветным светодиодом, который был зеленым для одного аккумуляторного блока, красным для другого и желтым для обоих. Янтарный цвет был почти неотличим от красного, но я обнаружил, что если покачать головой, то смогу увидеть в нем отчетливые оттенки красного и зеленого. Я также заметил, что цифры моих светодиодных часов «плавали», когда я играл на трубе низкие ноты (позже мне пришлось заменить конденсатор питания в этих часах — я подозреваю, что они медленно выходили из строя в течение многих лет, позволяя линейной частоте модулировать Яркость светодиода), @Chris Stratton

Вы действительно наблюдали этот стробоскопический эффект?, @esoterik


2 ответа


Лучший ответ:

5

Этот (короткий) код ниже позволит достичь того, о чем вы просите, на Atmega328 (например, Uno, Duemilanove и т. д.).

byte dutyCycle = 80;

void setup() 
 {
  pinMode (3, OUTPUT);    // Выход таймера 2 «B»: OC2B
  pinMode (11, OUTPUT);   // Выход таймера 2 «A»: OC2A

  // Установите OC2A на сравнение совпадений при восходящем счете.
  // Очистка OC2B при сравнении совпадений при восходящем счете.
  TCCR2A = bit (WGM20) | bit (COM2B1) | bit (COM2A1) | bit (COM2A0);       
  TCCR2B = bit (CS21);         // фазовая коррекция ШИМ, прескалер 8
  OCR2A = dutyCycle;           // рабочий цикл из 255
  OCR2B = 255 - dutyCycle;     // рабочий цикл из 255
  }  // конец настройки

void loop() { }

Как это работает

В коде используется Таймер 2 (8-битный таймер) для счета до 255 в режиме ШИМ с фазовой коррекцией. Выходы — OC2A (выход «А» — контакт D11) и OC2B ( выход «В» — контакт D3). Рабочий цикл находится в переменнойdutyCycle, которая должна находиться в диапазоне от 0 до 255. Таймер считает до 255 и устанавливает OC2A при сравнении, равном номеруdutyCycle, а также очищает OC2B при сравнении-равном при обратном подсчете . Вторая половина цикла фазовой коррекции делает обратное. Таким образом, два цикла находятся в противоположной фазе.

Частота

Частота таймера 3,9 кГц. Это потому, что таймер имеет прескалер на 8, затем он считает до 255, а затем делает два цикла за период (один вверх, один вниз):

16000000 / 8 / 255 / 2 = 3921.56 Hz

Как отметил Эдгар Боне в комментариях, подсчет ШИМ с фазовой коррекцией не является нулевым относительно нуля, в отличие от других режимов подсчета. Таким образом, чтобы определить частоту, вы делите на 255, а не на 256.

Вы можете выбрать другие частоты, выбрав другие прескалеры.

Доказательство работы

На экране осциллографа показаны два выхода, сдвинутые по фазе друг с другом на 50%.

Выход таймера

Из измерения курсора в кружке видно, что вывод OC2B отключен ровно на требуемый рабочий цикл (80 мкс).

 1/ 16000000 * 80 * 8 * 2 = 8e-005 (0.00008)  --> 80 µs
,

Придирки: счетчик не считает до 256: останавливается на 255. Его частота, согласно даташиту, 16 МГц ÷ (8×510) = 3921,57 Гц., @Edgar Bonet

*ворчит* - В режимах без ШИМ счет нуля дает вам один цикл, однако наблюдаемые результаты (на скриншоте выше), похоже, согласуются с вашей оценкой. Надо признать, что 80 мкс на экране показались немного низкими. Кстати, счетчик обычно отсчитывается от нуля, поэтому счет 255 равен 256 циклам., @Nick Gammon

Это особенность ШИМ с фазовой коррекцией: для подсчета от 0 до 255 требуется 255 (предварительно масштабированных) циклов, а затем 255 циклов, чтобы вернуться к нулю. Напротив, как обычный подсчет (режим 0), так и быстрый ШИМ (режим 3) имеют период 256 циклов: 255 циклов для обратного счета, а затем один дополнительный цикл для отката до нуля., @Edgar Bonet

@EdgarBonet - спасибо за исправление, я исправил ответ., @Nick Gammon


0

Почему бы не поставить в цепь конденсатор (и токоограничивающий резистор) для каждого цвета каждого светодиода? (Выходной сигнал Arduino сначала будет подключен к токоограничивающему резистору, значение которого выбрано для ограничения максимального тока на светодиоде, как обычно. Затем небольшой конденсатор между сигнальной линией и землей.) Это усреднит выходной сигнал и измените выходной сигнал прямоугольной формы на выход постоянного тока (с изрядной пульсацией). Пульсации не должны иметь значения, но светодиоды не выключатся полностью, поэтому стробоскопический эффект должен быть практически устранен, а очевидный яркость каждого выхода должна быть одинаковой.

Тогда вы сможете использовать немодифицированный ШИМ и вам не придется возиться с таймерами на вашем Arduino (что влияет на другие вещи, помимо ШИМ.)

,

Это очень плохая идея. Установка конденсатора в сигнал ШИМ убивает эффект затемнения - свет остается включенным для большинства настроек затемнения и создает очень высокую нагрузку на драйвер, особенно при настройках низкой освещенности. Драйвер будет отчаянно пытаться сохранить заряд конденсатора, обеспечивая все более высокий зарядный ток во время более короткой фазы включения (из-за затемнения)., @Adam Ryczkowski

Я только что отредактировал свой ответ, добавив, что вам также понадобится резистор, ограничивающий ток. Если вы ограничите максимальный ток конденсатора максимальным током светодиода, то уменьшение рабочего цикла ШИМ должно снизить среднее напряжение, выходящее из конденсатора., @Duncan C

Токоограничивающий резистор – это всего лишь резистор, который будет ограничивать ток посредством потребления. Что-то мне подсказывает, что для получения заметного эффекта затемнения нужен такой резистор, который бы существенно снижал напряжение на светодиодах. Вы действительно пробовали то, что предлагаете?, @Adam Ryczkowski

Нет, вы неправильно понимаете. Поставьте токоограничивающий резистор ПЕРЕД конденсатором. Токоограничивающий резистор будет ограничивать максимальный ток, вытекающий из выходного контакта, до максимального тока включения светодиода. Тогда любой рабочий цикл ШИМ ниже 100% будет дополнительно ограничивать средний ток, протекающий в конденсатор, что должно уменьшить яркость светодиода и создать (по общему признанию, шумное) устойчивое напряжение на светодиоде, практически устраняя эффект стробирования., @Duncan C

И нет, токоограничивающие резисторы не «ограничивают ток посредством потребления». Они снижают **напряжение** за счет выделения тепла (потребления). Они также ограничивают общий ток в цепи, как описано законом Ома., @Duncan C

Конкретно это приложение я не пробовал, но это простой RC-фильтр., @Duncan C