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

  • 18
    点赞
  • 136
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
控制电机正反转的方法主要有两种:使用直流电机的H驱动器,或使用交流电机的三相式变频器。这里以直流电机为例进行讲解。 在STM32 HAL库中,可以通过GPIO口控制H驱动器的引脚,从而控制电机的正反转。一般来说,H驱动器的引脚分为四个:两个控制电机正转的引脚,两个控制电机反转的引脚。其中,控制正转的引脚和反转的引脚不能同时开启,否则会烧坏电机。 以下是一个简单的控制电机正反转的代码示例: ```c #include "stm32f4xx_hal.h" #define MOTOR_FORWARD_PIN GPIO_PIN_0 #define MOTOR_BACKWARD_PIN GPIO_PIN_1 void motor_forward(void) { HAL_GPIO_WritePin(GPIOA, MOTOR_FORWARD_PIN, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOA, MOTOR_BACKWARD_PIN, GPIO_PIN_SET); } void motor_backward(void) { HAL_GPIO_WritePin(GPIOA, MOTOR_FORWARD_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOA, MOTOR_BACKWARD_PIN, GPIO_PIN_RESET); } int main(void) { HAL_Init(); __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct = {0}; GPIO_InitStruct.Pin = MOTOR_FORWARD_PIN | MOTOR_BACKWARD_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); while (1) { motor_forward(); HAL_Delay(1000); motor_backward(); HAL_Delay(1000); } } ``` 在上面的代码中,我们通过GPIO口控制了电机的正反转。具体来说,当调用`motor_forward()`函数时,我们将控制正转的引脚置为低电平,控制反转的引脚置为高电平,从而让电机正转;当调用`motor_backward()`函数时,我们将控制正转的引脚置为高电平,控制反转的引脚置为低电平,从而让电机反转。在主循环中,我们不断地交替调用这两个函数,从而让电机不断地正反转。 需要注意的是,具体的引脚号、GPIO端口等参数需要根据具体的硬件连接进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

北辰远_code

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

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

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

打赏作者

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

抵扣说明:

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

余额充值