STM32外设系列—TB6612FNG

这篇具有很好参考价值的文章主要介绍了STM32外设系列—TB6612FNG。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


🎀 文章作者:二土电子

🌸 关注文末公众号获取其他资料和工程文件!

🐸 期待大家一起学习交流!


本文涉及到定时器和串口的知识,详细内容可见博主STM32速成笔记专栏。

一、TB6612简介

TB6612FNG是东芝半导体的一款驱动电机的IC。一个TB6612FNG可以驱动两个电机,每一个驱动都有两个逻辑输入引脚,一个输出引脚和一个PWM引脚。可以通过给两个逻辑输入引脚不同的电平来控制电机的运行状态,通过PWM输入引脚实现电机调速。TB6612FNG还具有以下特点

  • 电源电压最大可到15V
  • 输出电流最大可达3.2A
  • 内置热停机电路和低压检测电路
  • 有正转,反转,短制动和停止四种模式

stm32驱动tb6612,STM32开发笔记—外设系列,stm32,单片机,嵌入式硬件,电机,TB6612

二、TB6612使用方法

2.1 TB6612引脚连接

引脚 连接
PWMA A通道的PWM输入
AIN2 A通道逻辑输入2引脚
AIN1 A通道逻辑输入1引脚
STBY 待机引脚,接低电平处于待机模式,接高电平开始工作
BIN1 B通道逻辑输入1引脚
BIN2 B通道逻辑输入2引脚
PWMB B通道PWM输入引脚
GND
VM 电源输入正极,最大接15V
VCC 逻辑电源正极,接3.3V
AO1 A通道输出1引脚
AO2 A通道输出2引脚
BO2 B通道输出2引脚
BO1 B通道输出1引脚

使用时VM接电机电源的正极,GND接电机电源的负极。IN1和IN2接逻辑输入,PWM接PWM输出引脚。O1和O2接电机的正负极。

2.2 控制逻辑

IN1和IN2的高低电平状态对应不同的电机运行状态,二者的对应关系如下

IN1 0 0 1
IN2 0 1 0
电机运行状态 停止 正转 反转

上述的正反转是AO1接电机正极,AO2接电机负极的对应关系。

2.3 电机调速

电机调速的远离比较简单,只需要给TB6612FNG的PWM输入引脚输入10KHz的PWM波。调节占空比即可调节转速。需要注意的是如果PWM配置的极性是低电平,那么设置占空比时的值越大,电机转速越低。相反,如果PWM配置的极性是高电平,那么设置占空比时的值越大,电机转速越高。

三、实战项目

3.1 项目简介

本项目比较简单,使用TB6612驱动一个12V减速电机。利用串口发送占空比,实现电机的调速。

3.2 初始化GPIO

初始化GPIO完成的工作是初始化逻辑控制引脚,程序如下

/*
 *==============================================================================
 *函数名称:Drv_MotorGpio_Init
 *函数功能:初始化Motor的GPIO
 *输入参数:无
 *返回值:无
 *备  注:这里只初始化了逻辑控制IO,PWM的IO在定时器配置PWM时初始化
 *==============================================================================
 */
void Drv_MotorGpio_Init (void)
{
	GPIO_InitTypeDef GPIO_InitStructure;   // 定义结构体
	// 开启时钟
	RCC_APB2PeriphClockCmd(MOTOR_GPIO_TIM,ENABLE);

	// 配置结构体
	GPIO_InitStructure.GPIO_Pin = MOTOR_GPIO_PIN;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   // 推挽式输出
	GPIO_Init(MOTOR_GPIO, &GPIO_InitStructure);
}

宏定义如下

// 电机逻辑控制GPIO
#define MOTOR_GPIO_TIM   RCC_APB2Periph_GPIOC
#define MOTOR_GPIO   GPIOC
#define MOTOR_GPIO_PIN   GPIO_Pin_7 | GPIO_Pin_8

3.3 PWM初始化

PWM初始化程序如下

/*
 *==============================================================================
 *函数名称:TIM2_CH1_PWM_Init
 *函数功能:初始化定时器2的PWM通道1
 *输入参数:per:自动重装载值;psc:预分频系数
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void TIM2_CH1_PWM_Init (u16 per,u16 psc)
{
	// 结构体定义
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	// 开启时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	// 初始化GPIO
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	// 初始化定时器参数
	TIM_TimeBaseInitStructure.TIM_Period = per;   // 自动装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler = psc;   // 分频系数
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;   // 设置向上计数模式
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);	
	
	// 初始化PWM参数
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   // 比较输出模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   // 输出极性
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   // 输出使能
	TIM_OC1Init(TIM2,&TIM_OCInitStructure);   // 输出比较通道1初始化
	
	TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);   // 使能TIMx在 CCR1 上的预装载寄存器
	TIM_ARRPreloadConfig(TIM2,ENABLE);   // 使能预装载寄存器
	
	TIM_Cmd(TIM2,ENABLE);   // 使能定时器	
}

初始化时配置如下,配置为10KHz

	TIM2_CH1_PWM_Init(1000,71);   // 初始化PWM

3.4 电机控制程序

电机正反转和停止控制程序如下

/*
 *==============================================================================
 *函数名称:Med_Motor_Go
 *函数功能:电机正转
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_Go (void)
{
	MOTOR_IN1 = 1;
	MOTOR_IN2 = 0;
}
/*
 *==============================================================================
 *函数名称:Med_Motor_Stop
 *函数功能:电机停转
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_Stop (void)
{
	MOTOR_IN1 = 0;
	MOTOR_IN2 = 0;
}
/*
 *==============================================================================
 *函数名称:Med_Motor_Reverse
 *函数功能:电机反转
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Med_Motor_Reverse (void)
{
	MOTOR_IN1 = 0;
	MOTOR_IN2 = 1;
}

宏定义如下

// 电机逻辑控制引脚
#define MOTOR_IN1   PCout(7)
#define MOTOR_IN2   PCout(8)

3.5 串口接收处理函数

串口需要根据接收到的占空比来配置输出PWM的占空比,配置占空比使用的库函数是

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1)

串口只支持输入大于100小于1000的占空比,串口接收处理程序如下文章来源地址https://www.toymoban.com/news/detail-626346.html

/*
 *==============================================================================
 *函数名称:USART1_IRQHandler
 *函数功能:USART1中断服务函数
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
u32 gReceCount = 0;   // 接收计数变量
u32 gClearCount = 0;   // 清空接收数组计数变量
u8 gReceFifo[1500];   // 接收数组
u8 gReceEndFlag = 0;   // 接收完成标志位 

void USART1_IRQHandler(void)  
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收到一个字节  
	{
		gReceFifo[gReceCount++] = USART_ReceiveData(USART1);
	}
	else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)   //接收到一帧数据
	{
		USART1->SR;   // 先读SR
		USART1->DR;   // 再读DR
		
		gReceEndFlag = 1;   // 接收完成标志置1 
	} 
}
/*
 *==============================================================================
 *函数名称:Uart_Rece_Pares
 *函数功能:解析串口接收内容
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{
	u16 pwmDuty = 0;   // 接收串口发送来的占空比
	
	if (gReceEndFlag  == 1)   // 如果接收完成
	{
		// 解析接收内容
		
		// 一位数
		if (gReceCount == 3)
		{
			pwmDuty = (gReceFifo[0] - 48);
		}
		else if (gReceCount == 4)
		{
			pwmDuty = (gReceFifo[0] - 48) * 10;
			pwmDuty = pwmDuty + (gReceFifo[1] - 48);
		}
		else if (gReceCount == 5)
		{
			pwmDuty = (gReceFifo[0] - 48) * 100;
			pwmDuty = pwmDuty + (gReceFifo[1] - 48) * 10;
			pwmDuty = pwmDuty + (gReceFifo[2] - 48);
		}
		
		printf ("duty=%d\r\n",pwmDuty);
		TIM_SetCompare1(TIM2,pwmDuty);
		
		// 清空接收数组
		for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++)
		{
			gReceFifo[gClearCount] = ' ';
		}
			
		gReceEndFlag = 0;   // 清除接收完成标志位
		gReceCount = 0;   // 清零接收计数变量
	}
}

到了这里,关于STM32外设系列—TB6612FNG的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机

    1 电路图 2 TB6612简介 TB6612是双驱动,可同时驱动两个电机 STBY:接单片机的IO口清零电机全部停止,置1通过AIN1 AIN2,BIN1,BIN2 来控制正反转 VM:建议接10V以内电源( 瞬间上电12V可能会有尖峰电压击穿器件 ) VCC:接5V电源 GND:接电源负极 PWMA:接单片机的PWM口 ,控制转速 PWM

    2023年04月22日
    浏览(75)
  • K_A08_009 基于 STM32等单片机驱动TB6612模块按键控制直流电机正反转加减速启停

    目录 一、资源说明 二、基本参数         1、参数         2、引脚说明 三、驱动说明         TB6612模块驱动说明         对应程序:         ENA ENB输出PWM 四、部分代码说明         接线说明                 1、STC89C52RC+TB6612模块                 2、STM32F

    2024年02月15日
    浏览(25)
  • tb6612电机驱动软件开发(代码pid实现,调试,控制实现)

    代码工程 https://download.csdn.net/download/weixin_52849254/87879043?spm=1001.2014.3001.5501 这段代码是一个PID算法的实现,用于控制电机的位置和速度。代码中包含了以下主要内容: 定义了全局变量,包括四个PID结构体变量,分别用于左电机的位置控制、左电机的速度控制、右电机的速度控

    2024年02月08日
    浏览(34)
  • 基于STM32,TB6612,TCRT5000的简易红外循迹小车

            提醒:本文章只叙述此小车相关大概内容(如模块的设置,C语言基础实现等),单片机详细教学不涉及。         循迹小车是学习单片机的“地基”,它能够让初学者认识单片机内部硬件结构及其功能,熟悉单片机的一些基础操作,如I/O的应用,定时中断与外

    2024年02月16日
    浏览(34)
  • stm32平衡小车--(1)JGB-520减速电机+tb6612(附测试代码)

                                        这是我用的电机,红色框框中的就是 编码器 。 编码器是将信号(如比特流)或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。编码器把角位移或直线位移转换成电信号,前者称为码盘,后者称为码尺。按照读出方

    2024年02月04日
    浏览(248)
  • STM32自学笔记14-步进电机驱动项目-TB67H450驱动

    目前的项目是一种2相4线步进电机的闭环驱动电路,使用的电机驱动芯片是 TB67H450 ,再使用磁编码器 MT6816 ,使用 FOC 算法,基于 STM32F1 单片机。 这一节是步进电机的驱动芯片驱动研究 首先研究驱动芯片 TB67H450 的datasheet 这是一个PWM斩波电机驱动芯片,内部框图可以看出来内

    2024年02月07日
    浏览(45)
  • STM32单片机PWM控制实现电机调速度(小车运动,STM32F103C8T6&TB6612&TT电机)

    作者:公子易平 时间:2023/6/6 前段时间做一个智能小车的相关项目时,发现很少有人能够将STM32的PWM控制讲清楚,故而书此文,希望对后来的学习者有所帮助。 STM32F103C8T6最小系统板 直流TT电机 电机驱动芯片(TB6612) 杜邦线若干 接线情况: TB6612引脚说明: STM32主控芯片与TB6612接

    2024年02月15日
    浏览(31)
  • 霍尔编码器电机与TB6612电机驱动相关学习

    简单粗暴的说下,电机-电机驱动-单片机该怎么连线。 先简单认识一下霍尔编码器电机 以上选用的平衡小车之家的,市面上基本都跟这个差不了多少。 电机线-+这两个引脚 与电机驱动相连接 来控制电机的正反转(自己的浅显理解)  编码器的AB相 连接单片机(定时器)  编

    2023年04月09日
    浏览(22)
  • DRV8833直流电机驱动模块代替 TB6612FNG电机驱动

    江科大自化协TB6612使用DRV8833代替,以及使用方法 购买了国产DRV8833模块驱动直流电机,单片机3.3V的GPIO口无法直接驱动直流电机,需要外接高电压的电源,使用驱动模块即可实现 DRV8833管脚说明以及驱动真值表 注意此处的空脚,DRV8833是没有单独的PWM接口的,从IN中的电平变化

    2024年02月11日
    浏览(30)
  • tb6612电机驱动与JGB37-520减速直流电机

    注意: TB6612中A和B各为驱动一组电机的输入端和输出端。 以下是TB6612 模块测试一个电机的接线图: VM直接接电池即可,VCC 是内部的逻辑供电,一般给3.3 或者5V 都行,模块的3 个GND 接任意一个即可,因为都是导通的,STBY置高模块才能正常工作。   完成上面的接线之后,我

    2024年02月13日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包