Генератор импульсов различной ширины
Я пытаюсь создать прямоугольный импульс с фиксированной задержкой в 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);
}
@Kasia, 👍0
Обсуждение1 ответ
Просто, но не совсем точно:
- Включить индикатор
- Задержка на величину ширины импульса (например, 20)
- Отключить индикатор
- Задержка 5000 мс — длительность импульса (20), в данном примере 4980 мс.
Однако, поскольку включение/выключение светодиода также требует некоторого времени, это займет чуть больше 20 + 4980 = 5000 мс.
Так лучше:
- Установите время в переменной (используйте функцию
millis
). - Включить индикатор
- Подождите, пока время >= ширина импульса
- Отключить индикатор
- Подождите, пока время >= 5000
Интересно, почему OP использовал AnalogWrite., @Juraj
@Juraj Я предполагаю, что он хочет сгенерировать «случайную» ширину импульса (ШИМ). поэтому ширина импульса, которую я использую в своем примере, представляет собой некоторое случайное время, которое должен использовать OP., @Michel Keijzers
- Печать string and integer LCD
- Почему мои часы реального времени показывают неверное время с моего ПК?
- Arduino uno + cnc Shield v3 + драйвер шагового двигателя A4988 + AccelStepper?
- Отправьте несколько значений int из Python в Arduino, используя pySerial
- Глобальные переменные занимают много места в динамической памяти.
- (Код ультразвукового датчика: такого файла или каталога нет)
- rfid_default_keys проверить с помощью RC522
- Команда strtok() с Serial связью
используйте digitalWrite и установите контакт ВЫСОКИЙ на желаемую продолжительность, @Juraj
AnalogWrite генерирует серию импульсов с переменным рабочим циклом. Если вам нужен только один импульс, вам, вероятно, следует написать код вручную. Какой диапазон ширины импульса вам нужен, и с какой точностью?, @Duncan C
Как уже говорили другие, вы можете использовать
digitalWrite()
и функциюmillis()
, чтобы получить приличную точность и аккуратность. Если вам нужна более высокая точность и аккуратность, вы можете переключиться на использование регистров порта для прямого управления выводом. Это значительно быстрее, чем функцияdigitalWrite()
, так что вы можете сделать свое время более точным. И если вам нужна точность менее миллисекунды, вы можете использовать функциюmicros()
для вашего времени., @Duncan CСпасибо за ваши ответы и предложения. Я пытаюсь синхронизировать две нейронные системы записи. Поэтому я пытаюсь генерировать эти импульсы с различной шириной и фиксированным временем, чтобы я мог выровнять их позже в автономном режиме, чтобы установить правильное время смещения при анализе данных. Я имел в виду ширину импульса (5-500) мс., @Kasia