/*控制4个舵机旋转*/
#define gear1 10 // 舵机1
#define gear2 11
#define gear3 12
#define gear4 13
int flag1 = 0; //舵机启动/停止标志位
int flag2 = 0;
void servopulse(int sp1,int val);
void servo_run(int pin,int angle );
void setup() {
pinMode(gear1,OUTPUT);
pinMode(gear2,OUTPUT);
pinMode(gear3,OUTPUT);
pinMode(gear4,OUTPUT);
}
void loop() {
if(!flag1) //执行第一组动作
{
servo_run(gear1,150); // gear1旋转到0度
servo_run(gear2,0); //gear2旋转到0度
servo_run(gear3,90); //gear3旋转到90度
servo_run(gear4,180); //gear4旋转到180度
flag1 = 1; //达到指定位置,让舵机停下
}
// if(!flag2) //执行第二组动作
// {
// servo_run(gear1,180); // gear1旋转到180度
// servo_run(gear2,180); //gear2旋转到180度
// servo_run(gear3,180); //gear3旋转到180度
// servo_run(gear4,180); //gear4旋转到180度
// flag2= 1; //达到指定位置,让舵机停下
// }
}
void servopulse(int addr,int val)//定义一个脉冲函数
{
int angle2us;
angle2us=map(val,0,180,500,2480); //0-180度 映射到500~2480us
digitalWrite(addr,HIGH);//将舵机接口电平至高
delayMicroseconds(angle2us);//延时脉宽值的微秒数
digitalWrite(addr,LOW);//将舵机接口电平至低
delay(20-angle2us/1000); //延迟到20ms
}
void servo_run(int pin,int angle ) //给定足够时间达到指定位置
{
for(int i = 0 ; i < 50; i++) //若未达到指定位置,延长循环次数即可 给定时间为30*20ms
servopulse(pin,angle);
}
这个很简单了,延时函数模拟PWM,会让单片机工作的没有效率···
参考这个更好些:https://blog.csdn.net/qq_41736190/article/details/81907936