|
【开源】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.配置方法
- <font size="3" face="宋体">//////////////////////////////////////////////////////////////////////////
- void TIM3_Configuration(void)//TIM2初始化函数
- {
- TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
- TIM_ICInitTypeDef TIM_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中断请求
- }</font>
复制代码
4.定时器中断函数
- <font size="3" face="宋体">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的中断待处理位
- }
- }</font>
复制代码
这样就可以直接计算传感器数据的频率
5.串口接收中断函数
- 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[j]);
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- j=0;
-
-
- for(i=0;i<=17;i++)
- {
-
- USART_SendData(USART1,TxBuffer11[i]);
-
-
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- i=0;
- }
-
- else
- {
-
- for(i=0;i<=17;i++)
- {
-
- USART_SendData(USART1,TxBuffer1[i]);
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- i=0;
-
-
-
- /*气体浓度串口发送*/
-
- for(j=0;j<=13;j++)
- {
-
- USART_SendData(USART1,TxBuffer2[j]);
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- j=0;
-
-
- }
-
- }
复制代码
6.每个图标对应一个变量地址频率和浓度上传
- <font size="3" face="宋体"> 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[j]);
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- j=0;
-
-
- for(i=0;i<=17;i++)
- {
-
- USART_SendData(USART1,TxBuffer11[i]);
-
-
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- i=0;
- }
-
- else
- {
-
- for(i=0;i<=17;i++)
- {
-
- USART_SendData(USART1,TxBuffer1[i]);
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- i=0;
-
-
-
- /*气体浓度串口发送*/
-
- for(j=0;j<=13;j++)
- {
-
- USART_SendData(USART1,TxBuffer2[j]);
- while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
- }
- j=0;
-
-
- }
-
- } </font>
复制代码
四、DGUS工程界面展示
备注说明:如需源码,请参考此链接:http://inforum.dwin.com.cn:20080/forum.php?mod=viewthread&tid=4385&_dsign=996cfb33
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|