13. 电机驱动模块接口

野火 TB6612FNG 电机驱动模块是双驱动电机模块,可以控制两个直流电机的正反转和转速,每个驱动有 两个逻辑输入引脚、一个 PWM 输入引脚和两个输出引脚,通过给两个逻辑输入引脚不同的电平来控制电 机的正反转,通过 PWM 输入引脚实现电机调速,STBY 待机引脚接低电平可以进入低功耗待机模式,内 置热关机电路和低电压检测电路。

../_images/show-peripheral-motordriverboard.png

鲁班猫扩展板板载一个电机驱动模块接口:

../_images/show-board-motor-01.png
../_images/show-board-motor-02.png

电机驱动模块接口支持板载5V或者外部12V给驱动模块VM供电,当接了12V电源,VM优先使用外部12V,去掉外部12V,VM则使用板载5V,通过拨码开关控制VM通断,拨到ON则开启供电,拨到1则关闭供电:

../_images/show-board-motor-03.png

电机驱动接口有两路PWM,分别是PWM0和PWM1:

../_images/show-circuit-motor-01.png
../_images/show-circuit-motor-02.png

以鲁班猫1为例,扩展板的PWM0和PWM1对应鲁班猫1的PWM9_M0、PWM10_M0:

../_images/show-circuit-motor-03.png

执行如下命令修改/boot/uEnv/uEnv.txt,开启PWM9_M0、PWM10_M0插件:

1
sudo vi /boot/uEnv/uEnv.txt
../_images/show-dtbo12.png

开启插件并重启开发板,登入系统后执行如下命令查看当前PWM设备:

1
sudo cat /sys/kernel/debug/pwm
../_images/show-operation-syspwm-01.png

以上只开了PWM9_M0、PWM10_M0,如果还开了其他PWM,也是按大到小进行注册。上图是从下往上注册,也即先注册 屏幕背光 -> PWM9 -> PWM10。

1
ls /sys/class/pwm/
../_images/show-operation-classdev.png

根据注册顺序可知,PWM9是pwmchip1、PWM10是pwmchip2。

同时其他接口说明如下:

  • STBY:待机引脚,接低电平处于待机模式,接高电平开始工作,芯片内部默认下拉。

  • AIN1、AIN2、BIN1、BIN2:控制电机正反转。

../_images/show-circuit-motor-04.png

以鲁班猫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和引脚状态如下:

../_images/show-operation-syspwm-02.png

将电机接到对应的接口,效果为电机会正反转转动:

../_images/show-operation-coderun2.png

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