基于STM32的六氟化硫智能浓度监测仪设计*
编者按:本文设计了一种六氟化硫浓度智能监测系统,该系统基于STM32单片机开发,通过超声波传感器监测电力设备使用环境中的六氟化硫浓度,当出现浓度超标时,及时报警,确保人生安全。同时该系统结合人体感应传感器、语音播报系统,当有人接近设备时可语音播报当前六氟化硫浓度,做到实时提醒。
*2021年泰州职业技术学院院级科研项目资助;项目号:TZYKY-21-17。
六氟化硫(SF6)以其优异的绝缘和灭弧性能,被广泛用于电力工业的高压、超高压断路器和GIS(Gas Insulated Switchgear,气体绝缘金属封闭开关设备)中,由于设备的制造、安装质量差异和设备老化等因素,SF6 气体设备发生泄漏是一种普遍现象[1]。纯净的SF6气体无毒,在常温下化学性质稳定,实际操作中,泄漏的SF6 被电击后将产生有毒气体,这不仅会危及电力安全,对大气环境造成极大危害,而且会造成低层空间缺氧使人窒息[2],出于安全考虑,必须对泄漏的SF6 气体浓度进行实时监测,传统的SF6 气体浓度检测方法是采用气敏传感器进行检测,但气敏传感器的精度低、寿命短[3],同时传统检测硬件系统在成本、功耗以及性能方面均不能满足当前需求,因此本文提出基于STM32 的SF6 实时监测设备设计。
1 系统总体设计
超声波在不同介质中,传播速度是不同的,根据这一原理,当不同浓度的SF6 气体和空气混合后,超声波通过固定距离所需时间与SF6 浓度存在一定关系,通过所需时间长短反应SF6 浓度[4]。
本设计是一套集STM32 单片机系统、超声波测量传感器、人体红外感应传感器、电源模块、以及显示模块设计成一体的SF6 浓度监测系统,该设备可实现SF6浓度测量、温湿度监测以及触摸屏显示、超限语音报警等功能。当有人接近电力设备时,系统及时显示监测浓度值,当浓度超标时进行报警操作。
2 硬件模块设计
2.1 芯片及电源模块设计
此次设计选用的是STM32F103C8T6 型单片机,出自ST(意法半导体)公司,是一款基于Cortex-M3 内核与ARMv7-M 架构的32 位微控制器,时钟频率高达72 MHz,该芯片功耗低,外围IO 口充足,同时具有9 个通信接口[5]。
单片机控制系统外围接口电路如图2,该系统外部采用8 M无源晶体振荡器作为其高速时钟,采用32.768 kKz 的无源晶体振荡器作为RTC 时钟。程序采用SWD 烧写模式。单片机的电源引脚接3.3 V 并就近放置一个0.1 μF 的滤波电容。其余引脚分
配给USART,ADC,I2C 等外设。电源部分采用AC-DC模块,
图2 控制系统电路
将市电交流220 V 转换成12 V 直流,配合压敏电阻,共模电感,滤波电容,提高了电路的安全性和稳定性,屏蔽了外部电源干扰造成整个系统的崩溃。由于系统内部功能模块采用5 V 供电和3.3 V 供电,因此次设计时采用TI 公司的TPS5430 DC-DC 稳压芯片,将12 V 电压降低至5 V,再利用LDO 将5 V 降低至3.3 V给单片机供电。具体电路设计如图3 所示。
图3 电源电路
2.2 传感器采集电路设计
系统采用SZQ68 型SF6 传感器,是基于超声波吸收原理,具备高灵敏度,寿命长。其测量范围为0~2 000 ppm,测量精度为±5%。该传感器输入供电电压为5 V,通信接口为串口。串口电平为3.3 V 可以与单片机直连。硬件电路如图4 所示。
图4 SF6传感器电路
温湿度传感器为SHT30,供电电压为3.3 V,通信方式为I2C。由于STM32F1 系列单片机的硬件I2C 不稳定,容易造成锁死。此次设计中SHT30 的引脚并未与单片机的I2C 外设引脚直接相连接,通过模拟I2C 来读取温湿度,这在一定程度上造成了CPU 性能的浪费。硬件电路如图5 所示。
图5 SHT30电路
考虑到智能化使用需求,该监测仪具备人体接近语音播报功能,当人体靠近被测环境时,人体红外感应传感器HC-SR501 触发语音模块JR6001 对当前监测值进行实时播报。人体红外感应传感器与语音模块供电电压均为5 V,硬件电路如图6、图7 所示。为了保护单片机系统,人体红外感应模块触发电平输出与单片机引脚之间采用光耦隔离。
图6 人体红外感应模块电路
图7 语音模块
3 系统软件设计
本系统进行代码编写与软件调试均采用keil 软件,主要程序流程图如图8 所示。当设备电源开启后,系统各功能进行初始化,初始化完成后对系统参数进行读取,接下来就是对SF6 传感器以及温湿度传感器数据在不超标的情况下进行循环采集,采集过程中如发现泄漏超标,将实时通过报警器进行报警。在实时数据采集过程中,当有人接近时,语音播报系统将播报当前监测值。
3.1 主程序
STM32 模块主程序典型代码如下 :
u16 SF6_DATA,SF6_POLL_CNT=0; // 定义轮询计数和SF6 数据初始化
u8 IR_CNT=60; // 定义有人计时
u8 Threshold_STA=0;// 定义阈值更新标志位/* 定时器4 中断回调函数*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM4)
{
if(READ_IR==0)
{
SF6_POLL_CNT=0;
IR_CNT++;
}
// 当感应到附近有人存在时轮询计数归零,有人计时累加
else
{
SF6_POLL_CNT++;
IR_CNT=0;
} // 附近无人轮询计数累加,有人计时归零if(KEY_ON==1) // 当按键寄存器被按下,按键计数累加
{
KEY_CNT++; // 按键计数每秒累加
}
}
}
int main(void)
{
HAL_Init(); //HAL 库初始化
SystemClock_Config(); // 系统时钟初始化
MX_GPIO_Init(); //GPIO 引脚初始化
MX_DMA_Init(); //DMA 初始化
MX_ADC1_Init(); //ADC 初始化
MX_TIM3_Init(); // 定时器3 初始化,用于us延时
MX_TIM4_Init(); // 定时器4 初始化,1S 定时,用于轮询SF6 测量数值
HAL_TIM_Base_Start_IT(&htim4);// 开启定时器4中断
MX_USART1_UART_Init();// 串口1 初始化,用于播放语音报警
MX_USART3_UART_Init();// 串口3 初始化,用于SF6 传感器通信
FLASH_READ(); // 读取单片机内部FLASH 存储的SF6 报警阈值
OLED_Init(); //OLED 显示屏初始化
while(1)
{
if(SF6_POLL_CNT ≥ 600)//10 分钟轮询一次SF6 数值并更新一次OLED 屏
{
HAL_UART_Transmit(&huart3,POLL_BUFF ,len,1000);// 发送轮询命令
HAL_Delay(100); // 延时100 mssensor_read();
}
if(READ_IR==0) // 当感应到附近有人后
{
HAL_Delay(20); // 延时,防止误报if((READ_IR==0)&&(IR_CNT ≥ 60))// 有人隔1 分钟循环读取超声波SF6 传感器
{
SF6_POLL_CNT =0;// 轮询计数清零sensor_read();
IR_CNT=0;
}
}
if(KEY_CNT ≥ 20)// 当20S 无按键时,OLED 恢复显示当前SF6 浓度
{
KEY_CNT=0;
KEY_STA=0;
OLED_ShowNum(0,0, SF6_ADC,4,16,1);//OLED屏幕更新数字
OLED_ShowString(8,16,”ppm”,16,1);// 显示单位ppm
}
}
}
3.2 传感器监测程序设计
/*****************
传感器读取数据处理。
*****************/
void sensor_read(void)
{
if(SF6_DATA ≥ SF6_ Threshold)
//SF6 数据在串口接收中断中完成读取,当超过阈值后处理过程
{
if(SF6_ADC ≥ SF6_ Threshold)
{
OLED_ShowNum(0,0, SF6_DATA,4,16,1);//OLED屏幕更新数字
OLED_ShowString(8,16,”ppm”,16,1); // 显示单位ppm
HAL_UART_Transmit(&huart1, warn_buff ,2,1000);// 串口1 发送报警数据
}
else // 当SF6 测量浓度未超过阈值,则正常更新OLED 屏数据
{
OLED_ShowNum(0,0, SF6_DATA,4,16,1);//OLED屏幕更新数字
OLED_ShowString(8,16,”ppm”,16,1);// 显示单位ppm
if (SF6_POLL_CNT ==0) // 当有人播放“正常语音”
{
HAL_UART_Transmit(&huart1, normal_buff ,2,1000);
}
}
SF6_POLL_CNT =0;// 轮询计数清零,进入下次轮询周期
}
3.3 显示及按键程序设计
/*************
OLED 显示数字
x,y: 起点坐标
num:显示数字
len:数字位数
size:字体大小
mode:0 ,反色显示;1,正常显示
************/
void OLED_ShowNum(u8 x,u8 y,u32 num,u8 len,u8
size,u8 mode)
{
if(ADD_KEY==0) // 当增加阈值按键按下
{
HAL_Delay(20); // 延时消抖
if(ADD_KEY==0)
{
SF6_ Threshold+=10;// 阈值增加10
if(SF6_ Threshold ≥ 2000) SF6_ Threshold=2000;
// 最高值为2000ppm
OLED_Clear();
OLED_ShowChinese(0,0,0,16,1);// 显示“阈”
OLED_ShowChinese(18,0,1,16,1);/ 显示“值”
OLED_ShowString(36,0,”:”,16,1);// 显示“:”
OLED_ShowNum(54,0, SF6_ Threshold,4,16,1);// 显示数字
KEY_ON++1; // 按键标志位置累加
KEY_CNT=0; // 按键计数归零
}
if(CUT_KEY==0) // 当减少阈值按键按下
{
HAL_Delay(20); // 延时消抖
if(CUT_KEY==0)
{
SF6_ Threshold-=10;// 阈值减少10
if(SF6_ Threshold ≤ 100) SF6_ Threshold=100;
// 最低值为100ppm
OLED_Clear();
OLED_ShowChinese(0,0,0,16,1);// 显示“阈”
OLED_ShowChinese(18,0,1,16,1);/ 显示“值”
OLED_ShowString(36,0,”:”,16,1);// 显示“:”
OLED_ShowNum(54,0, SF6_ Threshold,4,16,1);//
显示数字
KEY_ON++; // 按键标志位置累加
KEY_CNT=0; // 按键计数归零
}
}
}
4 系统调试
进行初期硬件静态测试,确认各元器件焊点无虚焊、漏焊等不良现象,电源网络无短路后,通电进行硬件电路功能调试。待硬件电路功能基本实现后开始进行软件烧录、调试以及系统测试。如图所示实物系统测试,测试过程中,出现按键功能混乱问题,通过修正软件后解决该问题。
图9 实物图
5 结语
基于STM32 的SF6 浓度智能监测仪设计,明确了设计需求,结合设计需求,对各功能模块进行硬件系统及软件系统设计,整个系统耗电量小,体积小、精度高,能满足电力行业监测的实际要求,下一步计划采用5G物联网技术实现多点联控,APP 内报警提示。
参考文献:
[1] 郭利民,赵红梅,吕运朋,等.SF6气体泄漏环境在线智能检测系统的设计[J].仪表技术与传感器,2011,(8):76-78.
[2] 蔡艺剧,黄勇,尹遴,等.一种新的微量气体浓度检测方法[J].化工自动化及仪表,2012,39(4):477-479.
[3] 彭静.电力系统SF6气体泄露监测系统的设计[J].电器工业,2011,(2):47-50.
[4] 张龙飞,韩方源,梁沁沁,等.基于超声法的微量SF6泄漏检测[J].电子技术应用,2016,42(8):101-104.
[5] 李芯怡,孙梦茹,郭思蔷,等. 基于STM32F103型单片机的新型车载护童报警装置设计[J].电子设计工程,2021,5(10):101-104.
(本文来源于必威娱乐平台 杂志2022年9月期)
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码