目录
一、简介
1.概念
TB6612FNG 是一种用于直流电机的驱动 IC,具有低导通电阻的 LD MOS 结构输出晶体管。通过两个输入信号 IN1 和 IN2,可以选择以下四种模式之一:顺时针(CW)、逆时针(CCW)、短刹车(short brake)和停止模式(stop mode)。
2.引入
TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流 MOSFET-H 桥结构,双通道电路输出,可同时驱动 2 个电机。也许大家更熟悉 L298N, 其实这两者的使用基本一致的。而且,相比 L298N 的热耗性和外围二极管续流电路, 它无需外加散热片,外围电路简单,只需外接电源滤波电容就可以直接驱动电机,利于减小系统尺寸。对于 PWM 信号输入频率范围,高达 100 kHz 的频率更是足以满足我们大部分的需求了。
二、特性
- 电源电压:VM = 15V(最大值)
- 输出电流:IOUT = 1.2A(平均)/ 3.2A(峰值)
- 输出低导通电阻:0.5Ω(上管+下管,典型值 @ VM ≥ 5V)
- 待机(省电)系统 • 顺时针/逆时针/短刹车/停止功能模式
- 内置过热关断电路和低电压检测电路
- 小型封装(SSOP24:0.65 mm 引脚间距)
三、引脚定义
引脚号 | 引脚名 | 类型 | 说明 |
1 | AO1 | O | 通道A输出1 |
2 | AO1 | ||
3 | PGND1 | —— | 电源接地1 |
4 | PGND1 | ||
5 | AO2 | O | 通道A输出2 |
6 | AO2 | ||
7 | BO2 | O | 通道B输出2 |
8 | BO2 | ||
9 | PGND2 | —— | 电源接地2 |
10 | PGND2 | ||
11 | BO1 | O | 通道B输出1 |
12 | BO1 | ||
13 | VM2 | —— | 电源输入,最大15V |
14 | VM3 | ||
15 | PWMB | I | 通道B的PWM输入引脚,内接200KΩ下拉电阻 |
16 | BIN2 | I | 通道B逻辑输入2引脚,内接200KΩ下拉电阻 |
17 | BIN1 | I | 通道B逻辑输入1引脚,内接200KΩ下拉电阻 |
18 | GND | —— | 接地 |
19 | STBY | I | 待机引脚,接低电平处于待机模式,接高电平开始工作 |
20 | Vcc | —— | 电源输入 |
21 | AIN1 | I | 通道A逻辑输入1引脚,内接200KΩ下拉电阻 |
22 | AIN2 | I | 通道A逻辑输入2引脚,内接200KΩ下拉电阻 |
23 | PWMA | I | 通道A的PWM输入引脚,内接200KΩ下拉电阻 |
24 | VM1 | —— | 电源输入,最大15V |
TB6612 与TB6612FNG的原理图:
两者具体差别不大,TB6612FNG 是在 TB6612 基础上进一步优化和改进的版本,提供了更高的性能和更多的功能。下面举例TB6612的控制和使用过程。
四、控制过程
控制说明:
①VM 直接接电池
②VCC 是内部的逻辑供电,一般给 3.3 或者 5V 都行。
③GND 一个接电源地,一个接单片机地。
④STBY 置高模块才能正常工作。
⑤上图中红色部分的 5 个引脚控制一路 电机,蓝色部分的控制另外一路电机,这里只讲其中的 A 路, B 路的使用是一样 的。 AO1 和 AO2 分别接到电机的+和-。然后通过 PWMA、 AIN2、 AIN1 控制电机。 其中 PWMA 接到单片机的 PWM 引脚,一般 10Khz 的 PWM 即可,并通过改变占空比来调节电机的速度,其电平对应的状态如下表所示:
AIN1 | 0 | 1 | 0 |
AIN2 | 0 | 0 | 1 |
运行状态 | 停止 | 正转 | 反转 |
总结:
①PWM 信号控制输出电压大小从而达到控制转速的作用
②AIN1 与 ANI2 信号一起控制电机的正反转以及停止状态
五、简单demo
接线说明:
PWMA ----------- A8
AIN1 ----------- B14
AIN2 ----------- B15
STBY ----------- 5VVM ----------- 5-12V(外接电源)
GND ----------- GND (外接电源)
VCC ----------- 5V (逻辑电源)GND ----------- GND (逻辑共地)
AO1 ------------ 电机线电源+
AO2 ------------ 电机线电源-
1.GPIO初始化
void GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义结构体GPIO_InitStructure
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); // 使能PB端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14| GPIO_Pin_15; //PB14 PB15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽,增大电流输出能力
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度
GPIO_Init(GPIOB, &GPIO_InitStructure); //GBIOB初始化
}
2.PWM初始化
void PWM_Init(u16 arr,u16 psc)
{
//定义结构体
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIO外设时钟使能
//设置该引脚为复用输出功能,输出TIM1 CH1 CH4的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM1, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_CtrlPWMOutputs(TIM1,ENABLE); //MOE 主输出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1预装载使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM1, ENABLE); //使能TIM1
}
3.电机正反转控制
void Motor_Ctrol(int mode)
{
if(mode==1)
{
GPIO_SetBits(GPIOB, GPIO_Pin_14); // 高电平
GPIO_ResetBits(GPIOB, GPIO_Pin_15); // 低电平}
}
if(mode==0)
{
GPIO_SetBits(GPIOB, GPIO_Pin_15); // 高电平
GPIO_ResetBits(GPIOB, GPIO_Pin_14); // 低电平}
}
}
4.主函数逻辑
int main(void)
{
SystemInit(); //配置系统时钟为72M
delay_init(); //延时函数初始化
GPIO_Init(); //初始化gpio口B pin_14/pin_15
PWM_Init(7199,0); //初始化pwm输出 72000 000 /7199+1=10000
while(1)
{
Motor_Ctrol(0); //moto=1时正转
TIM_SetCompare1(TIM1,3000); //设置TIM1通道1的占空比 3000/7200
// Motor_Ctrol(1); //moto=0时反转
// TIM_SetCompare1(TIM1,4000); //设置TIM1通道1的占空比 4000/7200
}
}