直流电机把电能转换成旋转机械能,通电极性决定转向。
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 模块 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)
VDD 是电机电源(2.4~7.2V),接外接 5V;电机电流大,不要从 Pico 的 3V3/5V 取电,否则会拖垮/烧坏 Pico。INA=0,INB=0→待命滑行;INA=1,INB=0→正转;INA=0,INB=1→反转;INA=1,INB=1→刹车。调速是「一个脚送 PWM、另一个脚送 0」。OUTA/OUTB 不分正负,接反只是转向相反,对调两根线即可。Q: 电机不转?
A: 查 VDD 有没有接外接 5V、GND 有没有和 Pico 共地、INA/INB 脚号对不对。
Q: 电机只往一个方向转、无法反转?
A: 确认 forward/reverse 里两个脚的高低电平有没有对调;或检查 OUTA/OUTB 接线。
Q: 电机一启动 Pico 就重启/乱跑? A: 典型是没共地或电机电源从 Pico 取电。电机必须外接 5V 且和 Pico 共地。