电机驱动----TB6612FNG(STM32F103C8T6)

目录

一、简介

1.概念

2.引入

二、特性

三、引脚定义

四、控制过程

控制说明:

总结:

五、简单demo

接线说明:

1.GPIO初始化

2.PWM初始化

3.电机正反转控制

4.主函数逻辑


一、简介

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 引脚间距)

三、引脚定义

引脚号引脚名类型说明
1AO1O通道A输出1
2AO1
3PGND1——电源接地1
4PGND1
5AO2O通道A输出2
6AO2
7BO2O通道B输出2
8BO2
9PGND2——电源接地2
10PGND2
11BO1O通道B输出1
12BO1
13VM2——电源输入,最大15V
14VM3
15PWMBI通道B的PWM输入引脚,内接200KΩ下拉电阻
16BIN2I通道B逻辑输入2引脚,内接200KΩ下拉电阻
17BIN1I通道B逻辑输入1引脚,内接200KΩ下拉电阻
18GND——接地
19STBYI待机引脚,接低电平处于待机模式,接高电平开始工作
20Vcc——电源输入
21AIN1I通道A逻辑输入1引脚,内接200KΩ下拉电阻
22AIN2I通道A逻辑输入2引脚,内接200KΩ下拉电阻
23PWMAI通道A的PWM输入引脚,内接200KΩ下拉电阻
24VM1——电源输入,最大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 即可,并通过改变占空比来调节电机的速度,其电平对应的状态如下表所示:

AIN1010
AIN2001
运行状态停止正转反转

总结:

①PWM 信号控制输出电压大小从而达到控制转速的作用

②AIN1 与 ANI2 信号一起控制电机的正反转以及停止状态 

五、简单demo

接线说明:

PWMA    -----------    A8
AIN1    -----------    B14
AIN2    -----------    B15
STBY    -----------    5V

VM      -----------    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
	}
 }

  • 19
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是基于STM32F103C8T6TB6612FNG的电机转动代码示例,你可以根据实际情况进行修改: ```c #include "stm32f10x.h" #define AIN1_PIN GPIO_Pin_0 #define AIN2_PIN GPIO_Pin_1 #define BIN1_PIN GPIO_Pin_2 #define BIN2_PIN GPIO_Pin_3 #define STBY_PIN GPIO_Pin_4 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = AIN1_PIN | AIN2_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = BIN1_PIN | BIN2_PIN | STBY_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOA, AIN1_PIN | AIN2_PIN); GPIO_ResetBits(GPIOB, BIN1_PIN | BIN2_PIN | STBY_PIN); } void Motor_A_Forward(void) { GPIO_SetBits(GPIOA, AIN1_PIN); GPIO_ResetBits(GPIOA, AIN2_PIN); } void Motor_A_Backward(void) { GPIO_ResetBits(GPIOA, AIN1_PIN); GPIO_SetBits(GPIOA, AIN2_PIN); } void Motor_A_Stop(void) { GPIO_ResetBits(GPIOA, AIN1_PIN | AIN2_PIN); } void Motor_B_Forward(void) { GPIO_SetBits(GPIOB, BIN1_PIN); GPIO_ResetBits(GPIOB, BIN2_PIN); } void Motor_B_Backward(void) { GPIO_ResetBits(GPIOB, BIN1_PIN); GPIO_SetBits(GPIOB, BIN2_PIN); } void Motor_B_Stop(void) { GPIO_ResetBits(GPIOB, BIN1_PIN | BIN2_PIN); } int main(void) { GPIO_Configuration(); while (1) { Motor_A_Forward(); Motor_B_Forward(); GPIO_SetBits(GPIOB, STBY_PIN); delay_ms(1000); Motor_A_Backward(); Motor_B_Backward(); GPIO_SetBits(GPIOB, STBY_PIN); delay_ms(1000); Motor_A_Stop(); Motor_B_Stop(); GPIO_ResetBits(GPIOB, STBY_PIN); delay_ms(1000); } } void delay_ms(uint32_t ms) { uint32_t i, j; for (i = 0; i < ms; i++) for (j = 0; j < 9000; j++); } ``` 注:以上代码仅供参考,具体实现要根据硬件电路和实际需求进行修改。 ### 回答2: 要控制TB6612FNG电机转动,可以使用STM32F103C8T6PWMB开发板和相应的代码。 首先,需要配置STM32F103C8T6PWMB的GPIO引脚作为输出模式,用于控制TB6612FNG电机驱动模块。接下来,可以使用PWM信号控制电机的转速。 首先,初始化PB8、PB9、PB10、PB11引脚作为输出模式,用于控制电机的IN1、IN2、IN3、IN4输入。代码如下: ``` RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使能GPIOB时钟 GPIOB->CRH &= ~GPIO_CRH_CNF8_0; // 选择推挽输出模式 GPIOB->CRH |= GPIO_CRH_MODE8; // 设置输出模式为10MHz GPIOB->CRH &= ~GPIO_CRH_CNF9_0; GPIOB->CRH |= GPIO_CRH_MODE9; GPIOB->CRL &= ~GPIO_CRL_CNF10_0; GPIOB->CRL |= GPIO_CRL_MODE10; GPIOB->CRL &= ~GPIO_CRL_CNF11_0; GPIOB->CRL |= GPIO_CRL_MODE11; ``` 然后,可以使用PWM信号控制电机转速,使用TIM3定时器和通道3和通道4来产生PWM信号。代码如下: ``` RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; // 使能TIM3时钟 GPIOB->CRL &= ~GPIO_CRL_CNF0_0; // PB0配置为复用输出 GPIOB->CRL |= GPIO_CRL_CNF0_1; GPIOB->CRL |= GPIO_CRL_MODE0_0; GPIOB->CRL &= ~GPIO_CRL_MODE0_1; TIM3->PSC = 0; // 设置预分频系数为1 TIM3->ARR = 255; // 设置自动重载寄存器的值为255 TIM3->CCR3 = 128; // 设置通道3占空比初始值为50% TIM3->CCR4 = 0; // 设置通道4占空比初始值为0% TIM3->CCMR2 |= TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC3M_1; // PWM模式1 TIM3->CCMR2 &= ~TIM_CCMR2_OC3M_0; TIM3->CCMR2 |= TIM_CCMR2_OC4M_2 | TIM_CCMR2_OC4M_1; TIM3->CCMR2 &= ~TIM_CCMR2_OC4M_0; TIM3->CCER |= TIM_CCER_CC3E; // 使能通道3输出 TIM3->CCER |= TIM_CCER_CC4E; // 使能通道4输出 TIM3->CR1 |= TIM_CR1_CEN; // 使能定时器 ``` 以上代码是一个简单的示例,可以根据需要进行修改和扩展。在这个示例中,GPIOB引脚8至11配置为输出模式,用于控制TB6612FNG电机驱动模块的输入信号。TIM3定时器配置为PWM模式,使用通道3控制IN1输入信号,通道4控制IN2输入信号,以控制电机转速。 这是一个基本的代码框架,你可以根据具体的电机和需求进行相应的调整和优化。这里只是提供了一个简单的示例作为参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值