早上好啊,大佬们。这一期咱们来评一评TB6612这一款驱动,简单好用,便宜耐造
文章目录
前言
这里先给大伙提供一下代码例程文件 ——
链接:小白兔的礼物——tb6612驱动
提取码:tg58
解压密码:hbljdxbt
TB6612介绍
TB6612FNG 是一款常用的直流电机驱动模块,基于东芝公司的 TB6612FNG 芯片设计,专为控制小型直流电机或步进电机而开发。
模块特性
双通道驱动
可独立控制 2个直流电机 或 1个两相步进电机。
每个通道持续输出电流 1.2A(峰值 3.2A),适合中小功率电机。
宽电压范围
电机驱动电压:2.5V–13.5V(需匹配电机额定电压)。
逻辑控制电压:2.7V–5.5V(兼容 Arduino、STM32 等单片机)。
高效低功耗
内置 MOSFET 设计,效率高于传统驱动芯片(如 L298N),发热更少。
PWM 调速支持
通过 PWM 信号调节电机转速,支持高频 PWM(最高可达 100kHz)。
待机模式
通过 STBY 引脚控制芯片启停,低功耗待机时关闭电机输出。
引脚说明
电机控制端
引脚口 | 功能 |
---|---|
AIN1/AIN2 | 控制 A 通道电机方向(如 AIN1=HIGH, AIN2=LOW 为正转)。 |
BIN1/BIN2 | 控制 B 通道电机方向。 |
PWMA/PWMB | 接收 PWM 信号调节 A/B 通道速度。 |
VM | 接电机电源(2.5–13.5V),GND 为电源地。 |
逻辑控制端
引脚口 | 功能 |
---|---|
VCC | 接单片机逻辑电源(3.3V/5V)。 |
STBY | 高电平启用芯片,低电平进入待机模式。 |
使用说明
TB6612FNG 每个通道(A/B)内部包含一个 全H桥电路,由 4个 MOSFET 管 组成,通过开关组合控制电流方向,从而驱动电机正转或反转。
4个 MOSFET 分为两组(Q1-Q2 和 Q3-Q4),通过逻辑信号控制开关状态,形成不同的电流路径。
控制逻辑
输入 | 输入 | 输入 | 输入 | 输出 | 输出 | 模式状态 |
---|---|---|---|---|---|---|
IN1 | IN2 | PWM | STBY | O1 | O2 | |
H | H | H/L | H | L | L | 制动 |
L | H | H | H | L | H | 反转 |
L | H | L | H | L | L | 制动 |
H | L | H | H | H | L | 正转 |
H | L | L | H | L | L | 制动 |
L | L | H | H | OFF | OFF | 停止 |
H/L | H/L | H/L | L | OFF | OFF | 待机 |
代码编写
接线
tb6612 | stm32 |
---|---|
PWMA | PA0 |
AIN2 | PB0 |
AIN1 | PB1 |
STBY | 3V3 |
VM | 5 ~ 12V |
VCC | 3V3 |
GND | GND |
AO1 | 电机正(不是stm32) |
AO2 | 电机负(不是stm32) |
代码
timer.c 和 timer.h 这两个代码和前一期里的舵机里面的是一样的。
pwm.c 和 pwm.h 就是删掉了几个没用到的通道口,然后把 arr 的值改成了 100,psc的值改成了36。
PWM.c
#include "stm32f10x.h" // Device header
#include "Timer.h"
#include "PWM.h"
void PWM_Init(void)
{
Timer_Init(100, 36);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA0引脚初始化为复用推挽输出
//受外设控制的引脚,均需要配置为复用模式
TIM_OCInitTypeDef TIM_OCInitStructure; //定义结构体变量
TIM_OCStructInit(&TIM_OCInitStructure); //结构体初始化,若结构体没有完整赋值
//则最好执行此函数,给结构体所有成员都赋一个默认值
//避免结构体初值不确定的问题
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //输出比较模式,选择PWM模式1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性,选择为高,若选择极性为低,则输出高低电平取反
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //初始的CCR值
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
}
void PWM_SetCompare1(uint16_t Compare)
{
TIM_SetCompare1(TIM2, Compare); //设置CCR2的值
}
PWM.h
#ifndef __PWM_H
#define __PWM_H
void PWM_Init(void);
void PWM_SetCompare1(uint16_t Compare);
#endif
motor.c
#include "stm32f10x.h" // Device header
#include "PWM.h"
void Motor_Init(void)
{
/*开启时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB的时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure); //将PB0和PB1引脚初始化为推挽输出
PWM_Init(); //初始化直流电机的底层PWM
}
void Motor_SetSpeed(int8_t Speed)
{
if (Speed >= 0) //如果设置正转的速度值
{
GPIO_SetBits(GPIOB, GPIO_Pin_0); //PB0置高电平
GPIO_ResetBits(GPIOB, GPIO_Pin_1); //PB1置低电平
//也就是设置方向为正转
PWM_SetCompare1(Speed); //PWM设置为速度值
}
else //否则,即设置反转的速度值
{
GPIO_ResetBits(GPIOB, GPIO_Pin_0); //PB0置低电平
GPIO_SetBits(GPIOB, GPIO_Pin_1); //PB1置高电平
//也就是设置方向为反转
PWM_SetCompare1(-Speed); //PWM设置为负的速度值,因为此时速度值为负数,而PWM只能给正数
}
}
motor.h
#ifndef __MOTOR_H
#define __MOTOR_H
void Motor_Init(void);
void Motor_SetSpeed(int Speed);
#endif
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Motor.h"
int speed = -100;
int main()
{
Motor_Init();
OLED_Init();//函数定义初始化
OLED_ShowString(0, 0, "Speed:", OLED_8X16);
OLED_Update();
while(1)
{
OLED_ShowSignedNum(0, 16, speed, 3, OLED_8X16);
OLED_Update();
Motor_SetSpeed(speed);
Delay_s(2);
speed += 50;
if (speed > 100) speed = -100;
}
}
尾声
OK,本期的外设分享就到这里,大家可以直接使用我提供的例程,但还是建议大伙能学习一下这个模块,写一个属于自己的例程。