【STM32小案例01】用STM32F103ZET6使用L298N电机驱动模块 控制电机(电动推杆)正反转

​ 本文将简单介绍如何通过L298N电机驱动模块实现直流减速电机(电动推杆)的正反转控制,后续会更新含PWM调速的教程,如有需要可关注后续博客,希望对大家的学习有所帮助。

1.所需硬件

正点原子战舰V3开发板 X1

L298N电机驱动模块 X1

微型电动推杆 X1

杜邦线 若干

2.L298N电机驱动模块介绍

在这里插入图片描述

​ 上图为L298N电机驱动模块的实物图,关于L298N电机驱动模块的原理这里不做过多的介绍,感兴趣的同学可以自行百度,下面将直接介绍L298N的使用方法。

输出A(OUT1和OUT2):从电机上可以看到两个正负金属片,我们可以联想到这是接电机的正负金属片,至于哪个是正哪个是负无所谓,若未达到预期效果可通过代码或相反接线来改变。
12V供电、供电GND:12V电源接口接12V电池正极,负极接地,同时一定要和单片机共地,至于为什么这里不做详细介绍,同学可百度查阅。至于这个12V的电源,电压尽量不要高于16V也不要低于8V,过高过低都会烧毁芯片。
5V供电:由于L298N电机驱动模块自带了稳压功能,可以供出5v电压,在以后的智能小车项目中,单片机的供电选择可以选这个,对于初学者这个很少用到。
通道A使能(EN1):这里的使能可以类比STM32的GPIO口和时钟配置,这是使能的意思就是让它开启工作状态。这个使能接口是用来控制PWM输入的,也就是说,如果单纯只想让电机转动起来,可以不用管EN1,把那个帽子给它盖上,它就和5v接上了,也就是它不使能了。以后如果想用PWM来控制,那就把帽子拔了,把EN脚接到单片机的PWM输出口。
单片机IO口控制输入(IN1、IN2):这两个脚是接到STM32的某两个GPIO口上,通过给予高低电平,就可以实现电机的正反转。
在这里插入图片描述

所以,剩下的IN3、IN4、EN2、OUT3和OUT4都同理。

3.硬件接线

111

接线描述:

12V供电DC电源正极
供电GNDDC电源负极及单片机GND(共地)
IN1PA5
IN2PA4
OUT1电机正极
OUT2电源负极

4.程序代码

​ 在学习点灯实验后,相信大家已经知道如何配置引脚,也知道怎么给引脚高低电平了,这里只示例部分主要代码,注意工程的创建。

motor.c源文件

#include "stm32f10x.h"
#include "motor.h"
#include "sys.h" 
#include "delay.h"


void MOTOR_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
	  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能GPIO外设
	  
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;				 //LED0-->PB.4 端口配置
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
		GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.4
		GPIO_ResetBits(GPIOA,GPIO_Pin_4);						 //Pa.4 输出低
		
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 //LED0-->PB.5 端口配置
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
		GPIO_Init(GPIOA, &GPIO_InitStructure);					 //根据设定参数初始化GPIOB.5
		GPIO_ResetBits(GPIOA,GPIO_Pin_5);						 //Pa.5 输出低
}

main.c源文件

#include "delay.h"
#include "sys.h"
#include "motor.h"
#include "key.h"
#include "led.h"
int main()
{		
			delay_init();	    	 //延时函数初始化	  
			MOTOR_Init();
			KEY_Init();
    	    LED_Init();
    
	        GPIO_ResetBits(GPIOE,GPIO_Pin_5);
		         delay_ms(1000);	
			GPIO_SetBits(GPIOE,GPIO_Pin_5);
		         delay_ms(1000);
    
			while(1)
			{      
				
         
				
			     if(KEY0==0)   //按键KEY0
				 {
		          delay_ms(10);//消抖
					 
					    if(KEY0==0)
						  {
								 GPIO_SetBits(GPIOA,GPIO_Pin_4);	
								 GPIO_ResetBits(GPIOA,GPIO_Pin_5); 		//推进
							}
				 }
				 
				 
				 if(KEY1==0)   //按键KEY1
				 {
		          delay_ms(10);//消抖
					 
					    if(KEY1==0)
							{
								  GPIO_SetBits(GPIOA,GPIO_Pin_5);	
									GPIO_ResetBits(GPIOA,GPIO_Pin_4); 		//缩回	
							}
				 }
				 
				 
				 if(KEY2==0)   //按键KEY2
				 {
		          delay_ms(10);//消抖
					 
					    if(KEY2==0)
							{
								  GPIO_ResetBits(GPIOA,GPIO_Pin_4);	
									GPIO_ResetBits(GPIOA,GPIO_Pin_5); 		//停止
							}
				 }
			
		 }

  
}

演示效果:

​ 按下KEY0,电机正转

​ 按下KEY1,电机反转

​ 按下KEY2,电机停止

5.总结

​ 通过本次的项目,我们对GPIO口的应用有一定了解,在学习STM32单片机的过程中自己可以边学边做项目,这样会提高自己的动手能力,也会巩固理论知识,本篇博客简单介绍了L298N模块的使用,如需进一步了解可自行求助度娘,希望对大家的学习有所帮助!

程序源码已上传,如有需要请自行下载

如有错误,欢迎指正!
部分内容来源于网络,如有侵权请告知!

### STM32 控制 推杆电机 伸缩 教程 #### 设计概述 为了实现STM32推杆电机控制,通常采用继电器作为中间开关元件来驱动大电流负载。通过编写相应的固件代码,在特定条件下触发GPIO信号改变继电器状态,从而完成对推杆电机的动作指令发送。 #### 继电器简介与硬件连接 继电器是一种电磁感应器件,当线圈通电时会产生磁场吸引衔铁闭合触点;断开电源则释放恢复原状。对于本案例而言,选用适合工作电压范围内的常开端子型继电器模块,并将其输入端接入MCU引脚,输出侧分别接至直流电源负极以及推杆马达两端形成回路[^1]。 #### 软件设计要点 - **初始化配置** - 配置用于控制继电器的IO口为推挽输出模式。 - 设置定时器中断或其他机制以便周期性检测外部条件变化并据此调整动作逻辑。 - **功能函数定义** - 创建延时等待宏定义或库函数辅助精确时间管理。 - 编写专门负责开启/关闭继电器的方法,内部操作对应管脚高低平设置。 ```c // JDQ.h 文件中的声明部分 #ifndef __JDQ_H__ #define __JDQ_H__ #include "stm32f1xx_hal.h" void Relay_Init(void); void Set_Relay(uint8_t state); #endif /* __JDQ_H__ */ ``` ```c // JDQ.c 文件中的具体实现 #include "jdq.h" /* 定义继电器所使用的 GPIO 引脚 */ #define RELAY_PIN GPIO_PIN_0 #define RELAY_PORT GPIOA void Relay_Init(){ // 初始化继电器对应的 IO 口 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = RELAY_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(RELAY_PORT, &GPIO_InitStruct); } void Set_Relay(uint8_t state){ if(state == 1){ HAL_GPIO_WritePin(RELAY_PORT,RELAY_PIN,GPIO_PIN_SET); }else{ HAL_GPIO_WritePin(RELAY_PORT,RELAY_PIN,GPIO_PIN_RESET); } } ``` ```c // main.c 中的应用实例 int main(void){ HAL_Init(); SystemClock_Config(); Relay_Init(); while (1){ // 假设这里有一个判断语句决定何时执行下面的操作 Set_Relay(1); // 执行伸出命令 HAL_Delay(5000); // 等待五秒 Set_Relay(0); // 收回收缩命令 HAL_Delay(5000); // 再次暂停相同的时间间隔 } } ``` 上述代码片段展示了基本框架下如何利用STM32控制器配合继电器组件达成对推杆装置的有效操控。当然这只是一个简单的例子,实际应用可能还需要加入更多保护措施和优化策略以适应不同场景需求。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值