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编程控制电机转动的过程,如遇到问题也将进一步完善,源码整理后会上传。
大家一起学习一起进步,变得更强,希望大家点赞和关注,下期将带来编码器测速的内容。