Генератор импульсов различной ширины

Я пытаюсь создать прямоугольный импульс с фиксированной задержкой в 5 секунд между импульсами и переменной шириной импульса. Код, который я написал до сих пор, генерирует последовательность импульсов каждые 5 секунд. Можно ли вместо этого генерировать один импульс (с различной шириной) каждые 5 секунд? Не могли бы вы помочь мне с этим?

const int pin =  11;

int i  = 0; 

void setup() {
    Serial.begin(9600);
    pinMode(pin, OUTPUT);
}

void loop() {
    i = random(0 , 255);
    analogWrite(pin, i); // включить светодиод
    delay(5000);
}

, 👍0

Обсуждение

используйте digitalWrite и установите контакт ВЫСОКИЙ на желаемую продолжительность, @Juraj

AnalogWrite генерирует серию импульсов с переменным рабочим циклом. Если вам нужен только один импульс, вам, вероятно, следует написать код вручную. Какой диапазон ширины импульса вам нужен, и с какой точностью?, @Duncan C

Как уже говорили другие, вы можете использовать digitalWrite() и функцию millis(), чтобы получить приличную точность и аккуратность. Если вам нужна более высокая точность и аккуратность, вы можете переключиться на использование регистров порта для прямого управления выводом. Это значительно быстрее, чем функция digitalWrite(), так что вы можете сделать свое время более точным. И если вам нужна точность менее миллисекунды, вы можете использовать функцию micros() для вашего времени., @Duncan C

Спасибо за ваши ответы и предложения. Я пытаюсь синхронизировать две нейронные системы записи. Поэтому я пытаюсь генерировать эти импульсы с различной шириной и фиксированным временем, чтобы я мог выровнять их позже в автономном режиме, чтобы установить правильное время смещения при анализе данных. Я имел в виду ширину импульса (5-500) мс., @Kasia


1 ответ


4

Просто, но не совсем точно:

  • Включить индикатор
  • Задержка на величину ширины импульса (например, 20)
  • Отключить индикатор
  • Задержка 5000 мс — длительность импульса (20), в данном примере 4980 мс.

Однако, поскольку включение/выключение светодиода также требует некоторого времени, это займет чуть больше 20 + 4980 = 5000 мс.

Так лучше:

  • Установите время в переменной (используйте функцию millis).
  • Включить индикатор
  • Подождите, пока время >= ширина импульса
  • Отключить индикатор
  • Подождите, пока время >= 5000
,

Интересно, почему OP использовал AnalogWrite., @Juraj

@Juraj Я предполагаю, что он хочет сгенерировать «случайную» ширину импульса (ШИМ). поэтому ширина импульса, которую я использую в своем примере, представляет собой некоторое случайное время, которое должен использовать OP., @Michel Keijzers