13. 电机驱动模块接口¶
野火 TB6612FNG 电机驱动模块是双驱动电机模块,可以控制两个直流电机的正反转和转速,每个驱动有 两个逻辑输入引脚、一个 PWM 输入引脚和两个输出引脚,通过给两个逻辑输入引脚不同的电平来控制电 机的正反转,通过 PWM 输入引脚实现电机调速,STBY 待机引脚接低电平可以进入低功耗待机模式,内 置热关机电路和低电压检测电路。
鲁班猫扩展板板载一个电机驱动模块接口:
电机驱动模块接口支持板载5V或者外部12V给驱动模块VM供电,当接了12V电源,VM优先使用外部12V,去掉外部12V,VM则使用板载5V,通过拨码开关控制VM通断,拨到ON则开启供电,拨到1则关闭供电:
电机驱动接口有两路PWM,分别是PWM0和PWM1:
以鲁班猫1为例,扩展板的PWM0和PWM1对应鲁班猫1的PWM9_M0、PWM10_M0:
执行如下命令修改/boot/uEnv/uEnv.txt,开启PWM9_M0、PWM10_M0插件:
1 | sudo vi /boot/uEnv/uEnv.txt
|
开启插件并重启开发板,登入系统后执行如下命令查看当前PWM设备:
1 | sudo cat /sys/kernel/debug/pwm
|
以上只开了PWM9_M0、PWM10_M0,如果还开了其他PWM,也是按大到小进行注册。上图是从下往上注册,也即先注册 屏幕背光 -> PWM9 -> PWM10。
1 | ls /sys/class/pwm/
|
根据注册顺序可知,PWM9是pwmchip1、PWM10是pwmchip2。
同时其他接口说明如下:
STBY:待机引脚,接低电平处于待机模式,接高电平开始工作,芯片内部默认下拉。
AIN1、AIN2、BIN1、BIN2:控制电机正反转。
以鲁班猫1为例,引脚对照说明如下:
电机驱动模块 |
扩展板 |
40pin |
鲁班猫1 |
---|---|---|---|
STBY |
GPIO16 |
36 |
GPIO1_B0 |
AIN1 |
GPIO7 |
26 |
GPIO4_C4 |
AIN2 |
GPIO25 |
22 |
GPIO3_B0 |
BIN1 |
GPIO20 |
38 |
GPIO1_B1 |
BIN2 |
GPIO21 |
40 |
GPIO1_B2 |
将扩展板的AO1或BO1接电机正级,AO2或BO2接电机负极。
13.1. python代码测试¶
python测试代码为:lubancat_rk_code_storage/expansion_board/motor/motor.py
默认以鲁班猫1引脚为例,其他板根据实际修改motor.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | '''
filename : motor.py
'''
...
# motor controller gpionum
# A-D : 0-3
# number = group * 8 + x
# e.g. : B0 = 1 * 8 + 0 = 8
# C4 = 2 * 8 + 4 = 20
#
gpionum_motor_STBY = 8 # GPIO1_B0
gpionum_motor_AIN1 = 20 # GPIO4_C4
gpionum_motor_AIN2 = 8 # GPIO3_B0
gpionum_motor_BIN1 = 9 # GPIO1_B1
gpionum_motor_BIN2 = 10 # GPIO1_B2
# motor controller gpiochip
gpiochip_motor_STBY = "1" # gpiochip1
gpiochip_motor_AIN1 = "4" # gpiochip4
gpiochip_motor_AIN2 = "3" # gpiochip3
gpiochip_motor_BIN1 = "1" # gpiochip1
gpiochip_motor_BIN2 = "1" # gpiochip1
# motor controller pwmchip, pwm channel
motor_PWMA = PWM(1, 0) # pwmchip1, channel0
motor_PWMB = PWM(2, 0) # pwmchip2, channel0
...
|
将motor.py传到板卡,执行以下命令后台运行程序,并查看引脚状态:
1 2 3 4 5 6 7 8 | #后台运行
sudo python motor.py &
#查看PWM状态
cat /sys/kernel/debug/pwm
#查看引脚状态
cat /sys/kernel/debug/gpio
|
观察PWM和引脚状态如下:
将电机接到对应的接口,效果为电机会正反转转动:
13.2. c代码测试¶
C测试代码为:lubancat_rk_code_storage/expansion_board/motor/motor.c
默认以鲁班猫1引脚为例,其他板根据实际修改motor.c:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /*
filename : motor.c
*/
...
/* gpiochip */
#define GPIOCHIP_MOTORCTRL_STBY "/dev/gpiochip1"
#define GPIOCHIP_MOTORCTRL_AIN1 "/dev/gpiochip4"
#define GPIOCHIP_MOTORCTRL_AIN2 "/dev/gpiochip3"
#define GPIOCHIP_MOTORCTRL_BIN1 "/dev/gpiochip1"
#define GPIOCHIP_MOTORCTRL_BIN2 "/dev/gpiochip1"
/* gpionum
*
* A-D : 0-3
* number = group * 8 + x
* e.g. : B0 = 1 * 8 + 0 = 8
* C4 = 2 * 8 + 4 = 20
*/
#define GPIONUM_MOTORCTRL_STBY (8)
#define GPIONUM_MOTORCTRL_AIN1 (20)
#define GPIONUM_MOTORCTRL_AIN2 (8)
#define GPIONUM_MOTORCTRL_BIN1 (9)
#define GPIONUM_MOTORCTRL_BIN2 (10)
/* pwmchip */
#define PWMCHIP_MOTORCTRL_PWMA "pwmchip1"
#define PWMCHANNEL_MOTORCTRL_PWMA "0"
#define PWMCHIP_MOTORCTRL_PWMB "pwmchip2"
#define PWMCHANNEL_MOTORCTRL_PWMB "0"
...
|
将motor.c传到板卡,执行以下命令编译运行程序:
1 2 3 4 5 | # 编译程序
sudo gcc -o motor motor.c -lgpiod
# 运行程序
sudo ./motor
|