控制伺服电机转动速度的脉冲信号如图2.10、图2.11和图2.12所示。
图2.10所示是高电平持续1.5ms低电平持续20ms,然后不断重复地控制脉冲序列。该脉冲序列发给经过零点标定后的伺服电机,伺服电机不会旋转。如果此时你的电机旋转,表明电机需要标定。此时,你可调节伺服电机的可调电阻使电机停止旋转。控制电机运动转速的是高电平持续的时间,当高电平持续时间为1.3ms时,电机顺时针全速旋转,当高电平持续时间1.7ms时,电机逆时针速旋转。下面你将看到如何给STM32单片机微控制器编程使PD端口的第10脚(PD10)来发出伺服电机的控制信号。
图2.10 电机转速为零的控制信号时序图
图2.11 1.3ms的控制脉冲序列使电机顺时针全速旋转
图2.12 1.7ms的连续脉冲序列使电机逆时针全速旋转
在进行下面的实验之前,你必须首先确认一下机器人两个伺服电机的控制线是否已经正确地连接到了STM32单片机教学开发板的两个专用电机控制接口上。按照图2.13所示的电机连接原理图和实际接线图进行检查。“黑线”表示地线,“红线”表示电源线,“白线”表示信号线。PD9用来控制左边的伺服电机,而PD10引脚则用来控制右边的伺服电机。
图2.13 伺服电机与教学开发板的连接原理图(左)和实际接线图(右)
显然这里对微控制器编程发给伺服电机的高、低电平信号必须具备更精确的时间。因为单片机只有整数,没有小数,所以要生成伺服电机的控制信号,要求具有比delay_nms()函数的时间更精确的函数,这就需要用另一个延时函数delay_nus()。前面已经介绍过,这个函数可以实现更小的延时,它的延时单位是微秒,即千分之一毫秒,参数n为延时微秒数。
看看下面的代码片断:
如果用这个代码段代替例程Led_Blink.c中相应程序片断,它是不是就会输出图2.6所示的脉冲信号?肯定是!如果你手边有个示波器,可以用示波器观察PD10脚输出的波形是不是如图2.6所示。此时,连接到该脚的机器人轮子是不是静止不动。如果它在慢慢转动,就说明你的机器人伺服电机可能没有经过调整。
同样,用下面的程序片断代替例程Led_Blink.c中相应程序片断,编译、连接下载执行代码,观察连接到PD10脚的机器人轮子是不是顺时针全速旋转。
用下面的程序片断代替例程Led_Blink.c中相应程序片断,编译、连接下载执行代码,观察连接到PD10脚的机器人轮子是不是逆时针全速旋转。
该你了——让机器人的两个轮子全速旋转
刚才是让连接到PD10脚的伺服电机轮子全速旋转,下面你自己可以修改程序让连接到PD9机器人轮子全速旋转。
当然,最后你需要修改程序,让机器人的两个轮子都能够旋转。让机器人两个轮子都顺时钟全速旋转的程序参考下面的程序。
例程:BothServo.c
● 接通板上的电源,输入、保存、下载并运行程序(整个过程请参考第1章);
● 观察机器人小车的运动行为。
注意: 上述程序用到了两个不同的延时函数,效果与前面例子一样。运行上述程序时,你是不是对机器人的运动行为感到惊讶!