stm32模块笔记:TB6612电机驱动模块
TB6612可同时驱动两个方向不同的电机,并且最高可以驱动额定电压为12v的电机以上仅仅展示了如何使用TB6612驱动电机,如果想使用电机到具体的项目中的话,需要精进代码,进行高级功能的拓展。如通过加速度控制,避免电机以较大速度突然的启动和停止,避免对机械结构的冲击。或使用编码电机,通过PID算法来提升对电机的控制。
·
目录
1.模块简介
TB6612可同时驱动两个方向不同的电机,并且最高可以驱动额定电压为12v的电机

1.电源接线
vcc接逻辑电源,GND接地,VM接电机驱动电源,通常接较高的电压,以为电机供电。
STBY控制芯片的工作状态,当接高电平时,芯片正常工作,当接低电平时,芯片处于待机状态。
一般STBY接正电平即可。
2.电机控制
stm32通过PWM来控制电机速度,通过AIN或BIN控制电机方向,tb6612的AO及BO端口来驱动电机运行。
AIN和BIN控制电机方向的规则如下
当IN1为高电平,IN2为低电平时,电机正转,IN2为高电平,IN1为低电平时,电机反转。其余情况,如IN1和IN2都为高电平,电机制动。
2.代码实现
1.硬件配置
PWM信号通过TIM2实现,使用通道3,所以选用PA2,电机方向控制通过AIN1和AIN2,选用PA4和PA5。
2.PWM部分代码
配置GPIO口
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启定时器时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//开启IO口时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//配置为复用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
配置TIM2
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;//选择PWM模式1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//向上计数模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//使能输出比较
TIM_OCInitStructure.TIM_Pulse = 50;//CRR
TIM_OC3Init(TIM2,&TIM_OCInitStructure);
TIM_Cmd(TIM2,ENABLE);
PWM部分搞定,就可以开始编写电机的代码了
3.电机驱动部分
void Motor_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
PWM_Init();
}
void Motor_Get(int8_t Speet)
{
if(Speet >= 0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_ResetBits(GPIOA,GPIO_Pin_5);
PWM_SetCompare1(Speet);
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_5);
PWM_SetCompare1(-Speet);
}
}
3.总结
以上仅仅展示了如何使用TB6612驱动电机,如果想使用电机到具体的项目中的话,需要精进代码,进行高级功能的拓展。
如通过加速度控制,避免电机以较大速度突然的启动和停止,避免对机械结构的冲击。
或使用编码电机,通过PID算法来提升对电机的控制。
更多推荐



所有评论(0)