无库Arduino伺服
作为发送数字信号的教育练习,我尝试在不使用servo.h库的情况下为伺服编写脉冲序列 该伺服系统为9g微型伺服系统。硬件是正确的,正如许多使用伺服的例子一样 我有以下代码。问题在于,伺服系统会突然转动3秒钟,而不是移动并保持静止无库Arduino伺服,arduino,servo,Arduino,Servo,作为发送数字信号的教育练习,我尝试在不使用servo.h库的情况下为伺服编写脉冲序列 该伺服系统为9g微型伺服系统。硬件是正确的,正如许多使用伺服的例子一样 我有以下代码。问题在于,伺服系统会突然转动3秒钟,而不是移动并保持静止 void循环(){ movePulse_1000(); 延迟(3000); } void movePulse_1000(){ 串行打印(“开始移动脉冲_1000()\t\t”); 对于(int pulseCounter=0;pulseCounter使用模拟伺服,平均脉冲
void循环(){
movePulse_1000();
延迟(3000);
}
void movePulse_1000(){
串行打印(“开始移动脉冲_1000()\t\t”);
对于(int pulseCounter=0;pulseCounter使用模拟伺服,平均脉冲宽度必须相隔1.5ms,占空比根据所需位置变化。要使伺服保持在所需位置,必须不断刷新伺服数据。这不是一项超简单的任务,伺服库也经过了相当优化。没有理由不使用它
它创建硬件计时器并使用它们刷新伺服。这允许您的常规代码定期显示为继续,即使它被伺服库中断以服务伺服。占空比、pwm频率和刷新率都起作用。您必须查看正在使用的伺服的数据表以获得完整的细节。但它并不像你想象的那么简单,而且你使用的延迟/延迟微秒函数并不总是足够精确。这就是为什么你会使用时间和溢出中断。虽然大多数伺服并不太挑剔,你可以摆脱一吨的斜坡。库伺服.h
不断地发送脉冲,这意味着伺服咆哮=电池消耗
我改变了你的功能,只旋转伺服没有定时器从0到180度
del=(7*x)+500;
-用于我的伺服脉冲500至1260us(计算,未测量)
void movePulse(int x){
整数del=(7*x)+500;
对于(int pulseCounter=0;pulseCounterDiamond):谢谢你的想法。我用其他语言完成了这项工作,工作起来很轻松。脉冲之间不是间隔20ms,脉冲持续时间1-2ms吗?
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
}
}