2. pyboard控制TB6612FNG驱动板驱动双路直流电机

2.1. TB6612FNG驱动板说明

该模块相对于传统的L298N效率上提高很多,体积上也大幅度减少,在额定范围内,芯片基本不发热。 TB6612FNG每通道输出最高1.2 A的连续驱动电流,启动峰值电流达2A/3.2 A(连续脉冲/单脉冲); 4种电机控制模式:正转/反转/制动/停止;PWM支持频率高达100 kHz;

驱动板TB6612FNG,可以驱动两路直流电机,注意调整驱动板与电机的接线,因为不同的接线决定不同的转向。 每路驱动由IN1,IN2,PWM决定控制参数,IN1,IN2不同的状态决定电机的启停和转向,pwm决定转速,STBY口接单片机的IO口拉低(置零)电机进入休眠功能全部停止。

动力主电路: VM 接12V以内电源 GND 接电源负极 控制电路: STBY 置一为工作状态,置零为休眠状态 INx和pwm引脚接TTL电平,pyb板子引脚为3.3v工作电平是可以控制这些控制引脚的,VCC可以接3.3v也可以接5v,都是兼容的。

驱动1路 PWMA调速 AIN1:AIN2 00停止 01正转 10反正 11制动 驱动2路 BIN1:BIN2 00停止 01正转 10反正 11制动

2.2. 硬件接线

X1–>PWMA,X2–>AIN1,X3–>AIN2,X4–>PWMB,X5–>BIN1,X6–>BIN2,3V3–>VCC,GND–>GND

2.3. 测试代码

将代码替换复制到main.py中,硬件复位或者在REPL串口调试窗口中按 CTRL+D,软启动,重新运行,倾斜和放正电机动作,按USR按键退出测试循环,可以再次使用REPL串口。 代码如下

# -*- coding: utf-8 -*-
# @Time    : 2019/05/26
# @Author  : WU HENG
# @File    : main.py
# @程序原理:通过板载加速度传感器,角度检查X,Y轴,通过倾斜和放正,分别负责打开关闭两路PWM通道
#           这两路PWM通道分别控制两路直流电机的速度,有pwm输出时pwm占空比固定为80%,无pwm输
#           出时为0。负载方向的IN1,IN2分别固定为1,0转向固定。
# @外设模块:TB6612FNG电机驱动模块,TB6612FNG的STBY接接高电平,不用引脚控制
# @接线引脚:X1-->PWMA,X2-->AIN1,X3-->AIN2,X4-->PWMB,X5-->BIN1,X6-->BIN2,3V3-->VCC,GND-->GND
# @实验现象:首先运行两边流水灯,进入循环,实现电机控制,倾斜或放正,按USR按键,退出循环,就可以使用repl调试了

from pyb import Timer
from pyb import Switch
from pyb import Accel
from pyb import LED
from pyb import Pin

accel = pyb.Accel() #创建加速度传感器对象
SENSITIVITY = 10    #创建加速度传感器的阈值设定对象
sw = Switch()       #创建板载开关对象

pwm1 = pyb.Timer(2, freq=1000) #第一路pwm频率为1k,X1

AIN1 = Pin('X2', Pin.OUT_PP)
AIN1.high()                    #第一路AIN1为高,X2
AIN2 = Pin('X3', Pin.OUT_PP)
AIN2.low()                     #第一路AIN2为低,X3

pwm2 = pyb.Timer(5, freq=1000) #第二路pwm频率为1k,X4

BIN1 = Pin('X5', Pin.OUT_PP)
BIN1.high()                    #第二路BIN1为高,X5
BIN2 = Pin('X6', Pin.OUT_PP)
BIN2.low()                     #第二路BIN2为高,X6


# LED 循环点亮熄灭子函数
def LED_loop_test():
    for i in range(1, 5):
        pyb.LED(i).on()
        pyb.delay(100)
        pyb.LED(i).off()
        pyb.delay(100)

LED_loop_test() #执行一次LED循环点亮函数
LED_loop_test()


while True:
  #x轴倾斜LED2亮起打开第一路PWM,y轴倾斜LED4亮起,打开第二路PMW
  x = accel.x()
  if abs(x) > SENSITIVITY:
      LED(2).on()
      tchannel1 = pwm1.channel(1, Timer.PWM,pin=pyb.Pin.board.X1, pulse_width_percent=80)#占空比为80%
  else:
      LED(2).off()
      tchannel1 = pwm1.channel(1, Timer.PWM,pin=pyb.Pin.board.X1, pulse_width_percent=0)#占空比为0%
  y = accel.y()

  if abs(y) > SENSITIVITY:
      LED(4).on()
      tchannel2 = pwm2.channel(4, Timer.PWM,pin=pyb.Pin.board.X4, pulse_width_percent=80)#占空比为80%
  else:
      LED(4).off()
      tchannel2 = pwm2.channel(4, Timer.PWM,pin=pyb.Pin.board.X4, pulse_width_percent=0)#占空比为0%
  pyb.delay(100) #延时

  if sw.value()==1:#当按键按下时跳出循环这时候可以使用串口的REPL功能调试了,因为在循环中无法使用串口功能顺便检查了按键是否管用
    break

LED_loop_test()#再运行一遍闪灯程序表明结束测试,可以使用REPL调试了