0基础 | STM32 | TB6612电机驱动使用
TB6612介绍及使用
单片机通过驱动板连接至电机
原因:单品机I/O口输出电流I小
驱动板:从外部引入高电压,控制电机驱动
电源部分
VM:电机驱动电源输入,输入电压范围建议为3.7~12V
GND:逻辑电源和电机驱动电源的公共地
VCC:逻辑电源输入,输入电压为
2.7-5.5V
电机接口
A0 B0可以接两个电机
电机控制端口
PWMA B分别为两个电机控制的使能端
(可使用PWM调速)
AIN1\\AIN2;BIN1\\BIN2
STBY
使能引脚
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
-
停止
H/L
H/L
H/L
L
OFF
-
待机
main.c
#include \"stm32f10x.h\"
#include \"led.h\"
#include \"usart.h\"
#include \"delay.h\"
#include \"oled.h\"
#include \"Motor.h\"
#include \"key.h\"
int key = 0;
int key_state = 0;
int main(void)
{ SystemInit();//系统时钟为72M
delay_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);
}if(key_state%4==2)
{Motor_SetSpeed(80);
OLED_ShowNum(56,24,2,1,16,1);}
if(key_state%4==3)
{Motor_SetSpeed(100);
OLED_ShowNum(56,24,3,1,16,1);}
if(key_state%4==0)
{Motor_SetSpeed(0); OLED_ShowNum(56,24,0,1,16,1); //0}}}
Motor.c
#include \"Motor.h\"
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; //预分频PSC
TIM_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; //CCR
TIM_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);}}
Motor.h
#ifndef __MOTOR_H
#define __MOTOR_H
#include \"stm32f10x.h\"
#include \"delay.h\"
#include \"sys.h\"
/***************根据自己需求更改****************/
// TB6612FNG电机驱动模块 GPIO宏定义
#define MOTOR_CLK RCC_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
代码放在下述连接里面,通过网盘分享的文件:TB6612电机调速资料
链接: https://pan.baidu.com/s/1D_d506c3pwiRzHCaSq2_Aw?pwd=HHRR 提取码: HHRR
--来自百度网盘超级会员v5的分享
此外还有一种电机驱动,介绍如下
微型双路直流电机驱动基于TB6612FNG驱动IC设计,采用特殊逻辑控制方式,仅需4根管脚即可实现双路电机控制,相比纯芯片而言,减少了两个IO管脚,为Arduino等控制器节约了宝贵的IO资源,可以应用在更多领域中。
TB6612FNG是一块双路全桥驱动芯片,单通道最大连续驱动电流可达1.2A,峰值2A/3.2A(连续脉冲/单脉冲),可驱动一些微型直流电机。控制逻辑与L298N类似,代码上可直接兼容DFRobot L298N电机驱动。标准XH2.54排针可直插面包板,无论是DIY制作,还是新产品开发,都是非常理想的一个选择!
产品参数
- 逻辑部分输入电压VCC:3.3~5V
- 驱动部分输入电压VM:2.5~12V
- 驱动电机路数:2通道
- 单通道最大连续驱动电流:1.2A
- 启动峰值:2A/3.2A(连续脉冲/单脉冲)
- 接口方式:2.54mm间距排针
模块尺寸:20 × 19.5(mm)
细节说明
电机接口:M1,M2 可接入两个电机,其中标注了“+”、“-”表示两个电机的接线方向。
指示灯:正面指示灯:电源指示灯
电源部分
VCC:逻辑电源输入,输入电压为5V;
VM:电机驱动电源输入,输入电压范围建议为3.7~12V;
GND:逻辑电源和电机驱动电源的公共地。
电机控制端口
PWM1,PWM2:分别为两个电机控制的使能端(可使用PWM调速)
DIR1,DIR2:正反转控制信号输入端。比如,DIR1=1,M1电机正转; DIR1=0,M1电机反转。
引脚说明
管脚映射
标号
名称
功能描述
1
DIR1
电机M1的方向控制引脚
3
PWM2
电机M2的速度控制引脚
4
DIR2
电机M2的方向控制引脚
5
GND
逻辑部分电源负极
6
VCC
逻辑部分电源正极
7
M1+
M1路电机输出1
8
M1-
M1路电机输出2
9
M2+
M2路电机输出1
10
M2-
M2路电机输出2
11
GND
电机电源负极
12
VM(<12V)
电机电源正极
模块尺寸:20 × 19.5(m\\