lihui163 发表于 2021-8-20 15:56:12

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

本帖最后由 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%
看怎么配置//////////////////////////////////////////////////////////////////////////
void TIM3_Configuration(void)//TIM2初始化函数
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_ICInitTypeDefTIM_ICInitStructure;
    TIM_DeInit(TIM3);
    TIM_TimeBaseStructure.TIM_Period = 0xffff;         
    TIM_TimeBaseStructure.TIM_Prescaler = 9;      
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;   
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
   
   
    TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;            //通道选择
    TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;   //上升沿触发
    TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;//管脚与寄存器对应关系
    TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
    //输入预分频。意思是控制在多少个输入周期做一次捕获,如果   
    //输入的信号频率没有变,测得的周期也不会变。比如选择4分频,则每四个输入周   
    //期才做一次捕获,这样在输入信号变化不频繁的情况下,可以减少软件被不断中断的次数。
    TIM_ICInitStructure.TIM_ICFilter = 0x0;      //滤波设置,经历几个周期跳变认定波形稳定0x0~0xF
    TIM_ICInit(TIM3, &TIM_ICInitStructure);
   
    //TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);//根据参数配置TIM外设信息
    TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2); //选择IC2为始终触发源
    TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);//TIM从模式:触发信号的上升沿重新初始化计数器和触发寄存器的更新事件
    TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); //启动定时器的被动触发
    TIM_Cmd(TIM3, ENABLE);                                 //启动TIM2         
    TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);   //打开中断使能CC1中断请求
}定时器中断函数void TIM3_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM3, TIM_IT_CC2) == SET)   
    {      
            pinlv = TIM_GetCapture2(TIM3);
         caiji = 720000000/pinlv;
         //caiji=30000;      
          TIM_ClearITPendingBit(TIM3, TIM_IT_CC2);//清楚TIM的中断待处理位
    }   


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

guoqiaoyan 发表于 2021-8-20 19:18:00

坐等楼主分享。:D

lihui163 发表于 2021-8-24 09:18:12

guoqiaoyan 发表于 2021-8-20 19:18
坐等楼主分享。

多交流,多分享:)

lihui163 发表于 2021-8-24 10:08:05

本帖最后由 lihui163 于 2021-8-24 10:18 编辑

这是迪文主界面
串口接收中断函数
void USART1_IRQHandler(void)
{      

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
{      
   RecDateBuffer=USART_ReceiveData(USART1);
   RecLen++;
   
   
   if(RecLen==RecBufferLen)
          {
             RecDate=RecDateBuffer;
             RecLen=0;
         if(RecDate==0x0004)//氧气
            {
                flag0=5;         
            }
         else if(RecDate==0x0003)//一氧化碳低浓度
            {
                flag0=4;         
            }
         else if(RecDate==0x0002)//一氧化碳高浓度
            {
                flag0=3;         
            }
         else if(RecDate==0x0001)//甲烷低浓度
            {
                flag0=2;         
            }
         else if(RecDate==0x0000)//甲烷高浓度
            {
                flag0=1;      
            }
            else if(RecDate==0x0015)
            {
               GPIO_SetBits(GPIOE,GPIO_Pin_3);         
            }
         else if(RecDate==0x0014)
            {
                GPIO_ResetBits(GPIOE,GPIO_Pin_3);
            }
         else
         {
             flag0=0;
//          RecDate=0xff;
         }
         
      }
}
USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
}
每个图标对应一个变量地址频率和浓度上传
      quzhi=caiji;//测量频率
         nongdu=(quzhi/100)/8-25;
//===============================================================================      
      /*波形频率*/
      uint8_t TxBuffer1[] = {
                              0xAA,
                              0x55,                     //字体
                              0x02,0x20,                //X轴坐标
                              0x00,0xF0,                //Y轴坐标
                              (0x30+(quzhi/10000)),
                              (0x30+(quzhi/1000%10)),
                              (0x30+(quzhi/100%10)),
                               0x2E,                     //小数点
                              (0x30 + (quzhi/10%10)),
                              (0x30 + (quzhi%10)),
                              72,
                              90,
                              0xCC,0x33,0xC3,0x3C
                            };
/*波形频率*/
      uint8_t TxBuffer11[] = {
                              0xAA,
                              0x55,                     //字体
                              0x02,0x20,                //X轴坐标
                              0x00,0xF0,                //Y轴坐标
                              (0x30),
                              (0x30),
                              (0x30),
                               0x2E,                     //小数点
                              (0x30 ),
                              (0x30),
                              72,
                              90,
                              0xCC,0x33,0xC3,0x3C
                            };
      
         
   
//=========================甲烷高=========================================      
      /*波形频率串口发送*/
if(flag0==1){

/*气体浓度*/
      uint8_t TxBuffer2[] = {
                              0xAA,
                              0x55,                     //字体
                              0x02,0x30,                //X轴坐标
                              0x01,0x30,                //Y轴坐标
                              (0x30+(nongdu/100)),
                              (0x30+(nongdu/10%10)),
                              (0x30+(nongdu%10)),
                              37,
                               0xCC,0x33,0xC3,0x3C
                            };            
            /*气体浓度*/
      uint8_t TxBuffer22[] = {
                              0xAA,
                              0x55,                     //字体
                              0x02,0x30,                //X轴坐标
                              0x01,0x30,                //Y轴坐标
                              (0x30),
                              (0x30),
                              (0x30),
                               37,
                               0xCC,0x33,0xC3,0x3C
                            };   


      if(quzhi >= 100000|| quzhi <=20000)
      {
      for(j=0;j<=13;j++)
      {
      
         USART_SendData(USART1,TxBuffer22);
         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
      }      
      j=0;
      
      
       for(i=0;i<=17;i++)
      {
      
         USART_SendData(USART1,TxBuffer11);
         
      
         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
      }      
      i=0;
      }
      
      else
      {
      
      for(i=0;i<=17;i++)
      {
      
         USART_SendData(USART1,TxBuffer1);
         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
      }      
      i=0;

      
      
      /*气体浓度串口发送*/
   
       for(j=0;j<=13;j++)
      {
      
         USART_SendData(USART1,TxBuffer2);
         while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
      }      
      j=0;
      
      
      }
      
}


迪文部分工程


页: [1]
查看完整版本: 【开源】DGUS屏控制的矿用传感器检测系统