直流电机

原理简介

直流电机把电能转换成旋转机械能,通电极性决定转向。

  • 工作原理:电流通过磁场中的线圈产生力,驱动转子旋转
  • 常见类型:有刷直流电机(套件里的小电机)、无刷直流电机
  • 驱动芯片:TC1508A(双通道直流电机驱动,内置功率 MOS 全桥,可同时驱动两个直流电机)
  • TC1508A 每通道两个逻辑输入:INA / INB(A 通道)、INC / IND(C 通道),Pico 的 GPIO 可直接驱动

典型应用

  • 小风扇
  • 智能小车车轮
  • 机器人驱动轮
  • 传送带、卷帘
  • 搅拌、转动机构

接线图

[接线图占位,后续添加]

文字说明(具体接法见下方代码注释):

  • 模块 VDD(电机电源)→ 外接 5V(电机电流大,不要从 Pico 取电)
  • 模块 GND → 外接电源 GND,并连一根线到 Pico 的 GND(共地)
  • 模块 INA → Pico GP15,INB → Pico GP14(控制 A 通道电机)
  • 模块 OUTA / OUTB → 直流电机两根线(不分正负,接反只是转向相反)
  • TC1508A 逻辑高电平门限 2.0V,Pico 的 3.3V 高电平可直接驱动,不用额外电平转换

示例代码

基础示例:正转 / 反转 / 停止 / 刹车

# ============ 接线 ============
# TC1508A 模块 VDD(电机电源) → 外接 5V(不要从 Pico 取电,电机电流大)
# TC1508A 模块 GND          → 外接电源 GND,并连一根线到 Pico GND(共地)
# TC1508A 的 INA → Pico GP15
# TC1508A 的 INB → Pico GP14
# TC1508A 的 OUTA / OUTB    → 直流电机两根线(不分正负,接反只是转向相反)
# =============================
from machine import Pin, PWM
import time

ina = PWM(Pin(15))   # A 通道输入 A
inb = PWM(Pin(14))   # A 通道输入 B
ina.freq(1000); inb.freq(1000)

def forward(speed):
    # 正转:INA 给 PWM(占空比=速度),INB 给 0
    inb.duty_u16(0)
    ina.duty_u16(int(speed * 65535 / 100))

def reverse(speed):
    # 反转:INA 给 0,INB 给 PWM
    ina.duty_u16(0)
    inb.duty_u16(int(speed * 65535 / 100))

def stop():
    # 待命/滑行:INA=INB=0,电机自由转停
    ina.duty_u16(0)
    inb.duty_u16(0)

def brake():
    # 刹车:INA=INB=1(高电平),电机两端短接急停
    ina.duty_u16(65535)
    inb.duty_u16(65535)

print('直流电机:正转/反转/停止/刹车')
forward(100); print('正转'); time.sleep(2)
reverse(100); print('反转'); time.sleep(2)
stop();       print('停止'); time.sleep(1)
brake();      print('刹车'); time.sleep(1)
stop()

进阶示例:速度渐变

# ============ 接线 ============
# TC1508A 模块 VDD(电机电源) → 外接 5V(不要从 Pico 取电)
# TC1508A 模块 GND          → 外接电源 GND,并连一根线到 Pico GND(共地)
# TC1508A 的 INA → Pico GP15,INB → Pico GP14
# TC1508A 的 OUTA / OUTB    → 直流电机两根线(不分正负)
# =============================
from machine import Pin, PWM
import time

ina = PWM(Pin(15)); inb = PWM(Pin(14)); ina.freq(1000); inb.freq(1000)

def forward(speed):
    inb.duty_u16(0)
    ina.duty_u16(int(speed * 65535 / 100))

def stop():
    ina.duty_u16(0); inb.duty_u16(0)

print('速度渐变')
# 0 → 100% 加速
for speed in range(0, 101, 10):
    forward(speed); print('速度', speed, '%'); time.sleep(0.5)
# 100% → 0 减速
for speed in range(100, -1, -10):
    forward(speed); print('速度', speed, '%'); time.sleep(0.5)
stop()

应用示例:电位器调速

# ============ 接线 ============
# TC1508A 模块 VDD(电机电源) → 外接 5V
# TC1508A 模块 GND          → 外接电源 GND,并连一根线到 Pico GND(共地)
# TC1508A 的 INA → Pico GP15,INB → Pico GP14
# TC1508A 的 OUTA / OUTB    → 直流电机两根线(不分正负)
# 电位器中间脚 → Pico GP26(ADC0),另外两脚分别 → 3V3 和 GND
# =============================
from machine import Pin, PWM, ADC
import time

ina = PWM(Pin(15)); inb = PWM(Pin(14)); ina.freq(1000); inb.freq(1000)
adc = ADC(Pin(26))

def forward(speed):
    inb.duty_u16(0)
    ina.duty_u16(int(speed * 65535 / 100))

def stop():
    ina.duty_u16(0); inb.duty_u16(0)

print('电位器调速(拧到最低自动停)')
while True:
    value = adc.read_u16()              # 0~65535
    speed = int(value / 65535 * 100)    # 映射成 0~100%
    if speed < 3:
        stop()
    else:
        forward(speed)
    print('速度', speed, '%')
    time.sleep(0.1)

注意事项

  • 供电:TC1508A 的 VDD 是电机电源(2.4~7.2V),接外接 5V;电机电流大,不要从 Pico 的 3V3/5V 取电,否则会拖垮/烧坏 Pico。
  • 共地:模块 GND 必须连到 Pico GND,否则 GPIO 信号无效。
  • 真值表(A 通道):INA=0,INB=0→待命滑行;INA=1,INB=0→正转;INA=0,INB=1→反转;INA=1,INB=1→刹车。调速是「一个脚送 PWM、另一个脚送 0」。
  • 转向:OUTA/OUTB 不分正负,接反只是转向相反,对调两根线即可。
  • 电流:每通道最大连续 1.8A、峰值 2.5A,小马达够用;带大负载注意散热。
  • 保护:模块已内置功率 MOS 和保护,长线/大电机时可在电机两端并一个 0.1µF 电容减小干扰;不用外接续流二极管。
  • PWM 频率:芯片最高支持 50kHz,示例用 1kHz 足够。

常见问题

Q: 电机不转? A: 查 VDD 有没有接外接 5V、GND 有没有和 Pico 共地、INA/INB 脚号对不对。

Q: 电机只往一个方向转、无法反转? A: 确认 forward/reverse 里两个脚的高低电平有没有对调;或检查 OUTA/OUTB 接线。

Q: 电机一启动 Pico 就重启/乱跑? A: 典型是没共地或电机电源从 Pico 取电。电机必须外接 5V 且和 Pico 共地。