【STM32】STM32控制继电器实现电动推杆的伸缩

近期所做项目,需要使用到电动推杆,选购的电动推杆如下图,所购电动推杆所需电压为24v。这种类型的电动推杆只有正负极接线口,如果要实现电动推杆向外推出的功能,需要把电动推杆的正负极与24v供电源正接,如果要实现电动推杆向内收缩的功能,则需要将电动推杆的正负极与24v供电源反接,那如何用简单的程序方法来控制这种类型电动推杆的伸缩呢,博主在这里使用stm32单片机控制继电器的方法来达到控制电动推杆伸缩的目的。
在这里插入图片描述

一、方案构想

1.继电器简单介绍

继电器选择的类型是下面这种,淘宝上都有的买,一般的stm32芯片普通I/O口的高电平是3.3v,因此在选购继电器时要注意购买5v控制的继电器。
在这里插入图片描述
继电器的控制原理很简单,继电器的输入端一般含GND、VCC和INx,INx是对应的是第x个继电器接线端子,通过再INx端给入高电平或者低电平,可以控制输出端连线之间的通断,下图中红色线接在再公共触点和常开触点,若设置INx端为高点平控制通断,则当INx为低电平时,红色线不连通,相当于断路,当INx端为高电平时,红色线连通,相当于导线。继电器实现了低电压控制高电压的通断,在实际生活中很实用。
在这里插入图片描述

继电器stm32控制程序

继电器的控制程序也很简单,给定四个I/O口输出高低电平就可以起到控制作用,程序如下,实现的功能是,间隔一秒控制继电器四个口的通断,每个一秒,通断一次。

JDQ.h文件
#ifndef __JDQ_H
#define __JDQ_H	 
#include "sys.h"

#define IN1 PEout(0)
#define IN2 PEout(1)	
#define IN3 PEout(2)
#define IN4 PEout(6)

void JDQ_Init(void);    
#endif
JDQ.c文件
#include "JDQ.h"
void JDQ_Init(void)
{	
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_6;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	GPIO_SetBits(GPIOE,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_6);
}
main.c文件
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "JDQ.h"

 int main(void)
 {	
	delay_init();	  
	JDQ_Init();		
	IN1=1;
	IN2=1;
	IN3=1;
	IN4=1;
	 while(1)
	{
	  IN1=~IN1;
	  IN2=~IN2;
	  IN3=~IN3;
	  IN4=~IN4;
      delay_ms(1000);
	}
 }

2.继电器控制电动推杆方案

电动推杆的控制是依靠正接电源和反接电源实现的,要实现程序控制电动推杆的话,我们要实现从正接状态切换到反接状态,那如何实现这种状态的转变呢,如图所示,博主在这里给出了一种方案,通过继电器的输出口实现状态的改变,每次只有继电器的两个输出口为吸合状态,实现电动推杆的某种功能,如果继电器的四个口都没有吸合,则电动推杆会自锁,但是要避免出现四个输出口都吸合的状态。
在这里插入图片描述

二、实际效果演示

这里使用开关电源作为24v供电源,main.c文件修改如下

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "JDQ.h"

 int main(void)
 {	
	delay_init();	  
	JDQ_Init();		
	//初始状态均为不吸合状态
	IN1=0;
	IN2=0;
	IN3=0;
	IN4=0;
	 while(1)
	{
	  IN1=1;
	  IN2=1;
	  IN3=0;
	  IN4=0;
	  delay_ms(1000);
	  delay_ms(1000);
	  delay_ms(1000);
	  delay_ms(1000);
	  delay_ms(1000);
	  delay_ms(1000);
	  IN1=0;
	  IN2=0;
	  IN3=1;
	  IN4=1;
      delay_ms(1000);
      delay_ms(1000);
      delay_ms(1000);
      delay_ms(1000);
      delay_ms(1000);
      delay_ms(1000);
	}
 }

进行硬件接线,接线原理如上面的方案图,运行效果如下
在这里插入图片描述
这样,我们就完成了通过继电器控制电动推杆伸缩的目标了

### STM32 控制推杆驱动方法 #### 1. 硬件连接 为了使STM32能够有效地控制推杆,需要建立两者之间的电气接口。通常情况下,这涉及到使用PWM信号来调节电机的速度和方向。由于大多数电推杆由直流电机组成,因此可以通过H桥电路或专用电机驱动芯片(如L298N、TB6612FNG等)来进行电流放大[^1]。 对于具体的硬件接线方式: - 将STM32的一个定时器通道配置成PWM输出模式; - 连接到电机驱动模块上的IN1/IN2输入端子; - VCC 和 GND 接到电源正负极上; - OUT1/OUT2 输出则与电推杆相连; ```c // 定义GPIO引脚用于PWM输出 #define PWM_PIN GPIO_Pin_0 #define PWM_PORT GPIOA ``` #### 2. 软件编程 在软件方面,主要任务是在MCU内部设置合适的寄存器值以生成所需的PWM波形,并编写相应的程序逻辑去管理这些参数的变化过程。下面给出一段简单的C语言代码片段作为例子说明如何初始化TIM2外设并启动它产生周期性的方波脉冲序列给定频率下的占空比可调特性。 ```c #include "stm32f1xx_hal.h" void MX_TIM2_Init(void){ __HAL_RCC_TIM2_CLK_ENABLE(); TIM_HandleTypeDef htim2; htim2.Instance = TIM2; htim2.Init.Prescaler = 79; // 设置预分频系数,假设系统时钟为8MHz,则此处代表实际计数频率为100kHz htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; // 自动重装载值设定最大计数值(即周期),这里表示每毫秒触发一次更新事件 HAL_TIM_PWM_Init(&htim2); TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 499; // 初始占空比50% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&htim2,&sConfigOC,TIM_CHANNEL_1); } int main(){ HAL_Init(); SystemClock_Config(); /* 初始化系统时钟 */ MX_GPIO_Init(); /* 初始化GPIO */ MX_TIM2_Init(); while (1){ // 可在此处调整PWM占空比从而改变电推杆运动速度 __HAL_TIM_SET_COMPARE(htim2,TIM_CHANNEL_1,newDutyCycle); } } ``` 上述代码展示了基本的PWM功能实现,其中`newDutyCycle`变量可以根据实际情况动态修改,进而影响最终传递至负载侧的实际电压水平以及由此产生的机械位移量大小变化情况。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值