Можно ли отправить 2 или более сигнала o/p одновременно?
Я хотел запустить два двигателя с помощью двухканального драйвера двигателя Cytron MDD10A. Таким образом, мое беспокойство основано на выполнении кода, который выполняется построчно, в том случае, когда я управляю двумя двигателями, будет ли эта задержка выходного сигнала на выводах ШИМ иметь значение в характере производительности, например, автомобильное колесо, в случае такой задержки одно колесо будет вращаться раньше другого, что нежелательно. Если да, то как мне исправить то же самое. Я также хотел знать, когда я использую функцию задержки, вызывает ли она задержку выполнения предыдущей строки или считывает следующую строку с задержкой в несколько «x» секунд?
Спасибо за помощь.
изменить: пример кода:
void FWD() { // для продвижения вперед
digitalWrite(m1, HIGH); // двигатель 1 включен
digitalWrite(m2, HIGH); // двигатель 2 включен
analogWrite(tm1, 225); // tm1 назначен на вывод PWM
analogWrite(tm2, 225); // tm2 назначен другому выводу ШИМ
}
в приведенной выше функции я хочу запустить оба аналога Write одновременно, так как я не уверен, как это повлияет на вывод? Я хочу, чтобы двигатели запускались одновременно.
2 ответа
Лучший ответ:
Технически можно запустить два выхода ШИМ одновременно. время на Uno или Nano. Если они оба управляются одним и тем же таймером, вам просто нужно обновить соответствующий управляющий регистр один раз с помощью соответствующие биты установлены для включения обоих каналов. Например, вы можете запустить выходы 5 и 6 одновременно, так как оба находятся на Таймере 0:
OCR0A = value; // устанавливаем скважность на OC0A = цифра 6
OCR0B = value; // устанавливаем скважность на OC0B = цифра 5
TCCR0A |= _BV(COM0A1) | _BV(COM0B1); // включить оба выхода
Если выходы находятся на разных таймерах, это немного сложнее. Таймеры 0 и 1 можно синхронизировать, очистив их общий предварительный делитель с помощью Активен режим синхронизации таймера/счетчика. я не думаю, что есть простой способ синхронизировать Таймер 2 с любым другим.
Все это сильно зависит от аппаратного обеспечения и вообще не поддерживается Основная библиотека Ардуино. Таким образом, если вы хотите применить что-либо из этого, вы необходимо изучить техническое описание< /a> и ткнуть прямо в ввод-вывод регистры микроконтроллера.
Но тогда, как четко указывает Delta_G в своем ответе, все это
не имеет отношения к управлению двигателем. Двигатели – это механические устройства, которые
значительная инерция. Им нужно время, чтобы ускориться и замедлиться. Просто
дать вам ощущение масштаба, выходы ШИМ 3, 9, 10 и 11 обеспечивают квадрат
волна с периодом 2,04 мс. Да, это миллисекунды, и
это слишком мало для двигателей, чтобы значительно изменить свою скорость
в течение одного периода. Сравните это с несколькими микросекундами,
который вызовет analogWrite()
.
Я не думаю, что ваш страх обоснован. Да, технически один двигатель запускается за другим, но время будет составлять не более нескольких микросекунд. Для сравнения, вам требуется около 200 000 микросекунд, чтобы моргнуть глазом. Вы не сможете сказать. Они будут начинаться точно в одно и то же время. Вам понадобятся очень сложные высокоскоростные камеры, чтобы увидеть разницу во времени. Это не повлияет на движение вашего автомобиля.
- Как мигать светодиодом и одновременно запускать другой код?
- Может ли Arduino UNO постоянно хранить код?
- Случайный сброс Arduino Nano
- Светодиодный матричный модуль FC-16 на базе MAX7219
- Запуск кода кодировщика одновременно с другим кодом в Arduino
- avrdude ser_open() can't set com-state
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Печать string and integer LCD
Что такое сигнал O/P?, @Edgar Bonet
извините, выходной сигнал. Я хочу отправить два сигнала ШИМ одновременно на два разных контакта ШИМ., @Harsh Vardhan Sinha
вам нужно будет опубликовать свой код, чтобы мы могли полностью понять, о чем вы говорите. Но в целом сигнал PWM генерируется с помощью таймеров и базового оборудования, поэтому вы можете одновременно запускать несколько. Отложенный вызов будет приостановлен на своей линии. Он уже завершит предыдущую строку., @Chad G
пример кода: недействительным FWD () { //двигаться вперед digitalWrite(m1, HIGH);//двигатель 1 ВКЛ. digitalWrite(m2,HIGH);//двигатель 2 ВКЛ. AnalogWrite(tm1,225);// tm1 назначается выводу ШИМ AnalogWrite(tm2,225;)//tm2 назначается другому выводу ШИМ } в приведенной выше функции я хочу запустить оба аналога Write одновременно, так как я не уверен, как это повлияет на вывод? Я хочу, чтобы двигатели запускались одновременно., @Harsh Vardhan Sinha
Arduino (и любое другое устройство с одноядерным процессором) может выполнять только одно действие за раз. Но вы не сможете сказать, какой двигатель запускается. Функция аналоговой записи не ждет, пока мотор что-нибудь сделает, она просто устанавливает таймеры и прерывания, чтобы справиться с этим. Вам следует изучить пример «Мигание без задержки», чтобы понять, как делать несколько вещей «одновременно». Оба двигателя запустятся одновременно., @Chad G
Спасибо @ChadG :), @Harsh Vardhan Sinha
@ChadG: в
analogWrite()
не включены прерывания., @Edgar Bonet@EdgarBonet не напрямую, а таймеры, используемые PWM, управляются прерываниями., @Chad G
@ChadG: Нет, это не так.
TIMER0_OVF
используется для внутреннего хронометража, но это не связано с PWM. Ядро Arduino не допускает никаких других прерываний таймера, если только вы не используете Tone, Servo или другую библиотеку, зависящую от таймера., @Edgar BonetКак вы думаете, какая задержка между запусками двигателя с кодом, который вы разместили? ... кроме того, как вы думаете, два двигателя на самом деле запускаются одновременно, если они соединены вместе?, @jsotola