如上所述,舵机的控制是通过改变周期脉冲的占空比实现的,因此,利用单片机的定时器/计数器的定时溢出功能产生脉冲波即可精确控制舵机。下面通过两个实例介绍舵机的软件设计思路。
1.控制舵机转动到任意指定角度
此种方式是舵机控制的最基本操作。只要根据指定角度所对应的脉冲占空比,计算出定时器/计数器的定时常数,就能产生相应的脉冲波。设角度为α(取值范围是0°~180°),可以得到周期脉冲高电平延时时长th和脉冲低电平延时时长tl,见表达式(8-1)和式(8-2):
th=0.5ms+α/180°×2ms (8-1)
tl=20ms-th (8-2)
再根据3.1.2节的方法计算定时器/计数器在工作模式1的预置初值Xh和Xl。其中晶振频率fOSC=12MHz,机器周期T=1μs,预置初值Xh可以通过表达式(8-3)计算:
(216-Xh)×1μs=th (8-3)
代入th的表达式(8-1),并统一用微秒表示,得:
Xh=216-500+α/180°×2000≈FE0CH-α×11 (8-4)
Xl=216-20000-Xh=1B1E0H-Xh (8-5)
舵机转动到指定角度的控制函数流程图见图8-28,用C语言实现。软件设计思路为:构造函数Servo_Rotate_to_Angle(角度值),输入角度值为0°~180°之间任一指定角度,代入上述关系式计算高电平、低电平的定时预置值,调用舵机动作函数Servo_Action()执行相应操作,具体流程如图8-28a所示。在舵机动作函数Servo_Action()中,定时器/计数器装载高电平的定时时间预置值,启动定时器/计数器并在舵机I/O端口置1,等待定时器溢出标志置位并将其清零;舵机I/O口产生低电平的定时时间预置值方法与之类似,具体流程图如图8-28b所示。
图8-28 舵机转动到指定角度的控制函数流程图
2.在0°~180°转动范围内控制舵机转动速度
上例所述方法是控制舵机使其转动至某个指定的角度位置,这种方法受控的舵机在其最高转动速度(舵机标称的转动速度)下运行,但现实情况中往往需要调节舵机的转速来适应具体任务的需求。
基于舵机转动角度与周期脉冲的高电平宽度有着一对一的关系,假设舵机的摆臂要从角度β转动到角度γ,则两者角度差θ为:
θ=|β-γ| (8-6)
引入变量Δθ作为每周期的角度增量,k代表周期脉冲个数的整数,则有:(www.xing528.com)
θ=kΔθ (8-7)
因此,当Δθ↑,舵机在下一周期到达的角度↑,转速↑,需要输入的脉冲个数↓;反之,当Δθ↓,舵机在下一周期到达的角度↓,转速↓,需要输入的脉冲个数↑。
本例中的受控舵机从0°旋转至180°,由输入速度参数调整舵机的转动速度。程序设计的关键在于把角度增量Δθ转化为定时器/计数器预置值增量。设s为速度参数,相应修改高电平、低电平预置值,得到与第n个周期的关系为:
其中n与s的乘积不大于2000(对应角度值180°)。构造函数Servo_Horizontal_Rotation(速度增量),设置变量time(取值范围0≤time≤2000),每次循环中都根据上述关系计算高电平、低电平的定时器/计数器预置值,并传递至舵机动作函数执行相关操作,在0°~180°按不同速度转动的控制函数流程图见图8-29。
3.主程序流程
主程序结合了上述舵机两种运转方式,软件流程构思为:首先按照例1的方式将舵机以标准速度(快速)从初始角度转至56°,延时1s,再转至112°,接着以标准速度(快速)回转到0°;然后按照例2的方式,以速度3(慢速)从0°转至180°,延时1s,接着以标准速度(快速)回转到0°;最后以速度9(中速)从0°转至180°,程序完成。舵机多方式运转的主程序流程图见图8-30。
图8-29 在0°~180°按不同速度转动的控制函数流程图
图8-30 舵机多方式运转的主程序流程图
4.C语言源程序
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。