迪文科技论坛

 找回密码
 立即注册
搜索
查看: 285|回复: 2

【2021.8.20获奖项目】DGUS屏控制的矿用传感器检测系统

[复制链接]

567

主题

167

回帖

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11956
发表于 2024-1-9 19:40:25 | 显示全部楼层 |阅读模式
【开源】DGUS屏控制的矿用传感器检测系统

开源一如既往,这次分享一个DGUS屏控制的矿用传感器检测系统。

一、原理说明

矿用氧气传感器主要由两部分组成:氧气浓度敏感元件和信号处理单元组成。
氧气浓度敏感元件采用电化学极谱隔膜式氧电极,该氧电极可以将气体中的氧气含量(%)转换为被测氧气浓度的微弱电信号。

信号处理单元将氧电极输出微弱电信号进行放大后送至模数转换器,经单片机采样、处理后送至显示电路和输出电路,由数码显示被测氧气的含量(%),并由输出驱动电路输出与之相对应的频率信号或电流信号,同时,判断氧气浓度值是否超过或低于某一设定值,若超出,则发出声光报警信号。

煤矿上的传感器主要有一氧化碳高浓度传感器、一氧化碳低浓度传感器、甲烷高浓度传感器、甲烷低浓度传感器、氧气浓度传感器。
通过测量传感器的输出信号频率,再换算为浓度并在DGUS屏上显示出传感器相关的数据。

二、硬件说明

  • 屏幕为7寸的DGUS屏幕
  • 单片机为stm32f103ZET6
  • 通讯方式:232通讯


三、程序分析

1.定时器和串口
其实这个项目主要用到的就是定时器和串口,定时器这块是采用的stm32的一种高级输入捕获模式即PWM输入模式。
PWM输入模式是输入捕捉模式的高级应用,对于测量频率较高的输入信号的频率特别精确,当然,为了实现这个模式,也得做出一点牺牲。相比于基本输入捕捉功能的实现来说,PWM输入模式中,一路输入信号同时映射到两个引脚,而且只有第一和第二通道可以配置为这种模式,换句话说,每个通用定时器只能测量一路输入信号。

2.PWM模式捕获方法
利用TIM2_CH1作PWM输出,TIM3_CH2捕获上述PWM信号,并测出频率和占空比。具体步骤如下:
  • 为了实现PWM输入捕获,TIM3占用了2个通道。第2通道的电平变化会被第一通道和第二通道引脚检测到,其中第一通道被设置为从机模式(如何快速判别主从机模式,规则如下:如果设置的是第二通道作为PWM输入捕获,则剩余的第一通道都为从机,反之亦然)。假设输入的PWM从低电平开始跳变,在第一个上升沿到来时,1,2通道同时检测到上升沿。而从机设置为复位模式,所以将TIM3的计数值复位至0,此时不会产生一个中断请求。
  • 下一个到来的电平是下降沿,此时通道1发生捕获事件,将计数值存入通道1的CCR1里。
  • 然后是第二个上升沿到来后,此时通道2发生捕获事件,将此时的计数值存入通道2的CCR2里。复位模式此时又将TIM3计数值复位至0,等待第二个下降沿到来。
  • 一次捕获过程完成,则PWM的频率f=72M/CCR2;占空比:duty=(CCR1/CCR2) X100%。

3.配置方法

  1. <font size="3" face="宋体">//////////////////////////////////////////////////////////////////////////
  2. void TIM3_Configuration(void)//TIM2初始化函数
  3. {
  4.     TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  5.     TIM_ICInitTypeDef  TIM_ICInitStructure;
  6.     TIM_DeInit(TIM3);
  7.     TIM_TimeBaseStructure.TIM_Period = 0xffff;         
  8.     TIM_TimeBaseStructure.TIM_Prescaler = 9;      
  9.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
  10.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  11.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
  12.    
  13.    
  14.     TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;              //通道选择
  15.     TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;   //上升沿触发
  16.     TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//管脚与寄存器对应关系
  17.     TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  
  18.     //输入预分频。意思是控制在多少个输入周期做一次捕获,如果   
  19.     //输入的信号频率没有变,测得的周期也不会变。比如选择4分频,则每四个输入周   
  20.     //期才做一次捕获,这样在输入信号变化不频繁的情况下,可以减少软件被不断中断的次数。
  21.     TIM_ICInitStructure.TIM_ICFilter = 0x0;      //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
  22.     TIM_ICInit(TIM3, &TIM_ICInitStructure);
  23.    
  24.     //TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);  //根据参数配置TIM外设信息
  25.     TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2); //选择IC2为始终触发源
  26.     TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件
  27.     TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
  28.     TIM_Cmd(TIM3, ENABLE);                                 //启动TIM2         
  29.     TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);     //打开中断使能CC1中断请求
  30. }</font>
复制代码

4.定时器中断函数

  1. <font size="3" face="宋体">void TIM3_IRQHandler(void)
  2. {
  3.     if (TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET)   
  4.     {        
  5.             pinlv = TIM_GetCapture2(TIM3);
  6.            caiji = 720000000/pinlv;
  7.            //caiji=30000;        
  8.           TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);  //清楚TIM的中断待处理位
  9.     }     


  10. }</font>
复制代码

这样就可以直接计算传感器数据的频率

5.串口接收中断函数

  1.       quzhi=caiji;//测量频率
  2.          nongdu=(quzhi/100)/8-25;
  3.   //===============================================================================      
  4.       /*波形频率*/
  5.       uint8_t TxBuffer1[] = {
  6.                               0xAA,
  7.                               0x55,                     //字体
  8.                               0x02,0x20,                //X轴坐标
  9.                               0x00,0xF0,                //Y轴坐标
  10.                               (0x30+(quzhi/10000)),
  11.                               (0x30+(quzhi/1000%10)),
  12.                               (0x30+(quzhi/100%10)),
  13.                                0x2E,                     //小数点
  14.                               (0x30 + (quzhi/10%10)),
  15.                               (0x30 + (quzhi%10)),
  16.                               72,
  17.                               90,
  18.                               0xCC,0x33,0xC3,0x3C
  19.                             };
  20. /*波形频率*/
  21.       uint8_t TxBuffer11[] = {
  22.                               0xAA,
  23.                               0x55,                     //字体
  24.                               0x02,0x20,                //X轴坐标
  25.                               0x00,0xF0,                //Y轴坐标
  26.                               (0x30),
  27.                               (0x30),
  28.                               (0x30),
  29.                                0x2E,                     //小数点
  30.                               (0x30 ),
  31.                               (0x30),
  32.                               72,
  33.                               90,
  34.                               0xCC,0x33,0xC3,0x3C
  35.                             };
  36.       
  37.          
  38.    
  39. //=========================甲烷高=========================================      
  40.       /*波形频率串口发送*/
  41. if(flag0==1){  
  42.   
  43.   /*气体浓度*/
  44.         uint8_t TxBuffer2[] = {
  45.                               0xAA,
  46.                               0x55,                     //字体
  47.                               0x02,0x30,                //X轴坐标
  48.                               0x01,0x30,                //Y轴坐标
  49.                               (0x30+(nongdu/100)),
  50.                               (0x30+(nongdu/10%10)),
  51.                               (0x30+(nongdu%10)),
  52.                               37,
  53.                                0xCC,0x33,0xC3,0x3C
  54.                             };              
  55.             /*气体浓度*/
  56.         uint8_t TxBuffer22[] = {
  57.                               0xAA,
  58.                               0x55,                     //字体
  59.                               0x02,0x30,                //X轴坐标
  60.                               0x01,0x30,                //Y轴坐标
  61.                               (0x30),
  62.                               (0x30),
  63.                               (0x30),
  64.                                37,
  65.                                0xCC,0x33,0xC3,0x3C
  66.                             };     
  67.   
  68.   
  69.         if(quzhi >= 100000  || quzhi <=20000)
  70.       {
  71.         for(j=0;j<=13;j++)
  72.         {
  73.         
  74.          USART_SendData(USART1,TxBuffer22[j]);
  75.          while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
  76.         }        
  77.         j=0;
  78.         
  79.         
  80.        for(i=0;i<=17;i++)
  81.         {
  82.         
  83.          USART_SendData(USART1,TxBuffer11[i]);
  84.          
  85.       
  86.          while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
  87.         }        
  88.         i=0;
  89.       }
  90.       
  91.       else
  92.       {
  93.       
  94.         for(i=0;i<=17;i++)
  95.         {
  96.         
  97.          USART_SendData(USART1,TxBuffer1[i]);
  98.          while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
  99.         }        
  100.         i=0;
  101.   
  102.       
  103.         
  104.         /*气体浓度串口发送*/
  105.      
  106.        for(j=0;j<=13;j++)
  107.         {
  108.         
  109.          USART_SendData(USART1,TxBuffer2[j]);
  110.          while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
  111.         }        
  112.         j=0;
  113.       
  114.         
  115.       }
  116.         
  117. }  
复制代码

6.每个图标对应一个变量地址频率和浓度上传

  1. <font size="3" face="宋体">      quzhi=caiji;//测量频率
  2.          nongdu=(quzhi/100)/8-25;
  3.   //===============================================================================      
  4.       /*波形频率*/
  5.       uint8_t TxBuffer1[] = {
  6.                               0xAA,
  7.                               0x55,                     //字体
  8.                               0x02,0x20,                //X轴坐标
  9.                               0x00,0xF0,                //Y轴坐标
  10.                               (0x30+(quzhi/10000)),
  11.                               (0x30+(quzhi/1000%10)),
  12.                               (0x30+(quzhi/100%10)),
  13.                                0x2E,                     //小数点
  14.                               (0x30 + (quzhi/10%10)),
  15.                               (0x30 + (quzhi%10)),
  16.                               72,
  17.                               90,
  18.                               0xCC,0x33,0xC3,0x3C
  19.                             };
  20. /*波形频率*/
  21.       uint8_t TxBuffer11[] = {
  22.                               0xAA,
  23.                               0x55,                     //字体
  24.                               0x02,0x20,                //X轴坐标
  25.                               0x00,0xF0,                //Y轴坐标
  26.                               (0x30),
  27.                               (0x30),
  28.                               (0x30),
  29.                                0x2E,                     //小数点
  30.                               (0x30 ),
  31.                               (0x30),
  32.                               72,
  33.                               90,
  34.                               0xCC,0x33,0xC3,0x3C
  35.                             };
  36.       
  37.          
  38.    
  39. //=========================甲烷高=========================================      
  40.       /*波形频率串口发送*/
  41. if(flag0==1){  
  42.   
  43.   /*气体浓度*/
  44.         uint8_t TxBuffer2[] = {
  45.                               0xAA,
  46.                               0x55,                     //字体
  47.                               0x02,0x30,                //X轴坐标
  48.                               0x01,0x30,                //Y轴坐标
  49.                               (0x30+(nongdu/100)),
  50.                               (0x30+(nongdu/10%10)),
  51.                               (0x30+(nongdu%10)),
  52.                               37,
  53.                                0xCC,0x33,0xC3,0x3C
  54.                             };              
  55.             /*气体浓度*/
  56.         uint8_t TxBuffer22[] = {
  57.                               0xAA,
  58.                               0x55,                     //字体
  59.                               0x02,0x30,                //X轴坐标
  60.                               0x01,0x30,                //Y轴坐标
  61.                               (0x30),
  62.                               (0x30),
  63.                               (0x30),
  64.                                37,
  65.                                0xCC,0x33,0xC3,0x3C
  66.                             };     
  67.   
  68.   
  69.         if(quzhi >= 100000  || quzhi <=20000)
  70.       {
  71.         for(j=0;j<=13;j++)
  72.         {
  73.         
  74.          USART_SendData(USART1,TxBuffer22[j]);
  75.          while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
  76.         }        
  77.         j=0;
  78.         
  79.         
  80.        for(i=0;i<=17;i++)
  81.         {
  82.         
  83.          USART_SendData(USART1,TxBuffer11[i]);
  84.          
  85.       
  86.          while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
  87.         }        
  88.         i=0;
  89.       }
  90.       
  91.       else
  92.       {
  93.       
  94.         for(i=0;i<=17;i++)
  95.         {
  96.         
  97.          USART_SendData(USART1,TxBuffer1[i]);
  98.          while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
  99.         }        
  100.         i=0;
  101.   
  102.       
  103.         
  104.         /*气体浓度串口发送*/
  105.      
  106.        for(j=0;j<=13;j++)
  107.         {
  108.         
  109.          USART_SendData(USART1,TxBuffer2[j]);
  110.          while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);  
  111.         }        
  112.         j=0;
  113.       
  114.         
  115.       }
  116.         
  117. }  </font>
复制代码

四、DGUS工程界面展示






备注说明:如需源码,请参考此链接:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=4385&_dsign=996cfb33




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

6

主题

29

回帖

184

积分

注册会员

Rank: 2

积分
184
发表于 2024-7-30 13:20:55 | 显示全部楼层
感谢你的源码分享   1741527087@qq.com
回复

使用道具 举报

0

主题

452

回帖

1万

积分

论坛元老

Rank: 8Rank: 8

积分
11019
发表于 2024-7-30 13:42:36 | 显示全部楼层
可以参考如下链接:
【开源】DGUS屏控制的矿用传感器检测系统
http://inforum.dwin.com.cn:20080 ... 5&fromuid=14580
(出处: 迪文科技论坛)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-11-22 03:17 , Processed in 0.081091 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表