基于STM32F103C8T6控制TB6612FNG/DRV8833模块驱动直流电机和两相四线步进电机

电子说

1.4w人已加入

描述

一、TB6612FNG/DRV8833电机驱动模块简介

DRV8833该器件具有两个H桥驱动器,能够驱动两部直流刷式电机、 一部双极步进电机、多个螺线管或其他感性负载。每个H桥的输出驱动器模块由配置为H桥的N沟道功率MOSFET组成,用于驱动电机绕组。每个H桥均具备调节或限制绕组电流的电路。该器件利用故障输出引脚实现内部关断功能,提供过流保护、短路保护、欠压锁定和过热保护。
TB6612FNG是一款双路直流电机驱动芯片。它采用H桥设计,可独立驱动两路直流电机或一台步进电机,适用于机器人、小型智能车等项目。该芯片支持正反转、刹车和待机功能,具有高效率、低功耗的特点。TB6612FNG可提供MAX每通道1.2A的连续电流和高达3.2A的峰值电流,工作电压范围广,且集成了过热和欠压保护, 广泛应用于嵌入式控制系统中。
drv8833

二、模块特性

DRV8833TB6612FNG
双H桥电机驱动器:可驱动两个直流电机或一个双极步进电机双H桥电机驱动器:可驱动两个直流电机或一个双极步进电机
工作电压:2.7 V 至 10.8 V工作电压:4.5 V 至 13.5 V
输出电流:每个电机1.2 A连续(2 A峰值)输出电流:每通道1A连续(3A峰值)
电机输出可以并联,为单个电机连续输出2.4 A电机输出可以并联,为单个电机连续输出2 A
输入支持3V和5V接口逻辑电压(VCC):2.7 V 至 5.5 V
低压锁定及对过电流和过热的保护最大PWM频率:100 kHz

三、模块引脚说明

DRV8833
VM逻辑电源和电机电源,电压范围:2.7V-10.8V
GND接地
STBY待机控制,低电平或悬空有效,接高电平工作
NC空脚
AIN1-2电机A逻辑输入,控制方向和转速
BIN1-2电机B逻辑输入,控制方向和转速
AO1-2电机A输出
BO1-2电机B输出
TB6612FNG
VCC逻辑电源,电压范围:2.7V-5.5V
VM电机电源,电压范围:4.5V-13.5V
GND接地
STBY待机控制,低电平或悬空有效,接高电平工作
PWMA通道A的PWM输入,控制电机A转速
AIN1-2电机A逻辑输入,控制方向
PWMB通道B的PWM输入,控制电机B转速
BIN1-2电机B逻辑输入,控制方向
AO1-2电机A输出
BO1-2电机B输出

TB6612FNG的特别说明:PWMA,PWMB引脚就是一个使能引脚,如果不需要调速,可将这两个引脚直接接高电平使能,逻辑输入接高低电平,实现纯硬件控制驱动。

四、模块逻辑驱动和PWM调速

当TB6612FNG的PWMA,PWMB接高电平时,硬件逻辑驱动与DRV8833逻辑驱动一样。注意:STBY需要接高电平才能正常工作。
逻辑驱动:

xIN1xIN2功能
HH制动 / 慢速衰减
HL正转
LH反转
LL滑行 / 快速衰减

从机械的角度说明:制动是指电机立即刹车,快速停止。而滑行是指电机靠惯性自由滑行,缓慢停下。

DRV8833的PWM调速:

xIN1xIN2功能
PWML正转PWM,快速衰减
HPWM正转PWM,快速衰减
LPWM反转PWM,慢速衰减
PWMH反转PWM,慢速衰减

而TB6612FNG的调速,是根据PWMA/B引脚控制调速,xIN1-2控制方向。与L298N模块类似。

五、基于STM32F103C8T6控制直流电机正反转与调速

这里以控制TB6612FNG驱动为例。注意:TB6612FNG模块是没有过流保护功能,使用时需要加限流和散热,否则可能烧坏模块或电机。

准备工作

STM32F103C8T6最小系统板,TB6612FNG模块,直流电机。

接线说明

STM32F103C8T6TB6612FNG
PA0AIN1
PA1AIN2
PA2BIN1
PA3BIN2
PA6PWMA
PA7PWMB
AO1-2电机1
AO1-2电机2
5VVCC与STBY
电机电源VM
共地GND

效果展示

drv8833

六、基于STM32F103C8T6控制两相四线步进电机

其工作原理,可参考这篇文章[https://blog.csdn.net/qq_42250136/article/details/144696271?],这里就不再赘述。

准备工作

STM32F103C8T6最小系统板,TB6612FNG模块,两相四线步进电机。

接线说明

STM32F103C8T6TB6612FNG
PA0AIN1
PA1AIN2
PA2BIN1
PA3BIN2
AO1-2步进电机A相
AO1-2步进电机B相
5VVCC与STBY,以及PWMA/B
电机电源VM
共地GND

效果展示

drv8833

七、代码示例

TB6612FNG_DRV8833.c

#include "tb6612_8833.h"
#include "delay.h"
#include "timer.h"

void TB6612_8833_Init(void)
{
	//通过旋转编码器控制步进电机正转,翻转,加减速,停止
	GPIO_InitTypeDef GPIO_InitStructurn;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructurn.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructurn.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
	GPIO_InitStructurn.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructurn);
}

void Motor1_Stop(void)	//电机1停止
{
	IN1(0); IN2(0);
}

void Motor2_Stop(void)	//电机2停止
{
	IN3(0); IN4(0);
}

void ALL_Stop(void)	//两个电机全停止
{
	IN1(0); IN2(0); IN3(0); IN4(0);
}

void Motor1_Zturn(void)	//电机1正转
{
	IN1(1); IN2(0);
}

void Motor1_Rturn(void)	//电机1反转
{
	IN1(0); IN2(1);
}

void Motor2_Zturn(void)	//电机2正转
{
	IN3(1); IN4(0);
}

void Motor2_Rturn(void)	//电机2反转
{
	IN3(0); IN4(1);
}

void Motor_Single4(uint8_t temp)	//单4拍
{
	switch (temp)
	{
		case 1:  IN1(1);IN2(0);IN3(0);IN4(0); break;
		case 2:  IN1(0);IN2(1);IN3(0);IN4(0); break;
		case 3:  IN1(0);IN2(0);IN3(1);IN4(0); break;
		case 4:  IN1(0);IN2(0);IN3(0);IN4(1); break;
	}
}

void Motor_Double4(uint8_t temp)	//双4拍
{
	switch (temp)
	{
		case 1:  IN1(0);IN2(1);IN3(1);IN4(0); break;
		case 2:  IN1(0);IN2(1);IN3(0);IN4(1); break;
		case 3:  IN1(1);IN2(0);IN3(0);IN4(1); break;
		case 4:  IN1(1);IN2(0);IN3(1);IN4(0); break;
	}
}

void Motor_Corotation(uint8_t temp)	 //正转
{
	switch (temp)
	{
		case 1:  IN1(1);IN2(0);IN3(0);IN4(0); break;
		case 2:  IN1(1);IN2(0);IN3(1);IN4(0); break;
		case 3:  IN1(0);IN2(0);IN3(1);IN4(0); break;
		case 4:  IN1(0);IN2(1);IN3(1);IN4(0); break;
		case 5:  IN1(0);IN2(1);IN3(0);IN4(0); break;
		case 6:  IN1(0);IN2(1);IN3(0);IN4(1); break;
		case 7:  IN1(0);IN2(0);IN3(0);IN4(1); break;
		case 8:  IN1(1);IN2(0);IN3(0);IN4(1); break;
	}
}

void Motor_Reverse(uint8_t temp)	//反转
{
	switch (temp)
	{
		case 1:  IN1(1);IN2(0);IN3(0);IN4(1); break;
		case 2:  IN1(0);IN2(0);IN3(0);IN4(1); break;
		case 3:  IN1(0);IN2(1);IN3(0);IN4(1); break;
		case 4:  IN1(0);IN2(1);IN3(0);IN4(0); break;
		case 5:  IN1(0);IN2(1);IN3(1);IN4(0); break;
		case 6:  IN1(0);IN2(0);IN3(1);IN4(0); break;
		case 7:  IN1(1);IN2(0);IN3(1);IN4(0); break;
		case 8:  IN1(1);IN2(0);IN3(0);IN4(0); break;
	}
}

main.c

#include "stm32f10x.h"                  // Device header
#include "encoder.h"
#include "tb6612_8833.h"
#include "timer.h"
#include "delay.h"
#include "pwm.h"
#include "key.h"
#include "oled.h"

int32_t RxData = 500;
uint8_t MotorStart = 0;
uint8_t step, KeyNum;

int main(void)
{
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	Key_Init();
	TB6612_8833_Init();
	Encoder_Init();
	Timer_Inti();
	PWM_Init();
	OLED_Init();
	
	while(1)
	{		
		RxData +=Encoder_Get();
		
		if(RxData <= 0) RxData = 0;
		if(RxData >= 1000) RxData = 1000;
		
		//直流电机驱动
		if(Key_Get()) MotorStart = !MotorStart;
		OLED_ShowNum(1,1,MotorStart,2);
		if(MotorStart)
		{
			//直流电机控制正反转,调速
			TIM_SetCompare1(TIM3,RxData);
			
			if(Encoder_GetKey() == 0)
			{
				Motor1_Zturn();
				Motor2_Zturn();
			}else{
				Motor1_Rturn();
				Motor2_Rturn();
			}
			
		}else{
			ALL_Stop();
		}
		
		
	
		//步进电机驱动
//		switch(Encoder_GetKey())
//			{
//				case 0:
//					Motor_Corotation(step);
//					delay_ms(100);
//					break;
//				case 1:
//					Motor_Reverse(step);
//					delay_ms(100);
//					break;
//			}
	}
}


void TIM2_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
	{
		step++;
		KeyNum++;
		
		if(KeyNum >= 20)
		{
			Key_Loop();
			KeyNum = 0;
		}
		
		if(step > 8)
		{
			step = 1;
		}
		 
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
	}
}

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分