STM32Cube HAL库——利用PWM控制电机转动(TB6612、L298N)

STM32Cube HAL库——利用PWM控制电机转动(TB6612、L298N)

STM32Cube HAL库——利用PWM控制电机转动(TB6612、L298N)

一、电机控制原理

1.H桥

H桥是一个相当简单的电路,包含四个开关元件,负载位于中心,呈H形配置:
在这里插入图片描述
开关元件(Q1,Q2,Q3,Q4)通常是双极或FET晶体管,在一些高压应用中为IGBT。集成解决方案也存在,但开关元件是否与其控制电路集成与本文讨论无关。二极管(D1,D2,D3,D4)称为捕获二极管,通常为肖特基型。

电桥的顶端连接到电源(例如电池),底端接地。一般来说,所有四个开关元件都可以独立打开和关闭,尽管有一些明显的限制。

虽然理论上负载可以是您想要的任何负载,但到目前为止,如果 H 桥是使用有刷直流或双极步进电机(步进器每个电机需要两个 H 桥)负载,则最普遍的应用。在下文中,我将重点介绍作为有刷直流电机驱动器的应用。

H桥的基本工作模式相当简单:如果Q1和Q4导通,电机的左引线将连接到电源,而右引线将接地。电流开始流过电机,电机沿(假设)向前方向激励电机,电机轴开始正向旋转
在这里插入图片描述
如果Q2和Q3打开,则会发生相反的情况,电机在相反方向上通电,轴将开始向后旋转
在这里插入图片描述
在桥中,切勿同时关闭 Q1 和 Q2(或 Q3 和 Q4)。如果你这样做了,你就在电源和GND之间创建了一个非常低的电阻路径,有效地短路了你的电源。这种情况称为“击穿”,几乎可以保证快速破坏您的桥梁或电路中的其他东西。

在这里插入图片描述
停止方式:
(1)关闭 Q1 和 Q4 ,这时候电流仍然会通过反向续流二极管进行流动,此时短暂打开 Q1 和 Q3 从而达到快速衰减电流的目的。
在这里插入图片描述
(2)准备停止的时候,关闭 Q1 ,打开 Q2,这时候电流并不会衰减地很快,电流循环在Q2,M,Q4之间流动,通过MOS-FET的内阻将电能消耗掉。
在这里插入图片描述
关于H桥的内容就介绍到这(知道这些就足够了),如果想进一步了解请看其它博客。
以上资料来自:modular circuits

2.TB6612介绍

TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件,它具有大电流MOSFET-H 桥结构,双通道电路输出,可同时驱动 2 个电机。相比于 L298N的热耗性和外围二极管续流电路,TB6612FNG无需外加散热片,外围电路简单,只需外接电源滤波电容就可以直接驱动电机,利于减小系统尺寸。对于PWM信号输入频率范围,通常采用10KHz的频率,并通过改变占空比调节电机的速度。在这里插入图片描述

3.L298N介绍

L298N,是一款接受高电压的电机驱动器,直流电机和步进电机都可以驱动。一片驱动芯片可同时控制两个直流减速电机做不同动作,在6V到46V的电压范围内,提供2安培的电流,并且具有过热自断和反馈检测功能。L298N可对电机进行直接控制,通过主控芯片的I/O输入对其控制电平进行设定,就可为电机进行正转反转驱动,操作简单、稳定性好,可以满足直流电机的大电流驱动条件。
在这里插入图片描述

3.电机

本例选择MG513P3012V电机。规格如下图:
在这里插入图片描述
在这里插入图片描述
关于电机驱动的内容就介绍到这(知道这些就足够了),如果想进一步了解请看其它博客。

二、STM32CubeMX配置

本例中使用电机驱动TB6612(原理一样)作演示。

1.确定引脚

查看原理图,确定引脚。(查看确定TIM1的通道,这里选择通道1和4)
在这里插入图片描述
本例中AIN1、AIN2、PWMA分别选PB5、PA15、PA11;BIN1、BIN2、PWMB分别选PB4、PA12、PA8。
在这里插入图片描述

2.CubeMX配置

PB5、PA15、PB4、PA12引脚选择GPIO_Output,并改名。
在这里插入图片描述
Timer中选择TIM1,选择通道1和通道4,并改名。(具体如下图)
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
最后生成代码。

三、STM32CubeIDE编程

按照以前一篇文章第三部分提到的方法(一定要包含进编程文件夹中,否则无法运行),建立文件夹。如下:
在这里插入图片描述
将一下文件粘贴进新建的文件夹中(按照自己选择的TIM和通道进行编程,需要修改):
motor.c:

/*
 * motor.c
 *
 *  Created on: 2023年7月17日
 *      Author: Qi520503
 */

#include "motor.h"
#include "tim.h"
/**************************************************************************
函数功能:赋值给PWM寄存器
入口参数:PWM
返回  值:无
**************************************************************************/
void Set_Pwmb(int motor_right)//赋值给PWM寄存器
{
	int pwmb_abs;
	if(motor_right>0) Motor_Right(1);
	else      Motor_Right(0);
	pwmb_abs=myabs(motor_right);
	__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_4,pwmb_abs);
}
void Set_Pwma(int motor_left)//赋值给PWM寄存器
{
	int pwma_abs;
	if(motor_left>0) Motor_Left(1);
	else      Motor_Left(0);
	pwma_abs=myabs(motor_left);
	__HAL_TIM_SET_COMPARE(&htim1,TIM_CHANNEL_1,pwma_abs);
}

void Motor_Right()
{
		HAL_GPIO_WritePin(AIN1_GPIO_Port,AIN1_Pin,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(AIN2_GPIO_Port,AIN2_Pin,GPIO_PIN_SET);//即01,正转
}
void Motor_Left()
{
		HAL_GPIO_WritePin(BIN1_GPIO_Port,BIN1_Pin,GPIO_PIN_RESET);
		HAL_GPIO_WritePin(BIN2_GPIO_Port,BIN2_Pin,GPIO_PIN_SET);//即01,反转
}
/*
*	函数功能:取绝对值
*	入口参数:int
*	返回值:无 unsingned int
*/
int myabs(int num)
{
	int temp;
	if(num<0)	temp=-num;
	else temp =num;
	return temp;
}

motor.h

/*
 * motor.h
 *
 *  Created on: 2023年7月17日
 *      Author: Qi520503
 */

#ifndef MOTOR_H_
#define MOTOR_H_
#include "main.h"

extern	int myabs(int num);
void Set_Pwmb(int motor_right);
void Set_Pwma(int motor_left);
int myabs(int num);
void Motor_Right();
void Motor_Left();

#endif /* MOTOR_H_ */

主函数main.c文件中,
首先,加入motor.h头文件。

#include "motor.h"

再加入启用PWM的语句:

//在int main和while之间定义,位置一定要对,在begain和end之间。
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);//启pwm输出
  HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_4);//启pwm输出

while语句中加入以下语句:

	  Set_Pwmb(3000);//取值只能在 -8400---+8400
	  Set_Pwma(2000);//取值只能在 -8400---+8400```

之后,运行代码,无错误。
烧录代码运行后效果如下:
在这里插入图片描述
两个电机以相反方向不同速度转动。

三、小结

本博客讲解了电机控制的原理、展示了使用STM32Cube编程控制电机转动的过程,如遇到问题也将进一步完善,源码整理后会上传。
大家一起学习一起进步,变得更强,希望大家点赞和关注,下期将带来编码器测速的内容。

<think>嗯,用户想用STM32HAL来配置和控制TB6612驱动电机。首先,我需要回顾一下TB6612的基本工作原理。这个芯片需要两个逻辑输入引脚控制电机的转向,还有一个PWM引脚来调速。所以,用户需要配置STM32的GPIO和定时器来生成PWM信号。 接下来,用户的问题涉及到HAL的具体配置步骤。我需要先确定如何设置GPIO引脚为输出模式,用来控制AIN1和AIN2这两个逻辑输入。然后,定时器的配置是关键,因为PWM的频率和占空比需要调整。根据引用[2]提到的例子,定时器3的预分频系数是72-1,自动重装载值是1000-1,这样生成的PWM周期是1ms,占空比精度0.1%。所以,用户可能需要类似的配置,但具体参数可能根据主频不同而变化。 然后,用户可能还需要知道如何通过HAL的函数来改变PWM的占空比,比如使用__HAL_TIM_SET_COMPARE()这个宏。另外,电机的正反转控制是通过改变AIN1和AIN2的高低电平组合实现的,这部分需要设置GPIO的状态。 可能用户还会遇到问题,比如PWM频率的选择,过高的频率可能导致电机不转,或者噪音大。需要提醒用户根据电机规格调整参数。另外,硬件连接方面,要确保TB6612的VM电压足够,并且STM32的GPIO逻辑电平是否匹配,是否需要电平转换。 还有,用户可能没有提到但需要注意的地方,比如死区时间,虽然TB6612可能不需要,但如果是其他驱动芯片可能需要配置。此外,电机的刹车功能,即同时拉低AIN1和AIN2,可能需要说明。 最后,生成相关问题时要考虑用户可能的后续疑问,比如如何实现调速、多电机控制、电流检测等。需要确保回答覆盖了配置步骤、代码示例以及常见问题,帮助用户全面理解和应用。</think>### STM32 HAL配置TB6612电机驱动实现方法 #### 一、硬件连接配置 1. **逻辑控制引脚**:将STM32的两个GPIO引脚连接到TB6612的AIN1/AIN2(或BIN1/BIN2)控制端,建议选择推挽输出模式 2. **PWM调速引脚**:选择支持PWM输出的定时器通道引脚连接PWMA/PWMB 3. **电源连接**:确保TB6612的VM(电机电源)与逻辑电源VCC分离,典型接线方案: ``` STM32 GPIO1 -> AIN1 STM32 GPIO2 -> AIN2 STM32 TIMx_CHy -> PWMA VM接7-12V直流电源 ``` #### 二、HAL配置步骤 1. **GPIO配置**(以AIN1=PA5, AIN2=PA6为例): ```c GPIO_InitTypeDef GPIO_InitStruct = {0}; // 配置AIN1 GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // 重复配置AIN2的GPIO_PIN_6 ``` 2. **定时器PWM配置**(以TIM3_CH1为例): ```c TIM_HandleTypeDef htim3; htim3.Instance = TIM3; htim3.Init.Prescaler = 72-1; // 预分频系数[^2] htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 1000-1; // 自动重装载值 htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_PWM_Init(&htim3); TIM_OC_InitTypeDef sConfigOC = {0}; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; // 初始占空比50% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1); ``` #### 三、电机控制函数实现 ```c // 正转函数 void Motor_CW(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_RESET); } // 反转函数 void Motor_CCW(void) { HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, GPIO_PIN_SET); } // 调速函数 void Motor_SetSpeed(uint16_t duty) { __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, duty); } ``` #### 四、实际应用注意事项 1. PWM频率建议范围:1-20kHz,过高频率可能导致电机发热,过低会产生可闻噪声 2. 占空比精度由自动重装载值决定,当设置Period=1000-1时,调速精度为0.1% 3. 需要添加硬件死区保护时,可通过配置定时器的刹车功能实现
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北辰远_code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值