赛派号

stm32f103c8t6控制步进电机正反转 STM32Cube HAL库

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lsinopec@gmail.com举报,一经查实,本站将立刻删除。

上一篇 没有了

下一篇没有了