сервобиблиотека, понимающая запись PWM.

Я не понимаю, как должны работать несколько выходов PWM. Посмотрите на картинку. введите здесь описание изображения

В первом (1) случае мы используем короткую ширину сигнала, которая была бы близка к остановке двигателя. При этом, как видно, короткие импульсы следуют друг за другом, код тоже.

motor1.writeMicroseconds(shortWidth);
motor2.writeMicroseconds(shortWidth);
motor3.writeMicroseconds(shortWidth);
motor4.writeMicroseconds(shortWidth);

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

Во втором (2) случае импульс шире, что соответствует установке скорости двигателя близкой к максимальной. После того, как мотор 1 закончит генерировать ширину, пришло время для мотора 2 сгенерировать ее. Но когда это происходит, период мотора 1 подходит к концу, и он должен снова начать генерировать ширину, но ардуино занята генерацией импульса мотора 2.

Как работает ШИМ в этом случае?


person user3081123    schedule 10.01.2015    source источник


Ответы (1)


Вы можете посмотреть непосредственно на код Servo.h и Servo.cpp. Но две вещи, которые помогут понять:

  1. Сервопривод не реагирует на ШИМ (широтно-импульсная модуляция - длительность импульса в зависимости от длительности цикла, но PDM (широтно-импульсная модуляция - абсолютное значение времени). Это означает, что сервопривод не переходит в 0, когда импульс имеет 0 длительности, он переходит в средний диапазон (90°), когда импульс составляет 1,5 мс, он переходит в минимальное положение (0°), когда импульс составляет 1 мс, и переходит в максимальное положение (180°), когда длительность импульса составляет 2 мс Общий цикл всегда составляет около 20 мс. Чтобы быть более точным, обычно он не полностью достигает 0° и 180°, а минимальное время составляет 0,5 мс, а максимальное время составляет около 2,5 мс, но это выходит за рамки спецификации большинства сервоприводов.
  2. Несколько сервоприводов управляются одним таймером (обычно timer_1 на Arduino). Таймер запрограммирован, когда вы выполняете Servo.write(value), тогда аппаратное обеспечение генерирует смену вывода в нужное время.

Вы можете попробовать следующий код:

#include <Servo.h>

Servo myServo1;
Servo myServo2;
const int servo1Pin = 9;
const int servo2Pin = 10;

void setup(){
    // attach servo to pin 
    myServo1.attach(servo1Pin);
    myServo2.attach(servo2Pin);
}

void loop(){
    myServo1.write(15); //set servo to 15°
    myServo2.write(45); //set servo to 45°
    delay(1000); //wait 1 second
    myServo1.write(90); //set servo to 90°
    myServo2.write(90); //set servo to 90°
    delay(1000); //wait 1 second
    myServo1.write(165); //set servo to 165°
    myServo2.write(135); //set servo to 135°
    delay(1000); //wait 1 second
}
person MAC    schedule 10.01.2015
comment
Я сделал ошибку, написав про сервопривод. То, с чем я имею дело, это в основном ESC с бесщеточным двигателем. Он тоже использует PDM? - person user3081123; 11.01.2015
comment
@ user3081123 ESC для бесщеточного двигателя значительно сложнее, если вы хотите эффективного управления. Посмотрите это короткое видео ESC DIY. - person MAC; 11.01.2015