迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1729|回复: 3

【开源】DGUS屏控制的矿用传感器检测系统

[复制链接]

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
发表于 2021-8-20 15:56:12 | 显示全部楼层 |阅读模式
本帖最后由 lihui163 于 2021-8-24 09:12 编辑

开源一如既往,这次分享一个DGUS屏控制的矿用传感器检测系统一、原理说明
矿用氧气传感器主要由两部分组成:氧气浓度敏感元件和信号处理单元组成。
氧气浓度敏感元件采用电化学极谱隔膜式氧电极,该氧电极可以将气体中的氧气含量(%)转‘ 换为正比于被测氧气浓度的微弱电信号。

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

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

二、硬件说明
屏幕为7寸的DGUS屏幕
单片机为stm32f103ZET6,
232通讯

三、程序分析
其实这个项目主要用到的就是定时器和串口,定时器这块是采用的stm32的一种高级输入捕获模式即PWM输入模式
PWM输入模式是输入捕捉模式的高级应用,对于测量频率较高的输入信号的频率特别精确,当然,为了实现这个模式,也得做出一点牺牲。相比于基本输入捕捉功能的实现来说,PWM输入模式中,一路输入信号同时映射到两个引脚,而且只有第一和第二通道可以配置为这种模式,换句话说,每个通用定时器只能测量一路输入信号。
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%
看怎么配置
  1. //////////////////////////////////////////////////////////////////////////
  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. }
复制代码
定时器中断函数
  1. 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. }
复制代码
这样就可以直接计算传感器数据的频率

本帖子中包含更多资源

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

x
回复

使用道具 举报

0

主题

118

回帖

1493

积分

金牌会员

Rank: 6Rank: 6

积分
1493
发表于 2021-8-20 19:18:00 | 显示全部楼层
坐等楼主分享。
回复

使用道具 举报

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
 楼主| 发表于 2021-8-24 09:18:12 | 显示全部楼层

多交流,多分享
回复

使用道具 举报

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
 楼主| 发表于 2021-8-24 10:08:05 | 显示全部楼层
本帖最后由 lihui163 于 2021-8-24 10:18 编辑

这是迪文主界面
串口接收中断函数
  1. void USART1_IRQHandler(void)
  2. {        
  3.   
  4.   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  5.   {        
  6.      RecDateBuffer[RecLen]=USART_ReceiveData(USART1);
  7.      RecLen++;  
  8.      
  9.      
  10.      if(RecLen==RecBufferLen)
  11.           {
  12.              RecDate=RecDateBuffer[3];
  13.              RecLen=0;
  14.            if(RecDate==0x0004)//氧气
  15.               {
  16.                 flag0=5;         
  17.               }
  18.            else if(RecDate==0x0003)//一氧化碳低浓度
  19.               {
  20.                 flag0=4;         
  21.               }
  22.            else if(RecDate==0x0002)//一氧化碳高浓度
  23.               {
  24.                 flag0=3;           
  25.               }
  26.            else if(RecDate==0x0001)//甲烷低浓度
  27.               {
  28.                 flag0=2;         
  29.               }
  30.            else if(RecDate==0x0000)//甲烷高浓度
  31.               {
  32.                 flag0=1;      
  33.               }
  34.             else if(RecDate==0x0015)
  35.               {
  36.                GPIO_SetBits(GPIOE,GPIO_Pin_3);           
  37.               }
  38.            else if(RecDate==0x0014)
  39.               {
  40.                 GPIO_ResetBits(GPIOE,GPIO_Pin_3);
  41.               }
  42.            else
  43.            {
  44.              flag0=0;
  45. //          RecDate=0xff;
  46.            }
  47.          
  48.       }
  49.   }
  50.   USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
  51. }
复制代码
每个图标对应一个变量地址频率和浓度上传
  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. }  
复制代码



迪文部分工程


本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 17:56 , Processed in 0.097301 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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