这次要演示的是控制伺服电机,用输入脉冲数控制旋转角度。
左侧是个低功率的步进电机,连接至右侧的伺服控制器,把复杂的相位控制转换成了简单的脉冲控制:只需确定旋转方向,输入指定数量脉冲,就能获得想要的角度。
如何让控制板输出想要的脉冲?之前演示过gpio命令可以翻转引脚电平高低从而产生脉冲,但在这个场景下明显效率太低,脉冲宽度也不能保证。这里要用到MCUSH提供的另一个实用命令“pulse”,可以产生指定数量脉冲,并保证脉冲宽度。
打开控制台,看看语法说明:
=>pulse --help
usage: pulse [--delay=] [-p ] [-I] [-D] [--invert]
options:
--delay default 5
-p/--pin default 0.0
-I/--init init
-D/--deinit deinit
--invert invert
number number
=>
首先初始化需要的端口,确定脉冲时间宽度,以及脉冲是否电平翻转。
=>pulse -p0.0 --delay=50 -I
=>
然后指定需要的脉冲数即可,所有脉冲全部输出完成后返回。
=>pulse 3
=>
上面的命令使得PA0口生成了3个脉冲,脉冲宽度50us,示波器检验如下:
需要注意的是脉冲的宽度是保证的(此时固件实时操作系统进入“临界区”,禁止任务抢占调度),而脉冲间的延时是允许任务调度的(实际延时时间可能大于指定的时间)。
下面用封装好的Python接口控制伺服,生成转一圈需要的脉冲数,然后翻转方向,继续转一圈,如此反复……
import time
from mcush import *
STEP = 1600 # 根据控制器组合开关设置
# 以下三个控制引脚共阴输入
ENABLE = '0.0' # 允许
DIR = '0.1' # 方向
PULSE = '0.2' # 脉冲
s = Mcush.Mcush(‘/dev/ttyACM0’)
s.pinOutputLow( [ENABLE, DIR, PULSE] ) # 同时控制3个引脚输出低电平
s.pulseInit( pin=PULSE, delay_us=50 ) # 初始化PULSE引脚
direction = True
try:
s.pinClr( ENABLE )
while True:
# 准备方向信号
print( "Direction:%d"% (int(direction)) )
if direction:
s.pinSet( DIR )
else:
s.pinClr( DIR )
# 旋转一圈
s.pulse( STEP ) # 产生STEP个脉冲
time.sleep(1)
# 反转方向
direction = not direction
finally:
s.pinSet( ENABLE ) # 按Ctrl-C中止后,恢复该控制引脚
运行效果:脉冲输出控制步进电机伺服/video/1165645385912700928