【STM32单片机】继电器控制电磁阀与行程(限位)开关的应用 您所在的位置:网站首页 比例电磁阀驱动电路模块 【STM32单片机】继电器控制电磁阀与行程(限位)开关的应用

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

2023-10-20 08:05| 来源: 网络整理| 查看: 265

【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置零,功能才得以重复使用

一位单片机爱好者



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有