TB6612电机驱动模块(STM32)_tb6612电机驱动原理图
目录
一、介绍
二、模块原理
1.原理图
2.电机驱动原理
三、程序设计
main.c文件
Motor.h文件
Motor.c文件
四、实验效果
五、资料获取
项目分享
一、介绍
TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流 MOSFET-H 桥结构,双通道电路输出,可同时驱动 2 个电机。它具有很高的集成度,同时能提供足够的输出能力,运行性能和能耗方面也具有优势,因此在集成化、小型化的电机控制系统中,它可以作为理想的电机驱动器件。
以下是TB6612电机驱动模块的参数:
型号
TB6612FNG
驱动电压
VM输入(4.5-10V)
逻辑电平
VCC输入(2.7-5.5V)
工作电流
1.2A
峰值电流
3.2A
哔哩哔哩视频链接:
TB6612电机驱动模块(STM32)
(资料分享见文末)
二、模块原理
1.原理图
2.电机驱动原理
三、程序设计
使用STM32F103C8T6通过TB6612控制电机完成开关、正反转转和调速的操作。
AIN1
PA0
AIN2
PA1
PWMA
PA2
STBY
+5V
OLED_SCL
PB11
OLED_SDA
PB10
main.c文件
#include \"stm32f10x.h\"#include \"led.h\"#include \"usart.h\"#include \"delay.h\"#include \"oled.h\"#include \"Motor.h\"#include \"key.h\"/*****************辰哥单片机设计******************STM32 * 项目:TB6612FNG电机驱动实验* 版本: V1.0 * 日期: 2024.9.26 * MCU:STM32F103C8T6 * 接口:参看Motor.h * BILIBILI:辰哥单片机设计 * CSDN:辰哥单片机设计 * 作者:辰哥 **********************BEGIN***********************/int key = 0;int key_state = 0;int main(void){ SystemInit();//配置系统时钟为72Mdelay_init(72);LED_Init();LED_On();MOTOR_Init();USART1_Config();//串口初始化Key_Init();OLED_Init();printf(\"Start \\n\");delay_ms(1000);OLED_Clear();//显示“电机转速:”OLED_ShowChinese(0,0,0,16,1);OLED_ShowChinese(16,0,1,16,1);OLED_ShowChinese(32,0,2,16,1);OLED_ShowChinese(48,0,3,16,1);OLED_ShowChar(64,0,\':\',16,1); while (1) {key = Key_GetData();if(key)key_state++;if(key_state%4==1){Motor_SetSpeed(60);OLED_ShowNum(56,24,1,1,16,1);//1}if(key_state%4==2){Motor_SetSpeed(80);OLED_ShowNum(56,24,2,1,16,1);//2}if(key_state%4==3){Motor_SetSpeed(100);OLED_ShowNum(56,24,3,1,16,1);//3}if(key_state%4==0){Motor_SetSpeed(0);OLED_ShowNum(56,24,0,1,16,1);//0} }}
Motor.h文件
#ifndef __MOTOR_H#define__MOTOR_H#include \"stm32f10x.h\"#include \"delay.h\"#include \"sys.h\"/*****************辰哥单片机设计******************STM32 * 文件:TB6612FNG电机驱动h文件 * 版本: V1.0 * 日期: 2024.9.26 * MCU:STM32F103C8T6 * 接口:见代码 * BILIBILI:辰哥单片机设计 * CSDN:辰哥单片机设计 * 作者:辰哥**********************BEGIN***********************//***************根据自己需求更改****************/// TB6612FNG电机驱动模块 GPIO宏定义#defineMOTOR_CLKRCC_APB2Periph_GPIOA#define MOTOR_AIN1_GPIO_PIN GPIO_Pin_0#define MOTOR_AIN2_GPIO_PIN GPIO_Pin_1#define MOTOR_AIN1_GPIO_PORT GPIOA#define MOTOR_AIN2_GPIO_PORT GPIOA#define MOTOR_PWMA_GPIO_PIN GPIO_Pin_2#define MOTOR_PWMA_GPIO_PORT GPIOA/*********************END**********************/void MOTOR_Init(void);void PWM_Init(void);void Motor_SetSpeed(int8_t Speed);#endif
Motor.c文件
#include \"Motor.h\"/*****************辰哥单片机设计******************STM32 * 文件:TB6612FNG电机驱动模块c文件 * 版本: V1.0 * 日期: 2024.9.26 * MCU:STM32F103C8T6 * 接口:见代码 * BILIBILI:辰哥单片机设计 * CSDN:辰哥单片机设计 * 作者:辰哥**********************BEGIN***********************/void MOTOR_Init(void){GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(MOTOR_CLK, ENABLE ); //配置时钟GPIO_InitStructure.GPIO_Pin = MOTOR_AIN1_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(MOTOR_AIN1_GPIO_PORT,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = MOTOR_AIN2_GPIO_PIN;GPIO_Init(MOTOR_AIN2_GPIO_PORT,&GPIO_InitStructure);PWM_Init();}void PWM_Init(void){RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = MOTOR_PWMA_GPIO_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(MOTOR_PWMA_GPIO_PORT, &GPIO_InitStructure);//将PA1和PA2引脚初始化为推挽输出TIM_InternalClockConfig(TIM2);//配置实际单元TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;//自动重装ARR分辨率TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;//预分频PSCTIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);TIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCStructInit(&TIM_OCInitStructure);//给结构体赋予初值 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse = 0;//CCRTIM_OC3Init(TIM2,&TIM_OCInitStructure);TIM_Cmd(TIM2,ENABLE);}void PWM_SetCompare3(uint16_t compare){TIM_SetCompare3(TIM2,compare);}void Motor_SetSpeed(int8_t Speed){if(Speed >= 0){GPIO_SetBits(MOTOR_AIN1_GPIO_PORT,MOTOR_AIN1_GPIO_PIN);GPIO_ResetBits(MOTOR_AIN2_GPIO_PORT,MOTOR_AIN2_GPIO_PIN);PWM_SetCompare3(Speed);}else{GPIO_ResetBits(MOTOR_AIN1_GPIO_PORT,MOTOR_AIN1_GPIO_PIN);GPIO_SetBits(MOTOR_AIN2_GPIO_PORT,MOTOR_AIN2_GPIO_PIN);PWM_SetCompare3(-Speed);}}