单舵机速度控制程序流程图
2018-04-29 21:02:55 15 举报
单舵机速度控制
作者其他创作
大纲/内容
if(Time_Start_Flag)
state==IDLE
否
关于函数ServoPwmDutyCompare()脉宽变化及速度控制的说明
j=0; Relay_Switch_Flag=1;//允许继电器动作标志位
单片机一直会执行main函数下的程序,只有当定时器0计数满了之后,触发中断,才会跳转至中断服务函数。
是
if(Time110)
state==Action_1
static 在定时器0内部定义的变量i,j为静态局部变量;每次调用函数时保持上一次所赋的值,跟全局变量类似,不同是它只能用于此函数内部。
SERVO0 = 0;\tTimer0Value(20000-ServoPwmDuty);i = 0;\t\t\t\t\t\t\t\tFlag_20ms = 1; //20ms标志位
switch(state)
SERVO0=1;Timer0Value(ServoPwmDuty);
跳出中断服务函数
switch(i)
state=IDLE;//省略掉了其它语句
定时器0中断服务函数入口
//即控制舵机的端口P1.0输出低电平//给定时器0赋初值,计数20000-ServoPwmDuty脉冲之后,就会再一次的进入定时器0中断服务函数
//即控制舵机的端口P1.0输出高电平//给定时器0赋初值,计数ServoPwmDuty脉冲之后,就会进入定时器0中断服务函数
static uint16 i=0;static uint16 j=0;
state=Action_1//省略掉了其它语句
while(1)
初始化(包括定时器0、串口)
j++
i==2
if(Relay_Switch_Flag)5s时间是否到达
True
是否到达了设定的间隔时间计数值
if(j=Time_Relay_Count)
设定舵机目标位置ServoPwmDutySet=2500(目标角度为90°)
state=Action_3//省略掉了其它语句
state==Action_2
if(Flag_20ms)
设定继电器的时间间隔为5s
设定舵机目标位置ServoPwmDutySet=1500(目标角度为0°)
定时器0初始化之后(此时定时器初值为0x00,0x00),定时器就已经开始计时了;①当定时器计数0xffff(65535)之后,第一次进入定时器0中断服务函数使得SERVO0=1,改变定时器0的初值为ServoPwmDuty;②当定时器计数ServoPwmDuty个脉冲,进入定时器0中断服务函数使得SERVO0=0,并改变定时器0的初值为20000-ServoPwmDuty;③当定时器0计数20000-ServoPwmDuty个脉冲后,进入定时器0中断服务函数,使得SERVO0=1;此后,程序重复②和③,进入定时器0服务函数。 从②和③步骤,可以看出SERVO0的波形周期为20ms(因为单片机的晶振为12MHz,那么时钟周期为1/12us,机器周期为1us)。SERVO0的占空比由ServoPwmDuty来决定。
default:break;
i++
state==Action_3
i==1
END
state=Action_2;//省略掉了其它语句
舵机角度变换次数计数;Time++; 对舵机运行进行速度控制;ServoPwmDutyCompare()
Time_Start_Flag表示只有在需要等待5s的时候,才会等于1
0 条评论
下一页