作为发送数字信号的教育练习,我试图在不使用servo.h库的情况下为伺服编码脉冲序列。
伺服是9g微伺服。硬件是正确的,因为许多使用servo.h的例子工作正常。
我有以下代码。问题是伺服器会晃动3秒而不是移动并保持静止。
void loop() {
movePulse_1000();
delay(3000);
}
void movePulse_1000(){
Serial.print("Start movePulse_1000()\t\t");
for (int pulseCounter=0; pulseCounter<=150; pulseCounter++){
digitalWrite(pinServo,LOW);
delay(20); // between pulses
digitalWrite(pinServo,HIGH);
delayMicroseconds(1000);
}
Serial.println("End movePulse_1000()");
}
答案 0 :(得分:2)
使用模拟伺服,平均脉冲宽度必须相隔1.5ms,占空比根据所需位置而变化。要将伺服电机保持在所需位置,必须不断刷新伺服数据。这不是一个超级简单的任务,伺服库已经过优化。没有理由不使用它。
它创建硬件计时器并使用它们刷新伺服器。这使得您的常规代码看起来会定期继续,即使它被伺服库中断以维修伺服系统。占空比,pwm频率和刷新率都发挥作用。您必须查看正在使用的伺服数据表才能获得完整的详细信息。但它并不像你想象的那么简单,而你所使用的那些延迟/延迟微观函数并不总是足够精确。这就是你使用时间和溢出中断的原因。虽然大多数舵机都不太挑剔,但你可以侥幸逃脱。
答案 1 :(得分:0)
库servo.h
不断发送脉冲,这意味着伺服咆哮=电池消耗。
我将您的功能更改为仅在没有计时器的情况下将伺服器从0旋转到180度。
del = (7 * x) +500;
-对于我的500至1260us的伺服脉冲(计算得出,未测量)
void movePulse(int x){
int del=(7*x)+500;
for (int pulseCounter=0; pulseCounter<=50; pulseCounter++){
digitalWrite(pinServo,HIGH);
delayMicroseconds(del);
digitalWrite(pinServo,LOW);
delay(20); // between pulses
}
}