【STM32单片机】继电器控制电磁阀与行程(限位)开关的应用

【STM32单片机】继电器控制电磁阀与行程(限位)开关的应用
STM32单片机高电平为3.3V,而电磁阀的工作电压常为12V/24V,这意味着需要借助继电器控制电磁阀。继电器的本质是通过单片机引脚高低电平控制的(电磁铁)开关。 继电器是高电平触发还是低电平触发取决于上拉/下拉电阻。笔者采用的是继电器高电平触发。

限位开关与继电器类似,均为单刀双掷开关。笔者设置为限位开关高电平触发(当然也可以用低电平触发)。限位开关的COM端连接单片机的VCC,NC端连接单片机的GND,NO端连接单片机的引脚。未触发状态下COM端与NC端连通,当限位开关触发后,由于COM端与NO端连通,引脚电平发生变化(低电平->高电平),读取到电平变化后完成动作。
注意:GPIO中默认将引脚设置为低电平,若使用限位开关低电平触发一定不要忘记将电平置高!
例如,笔者配置引脚PD15控制继电器的一路,PA0为限位开关的COM端,通过PA0的引脚电平变化来控制PD15的引脚电平变化。

#include "gpio.h"
void User_GPIO_Init(void)
{
    	GPIO_InitTypeDef  gpio;
		RCC_APB2PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
		//配置引脚 PA0
		gpio.GPIO_Pin = GPIO_Pin_0;
		gpio.GPIO_Speed=GPIO_Speed_50MHz;
		gpio.GPIO_Mode = GPIO_Mode_IN;	//注意要设置为上拉输入		
	  	gpio.GPIO_OType = GPIO_OType_PP;
		GPIO_Init(GPIOA, &gpio);
		GPIO_ResetBits(GPIOA,GPIO_Pin_0);
		//若设置为低电平触发一定要将电平置高
		//GPIO_SetBits(GPIOA,GPIO_Pin_0);
}
	//如果读到引脚变化(高电平触发)
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1)
	{	
		//PD15引脚为控制继电器的一路
		GPIO_ResetBits(GPIOD,GPIO_Pin_15);//关闭电磁阀
		delay_ms(10);
	}
	else 
	{
		GPIO_SetBits(GPIOD,GPIO_Pin_15);//保持电磁阀开启
//或写成	GPIO_WriteBit(GPIOD,GPIO_Pin_15,(BitAction)!GPIO_ReadOutputDataBit(GPIOD,GPIO_Pin_15)));
		delay_ms(10);
	}

当然,仅通过限位开关触发来控制电路是不够的。例如,限位开关触发后仍然保持住触发后状态;遥控器模式通过切换再次到达当前模式仍能完成一系列动作。这就需要标志位!

extern int flag;	//将标志位设置为全局变量,适合多线程使用
if(TelCtrlData.switch_r==2&&TelCtrlData.switch_l==2)
{
//只有满足限位开关触发并且为第一次触发才进行新的功能
	if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1&&flag==0)
	{	
		flag=1;//将标志位置1表明已进入功能一次
		GPIO_ResetBits(GPIOD,GPIO_Pin_15);
		OSTimeDly(10,OS_OPT_TIME_PERIODIC,&err);
	}
	else if(flag==1)//只要进入功能就一直保持状态(无论限位开关是否再次触发)
	{
		GPIO_ResetBits(GPIOD,GPIO_Pin_15);
		OSTimeDly(10,OS_OPT_TIME_PERIODIC,&err);
	}
	else //未触发时的状态
	{
		GPIO_SetBits(GPIOD,GPIO_Pin_15);
		OSTimeDly(10,OS_OPT_TIME_PERIODIC,&err);
	}
}
	else flag=0;	//切换遥控器模式时将flag置零,功能才得以重复使用

一位单片机爱好者

版权声明:本文为CSDN博主「头发与工作量成反比」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ahang880/article/details/117677118

生成海报
点赞 0

头发与工作量成反比

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

STM32——用PWM控制电机

最近在研究电机,于是想写一篇文章来记录我的学习历程。下面是用PWM来驱动电机,涉及的电机驱动是L298N。 大概的思路:初始化连接电机的IO口,配置定时器的PWM模式,配置

基于STM32的室内环境监测系统

设计简介: 本设计是基于单片机的室内环境监测器,主要实现以下功能: 可实现LCD1602显示环境数据实时监测一氧化碳、甲烷、烟雾值空气质量大于各自限值报警,并通过TTS报警 标签&#x

基于stm32f407的示波器

一.设计要求 二.整体思路 硬件部分主要负责电压的缩放以及垂直灵敏度的控制,因为stm32的大部分引脚最高输入电压为3.3v,而要求的电压需要50v,需要进行电压缩放。 软件部分主要负责方波的实现&#x

实验一 stm32F407VETx点亮流水灯

二、设计指标 使电路板上的8个LED轮流点亮,并按键控制点亮速度。 三、操作 1、CubeMX操作 1.1依据开发板LED引脚设置CubeMX中8个LED的引脚为GPIO_Output模式, 2、按键设置