1.模块准备​

1.1硬件​

(1)烧录好的树莓派4B开发板

树莓派直流电机基础控制实验_引脚

图1 树莓派4B及其GPIO

(2)树莓派智能机器人拓展板和7.4V供电电池各一块

树莓派直流电机基础控制实验_引脚_02

图2 树莓派智能机器人拓展板、7.4V供电电池实物图

树莓派直流电机基础控制实验_树莓派_03

图3 树莓派智能机器人拓展板示意图(来源:创乐博)

(3)直流减速TT电机(带插头)两个,小车车轮两个

红线——电机线+

黑线——电机线-

树莓派直流电机基础控制实验_直流电机PWM_04

图4 直流电机、车轮实物图


(4)智能小车底板一个

树莓派直流电机基础控制实验_引脚_05

图5 智能小车底板实物图

用于固定电机和车轮,方便观察实验效果


1.2 软件与实验条件

(1)PC端

VNC软件(用于连接树莓派桌面环境)

(2)树莓派端

开启ssh远程连接服务

配置好的python运行环境

python控制GPIO高低电平的库RPi.GPIO(树莓派官方系统默认已经安装)


1.3 硬件的整体连接

树莓派直流电机基础控制实验_引脚_06

图6 整体连接架构图

树莓派直流电机基础控制实验_引脚_07

图7 整体连接实物图


2. 实验原理与设计​

2.1 驱动直流电机基本原理

我们通过调节施加在电机上面的直流电压大小,实现直流电机调速, 改变施加电机上面直流电压的极性,即可实现电机换向。本实验通过代码改变PWM脉冲信号的占空比来改变电机转速,占空比越大速度就越快,占空比为100%时相当于输入1(高电平),占空比为0%时相当于输入0(低电平)。

电机驱动实质是一个功率放大器,把我们的输出信号进行功率放大之后输出给执行元件---电机,实现输出信号对电机的控制。如图8 拓展板电机连接区域实物图截图,红色方框里面的两个就是两个电机驱动模块,分别驱动A通道电机(AIN1,AIN2),B通道电机(BIN1,BIN2)。​

树莓派直流电机基础控制实验_引脚_08

图8 拓展板电机连接区域实物图截图

树莓派直流电机基础控制实验_引脚_09

图9 拓展板电机驱动模块电路图


2.2 实验设计

(1)设置引脚编码模式为GPIO端口模式;

(2)参考图9的电路图的电机接口的引脚号,定义电机端口和PWM信号输入端口;

(3)初始化引脚状态(将相应的GPIO引脚设置为输出模式);

(4)设置输入的PWM脉冲信号频率,初始化其占空比;

(5)定义不同通道电机转动的控制方法(这里设置两个参数d和speed);

如A通道电机:参数d=1时,电机1正向旋转电机2反向旋转;参数d=           2时,电机2正向旋转电机1反向旋转。参数speed控制电机的转速。

(6)根据电机转动控制方法的参数含义,通过改变参数值、方法调用形式以及进行多种调用组合进行实际控制;

(7)连接设备,运行代码,观察效果。

2.3 实验源码(python)

# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM) # 设置引脚编码模式,GPIO端口模式


# 定义GPIO端口
PWMA = 18 # A通道电机PWM信号输入端口
AIN1 = 22
AIN2 = 27

PWMB = 23 # B通道电机PWM信号输入端口
BIN1 = 25
BIN2 = 24

# 将相应的GPIO引脚设置为输出模式
GPIO.setup(AIN2,GPIO.OUT)
GPIO.setup(AIN1,GPIO.OUT)
GPIO.setup(PWMA,GPIO.OUT)

GPIO.setup(BIN1,GPIO.OUT)
GPIO.setup(BIN2,GPIO.OUT)
GPIO.setup(PWMB,GPIO.OUT)

# 输入PWM脉冲信号,设置频率,初始化占空比
freq = 100
Duty_cycle = 0
L_Motor= GPIO.PWM(PWMA,freq) #创建输入频率为freq的PWM信号输入对象
L_Motor.start(Duty_cycle) # 初始占空比为Duty_cycle,向PWMA输入PWM脉冲信号
R_Motor = GPIO.PWM(PWMB,freq)
R_Motor.start(Duty_cycle)

def stop(pwmObj,*IN):
'''通知指定通道pwmObj的电机的旋转'''
pwmObj.ChangeDutyCycle(0)
for i in IN:
GPIO.output(i, False)

def invlove_A(speed,d=1):
'''A通道电机旋转,默认1正向旋转'''
L_Motor.ChangeDutyCycle(speed) # 改变PWM占空比,值越大转速越快
# AIN1和AIN2不能同时设为0或1
if d == 1:
# A通道电机1正向旋转,电机2反向
GPIO.output(AIN1, True) # AIN1设置为高电平
GPIO.output(AIN2,False) # AIN2设置为低电平
else:
# A通道电机1反向旋转,电机2正向
GPIO.output(AIN1, False)
GPIO.output(AIN2, True)

def invlove_B(speed,d=1):
'''B通道电机旋转,默认1正向旋转'''
R_Motor.ChangeDutyCycle(speed) # 改变PWM占空比,值越大转速越快
if d == 1:
# B通道电机1正向旋转,电机2反向
GPIO.output(BIN1, True) # BN1设置为高电平
GPIO.output(BIN2, False) # BIN2设置为低电平
else:
# B通道电机1反向旋转,电机2正向
GPIO.output(BIN1, False)
GPIO.output(BIN2, True)

if __name__=='__main__':
invlove_A(20)
time.sleep(2)
stop(L_Motor,AIN1,AIN2)

GPIO.cleanup()

这里主要展示基本的控制方法代码。


3.实验小结

市场上许多以PWM信号驱动控制智能小车的基础运动(前进、后退、左转、右转),正是通过本实验的基础操作进行组合实现的;

电机的转速实际是由电枢电流(指电机中的电枢里的电流,电枢是电能和机械能转换的部件)决定,而电枢电流的大小主要取决于外接电压的大小,所以电机的转速和外接的电压可以看作是正相关的。

注:

本人的计算机专业是偏向软件学习的,对硬件知识并不熟悉,文中难免有些关于该方面的表述不是很严谨,另外实验还有其它方面的不足之处,尽请广大读者批评指正。