【开源】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的中断待处理位
}
}这样就可以直接计算传感器数据的频率 坐等楼主分享。:D guoqiaoyan 发表于 2021-8-20 19:18
坐等楼主分享。
多交流,多分享:) 本帖最后由 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]