要实现步进电机的简单控制功能,比如让电机正转、反转、调速和停止,这是嵌入式开发中非常基础且实用的需求。
一、实现思路
步进电机的核心控制逻辑是通过按固定时序给电机的相绕组通电,从而驱动电机转子一步步转动。我会以最常见的 28BYJ-48 步进电机(5 线 4 相)搭配 ULN2003 驱动板为例,使用 Python 和树莓派来实现,这种方式对新手最友好、最易上手。
核心控制逻辑:
二、完整实现代码
1. 硬件接线(树莓派 + 28BYJ-48 + ULN2003)
| ULN2003 驱动板 | 树莓派 GPIO 口 | 备注 |
|---|---|---|
| IN1 | 18 | 任意可用 GPIO 均可 |
| IN2 | 23 | |
| IN3 | 24 | |
| IN4 | 25 | |
| VCC | 5V | 28BYJ-48 需 5V 供电 |
| GND | GND | 共地 |
2. Python 代码实现
python
运行
import RPi.GPIO as GPIOimport time# 1. 配置GPIO口# 定义步进电机4相对应的GPIO引脚STEP_PINS = [18, 23, 24, 25]# 定义4相通电时序(全步模式)STEP_SEQUENCE = [
[1, 0, 0, 0],
[1, 1, 0, 0],
[0, 1, 0, 0],
[0, 1, 1, 0],
[0, 0, 1, 0],
[0, 0, 1, 1],
[0, 0, 0, 1],
[1, 0, 0, 1]]SEQUENCE_LEN = len(STEP_SEQUENCE) # 时序长度:8# 2. 初始化GPIOdef init_stepper():
GPIO.setmode(GPIO.BCM) # 使用BCM编码的GPIO编号
GPIO.setwarnings(False)
for pin in STEP_PINS:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW) # 初始化为低电平# 3. 步进电机转动函数# direction: 1=正转, -1=反转; steps: 转动步数; delay: 步间隔(秒),值越小转速越快def stepper_rotate(direction=1, steps=100, delay=0.002):
current_step = 0
for _ in range(steps):
# 按时序设置各引脚电平
for pin_idx in range(4):
GPIO.output(STEP_PINS[pin_idx], STEP_SEQUENCE[current_step][pin_idx])
# 更新下一步(正转+1,反转-1)
current_step = (current_step + direction) % SEQUENCE_LEN
time.sleep(delay)# 4. 停止电机(所有引脚置低)def stepper_stop():
for pin in STEP_PINS:
GPIO.output(pin, GPIO.LOW)# 5. 主函数(测试功能)if __name__ == "__main__":
try:
init_stepper()
print("电机正转100步...")
stepper_rotate(direction=1, steps=100, delay=0.002)
time.sleep(1) # 暂停1秒
print("电机反转100步...")
stepper_rotate(direction=-1, steps=100, delay=0.002)
time.sleep(1)
print("电机快速正转200步(调速)...")
stepper_rotate(direction=1, steps=200, delay=0.001) # 减小delay提速
except KeyboardInterrupt:
print("\n程序被手动终止")
finally:
stepper_stop() # 停止电机
GPIO.cleanup() # 清理GPIO配置
print("GPIO已清理,程序结束")三、代码关键解释
四、运行前置条件
总结
如果你的硬件不是树莓派(比如 Arduino),核心控制逻辑(时序、方向、调速)完全相同,仅需将 GPIO 操作替换为对应平台的语法即可。


