Преобразование случайных двоичных данных в сигнал ШИМ

Я использую Arduino Due. Я делаю проект по связи в видимом свете. Мне нужно преобразовать двоичные данные в сигнал ШИМ. Может ли кто-нибудь предложить мне метод генерации этого сигнала ШИМ на основе предоставленных двоичных данных?

Спасибо.

, 👍0


3 ответа


1

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

,

2

Итак, если вам просто нужно преобразовать двоичные данные в сигнал ШИМ, вам нужно учесть несколько вещей:

  1. Если двоичные данные, которые вы получаете от датчика, являются линейными или нелинейными.

  2. Каков размер двоичного байта. Пример: int (16 бит), char (8 бит), long (32 бита).

  3. Если он линейный, то если данные умножить на какое-то число, будет выведено значение от 0 до 255.

  4. Если данные нелинейны, вам просто нужно создать гигантский массив со значением интенсивности ШИМ напрямую, без какой-либо конкретной математической функции. Пример: массив[1024] = {0,1,1,2,3,4,5,5,6,6,10,9,...}; (1024 значения, потому что если вы используете аналоговый ввод. Тогда вы можете напрямую выводить значения из массива:

    analogWrite(3,array[x]); //x — ваши данные
    

Вот линейный пример:

   //map(value, fromLow, fromHigh, toLow, toHigh);
    y = map(x, 0, 1023, 0, 255);

При этом y получит значение от 0 до 255. Вам просто нужно сначала выполнить простую последовательную программу, которая распечатает вам через последовательное окно Arduino двоичные данные и посмотрите, увеличиваются или уменьшаются данные в соответствии с вашим легким проектом.< /п>

  • Я не знаю о ваших уровнях программирования и о том, используете ли вы цифровой датчик или аналоговый датчик, но если вы используете цифровой датчик, то, вероятно, вы используете связь SPI или i2c. Затем вам просто нужно прочитать эти двоичные данные и определить, где находятся биты значений, с помощью побитовых манипуляций.

    y=(x & (0xfff<<3))>>3;
    

Расскажите мне больше об источнике данных, о том, что это за данные и как они ведут себя, чтобы я мог вам больше помочь. Спасибо

,

1

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

  • Кен Ширрифф. "Многопротокольная инфракрасная удаленная библиотека для Arduino".
  • A1RONZO в Sparkfun. "Учебное пособие по ИК-коммуникациям"
  • Дэйв. "EEVblog #506 — Учебное пособие по протоколу Arduino с ИК-пультом дистанционного управления"
  • "Многозадачная ИК-передача"
  • "Универсальный пульт Arduino" (имеет двустороннюю связь, как отправку, так и прием)
  • "Теория ИК-дистанционного управления" (ссылки на множество различных "стандартных" инфракрасных протоколов)

Практически все эти системы преобразуют произвольные двоичные данные в структурированные «кадры» или «пакеты» информации, включая своего рода контрольную сумму. Каждый пакет повторяется несколько раз; надеюсь, получатель поймает хотя бы один из них. Каждый бит пакета расширяется либо до «шаблона, представляющего 0 бит» (обычно светодиод выключается на весь бит), либо до «шаблона, представляющего 1 бит» (обычно светодиод мигает с частотой 38 кГц на весь бит). время, обычно с использованием ШИМ).

Чтобы сделать аппаратное и программное обеспечение проще и дешевле, большинство этих систем передают всего несколько десятков бит в секунду. Некоторые системы оптической связи в свободном пространстве предназначены для работы намного быстрее, например RONJA.

,