目录

1.模块简介

1.电源接线

2.电机控制

2.代码实现

1.硬件配置

2.PWM部分代码

3.电机驱动部分

3.总结


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算法来提升对电机的控制。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐