作为发送数字信号的教学练习,我尝试在不使用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()");
}
发布于 2018-03-02 03:47:10
使用模拟伺服时,平均脉冲宽度必须相隔1.5ms,占空比根据所需位置而变化。要将伺服保持在您想要的位置,必须不断刷新伺服数据。这不是一个超级简单的任务,伺服库是非常优化的。没有什么理由不使用它。
它创建硬件定时器并使用它们来刷新伺服。这允许您的常规代码看起来像是有规律地继续,即使它被伺服库中断以服务于伺服。占空比、pwm频率和刷新率都会发挥作用。您必须查看您正在使用的伺服的数据表,以获得完整的详细信息。但它并不像你想的那么简单,而且你使用的延迟/延迟函数并不总是足够精确。这就是为什么你要使用时间和溢出中断。虽然大多数伺服不是太挑剔,你可以逃脱一吨的污水。
发布于 2019-07-05 05:48:21
库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
}
}
https://stackoverflow.com/questions/49056510
复制相似问题