烟雾报警系统.pdf

上传人:罗晋 文档编号:9007309 上传时间:2021-01-29 格式:PDF 页数:11 大小:849.74KB
返回 下载 相关 举报
烟雾报警系统.pdf_第1页
第1页 / 共11页
烟雾报警系统.pdf_第2页
第2页 / 共11页
烟雾报警系统.pdf_第3页
第3页 / 共11页
烟雾报警系统.pdf_第4页
第4页 / 共11页
烟雾报警系统.pdf_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《烟雾报警系统.pdf》由会员分享,可在线阅读,更多相关《烟雾报警系统.pdf(11页珍藏版)》请在三一文库上搜索。

1、南京邮电大学南京邮电大学 自动化自动化 学院学院 实实 验验 报报 告告 实验名称实验名称: 烟雾报警系统烟雾报警系统 课程名称:课程名称: 测控技术与仪器专业综合实验测控技术与仪器专业综合实验 所在所在专业:专业: 测控技术与仪器测控技术与仪器 学生姓名:学生姓名: 朱永海朱永海 班级学号:班级学号: B B1305050913050509 任课教师:任课教师: 戎戎 舟舟 2015 /2016 2015 /2016 学年第学年第 二二 学期学期 摘要:摘要: 本系统采用本系统采用 STM32F103C8T6 和和 MQ-2 烟雾传感器模块,通过单片机自带的烟雾传感器模块,通过单片机自带的

2、12 位位 ADC 转换器采集传感器两端的模拟电压来计算气体浓度,然后通过由转换器采集传感器两端的模拟电压来计算气体浓度,然后通过由 DMA 控制的串口发控制的串口发 送至上位机显示。送至上位机显示。 STM32 ADC单次转换时间小于单次转换时间小于 1ms, 通过配置, 通过配置 DMA通道和定时器通道和定时器采样采样, 有效的加快了系统整体速度。有效的加快了系统整体速度。 1. 实验目的实验目的 (1) 理解烟雾信号的测试原理,掌握烟雾传感器模块的使用。 (2) 掌握数据采集芯片的原理和使用。 (3) 掌握相应的软硬件设计方法。 (3) 实验要求实验要求 (1) 掌握 AD 转换芯片的使

3、用,搭建测试电路。 (2) 编写单片机程序,对 AD 转换进行控制,将采集得到的烟雾信号传给上位 机。 (3) 用 LabVIEW 编写上位机程序,实现串口信号的接收、显示、报警和存 储。 3实验设备实验设备 (1) 计算机 1 台 (2) STM32F103C8T6 单片机最小系统 1 块 (3) MQ-2 气体传感器模块 1 个 (4) OLED 显示屏 1 个 4. 实验内容实验内容 4.1 系统结构系统结构 MQ-2气体传感 器模块 STM32最小系统 (12位ADC) LabVIEW上位机 OLED (显示模块) DS18B20 (测量温度) 模拟信号 数字 信号 串口命令 气体浓度

4、 SPI 图 1 系统整体框图 本系统由 STM32 最小系统、 MQ-2 气体传感器、 DS18B20 温度传感器、 OLED 显示模块和 LabVIEW 上位机组成。采用的通信协议有 SPI、串口等。其中,单 片机与上位机之间通过串口通信互相收发数据, 单片机与 OLED 之间采用 SPI 通 信协议。 4.2 硬件模块硬件模块 (1)所用芯片与模块 a.STM32F103C8T6 STM32F103C8T6 就是基于 ARM Cortex-M3 内核的微型控制器, 工作频率可 到达 72MHz,单周期乘法和硬件除法。具有 128K FLASH,64K ROM,2.0-3.6V 供电电压。

5、内嵌 8MHz RC 振荡器,带校准的 32KHz RTC 振荡器。具有 12 位 ADC,DMA 控制器,3 个串口等。 图 2 STM32F103C8T6 实物 b.MQ-2 气体传感器模块 MQ-2气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡 (SnO2)。当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气 体浓度的增加而增大。 使用简单的电路即可将电导率的变化转换为与该气体浓度 相对应的输出信号。 MQ-2 气体传感器对液化气、丙烷、氢气的灵敏度高,对天然气和其它可燃 蒸汽的检测也很理想。这种传感器可检测多种可燃性气体,是一款适合多种应用 的低成本传感器。

6、MQ-2 气敏元件的结构和外形如图 4 所示,由微型 AL2O3 陶瓷管、SnO2 敏 感层,测量电极和加热器构成的敏感元件固定在塑料或不锈钢制成的腔体内,加 热器为气敏元件提供了必要的工作条件。封装好的气敏元件有 6 只针状管脚,其 4 个用于信号取出,2 个用于提供加热电流。 图 3 MQ-2 图 4 MQ-2 结构和外形 c.DS18B20 温度传感器 DS18B20 是常用的温度传感器, 具有体积小, 硬件开销低, 抗干扰能力强, 精度高的特点。DS18B20 的读写时序和测温原理与 DS1820 相同,只是得到的温 度值的位数因分辨率不同而不同,且温度转换时的延时时间由 2s 减为

7、750ms。 DS18B20 测温原理如图 3 所示。图中低温度系数晶振的振荡频率受温度影响很 小,用于产生固定频率的脉冲信号送给计数器 1。高温度系数晶振随温度变化其 振荡率明显改变,所产生的信号作为计数器 2 的脉冲输入。计数器 1 和温度寄存 器被预置在-55所对应的一个基数值。 计数器 1 对 低温度系数晶振产生的脉冲信号进行减法计数,当 计数器 1 的预置值减到 0 时,温度寄存器的值将加 1,计数器 1 的预置将重新被装入,计数器 1 重新 开始对低温度系数晶振产生的脉冲信号进行计数, 如此循环直到计数器 2 计数到 0 时,停止温度寄存 器值的累加,此时温度寄存器中的数值即为所测

8、温 度。斜率累加器用于补偿和修正测温过程中的非线 性,其输出用于修正计数器 1 的预置值。 图 5 DS18B20 d.OLED 显示模块 有机发光二极管又称为有机电激光显示 (Organic Light-Emitting Diode, OLED) , 由美籍 华裔教授邓青云在实验室中发现, 由此展开了对 OLED 的研究。OLED 显示技术具有自发光的特 性,采用非常薄的有机材料涂层和玻璃基板,当 有电流通过时,这些有机材料就会发光,而且 OLED 显示屏幕可视角度大,并且能够节省电 能。 图 6 0.96 寸 OLED (2) 硬件实物图 图 7 系统实物图 4.3 软件程序软件程序 (1

9、)软件算法 开始 初始化 气体浓度 温度 是否接收到 1 ? OLED显示 串口发送气体浓度 是 否 图 8 下位机流程图 a. 主函数 int main(void) u8 temp; delay_init(72); /工作频率72MHz uart_init(9600); /初始化串口,波特率9600 NVIC_Configuration(); /中断初始化 Buzzer_Con(); /蜂鸣器初始化 DS18B20_Init(); /初始化DS18B20 ADC1_Init(); /初始化ADC1 Face(); /OLED显示 delay_ms(500); while(1) temp=DS

10、18B20_Get_Temp(); /读取温度值 ppm0=MQ_2(); /读取气体浓度值 display(temp,ppm0); /显示 if(flag=1) USART1_Cmd(); delay_ms(500); /延时500ms b. 串口配置 void uart_init(u32 bound) /GPIO端口设置 GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(

11、RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_A PB2Periph_AFIO, ENABLE); /使能USART1,GPIOA时钟以及复用功能时钟 /USART1_TX PA.9 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; /PA.9 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; /复用推挽输出 GPIO_Init(GPIOA, /USART1_RX PA

12、.10 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;/浮空输入 GPIO_Init(GPIOA, /Usart1 NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;/抢占优先级3 NVIC_InitStructure.NVIC_IRQChannelSubPriority =

13、 3; /子优先级3 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /IRQ通道使能 NVIC_Init( /根据指定的参数初始化VIC寄存器 /USART 初始化设置 USART_InitStructure.USART_BaudRate = bound;/一般设置为9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b;/字长为8位 数据格式 USART_InitStructure.USART_StopBits = USART_StopBits_1;/一个停止位 USA

14、RT_InitStructure.USART_Parity = USART_Parity_No;/无奇偶校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;/无硬件数据流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; /收发 模式 USART_Init(USART1, /初始化串口 USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);/开启中断 USART_

15、Cmd(USART1, ENABLE); /使能串口 c.ADC配置见附录 (2)软件具体实现 图 9 上位机程序 上位机与下位机通信的波特率为 9600,8 个数据位,1 个停止位。每次循 环,上位机需要向下位机发送“1”表示通信开始。当下位机接收到“1”时,向上位 机发送气体浓度值。 上位机接收到气体浓度后在波形图表上显示, 并与设定的警 戒浓度比较,当气体浓度低于警戒浓度时报警灯变为红色。 5. 实验数据及结果分析实验数据及结果分析 图 10 报警灯变为红色 图 11 报警灯为绿色 图 12 OLED 实时显示 8 6. 总结及心得体会总结及心得体会 通过本次实验,掌握了单片机串口通信的

16、方法,对 SPI 通信也有了进一步了 解,对 AD 转换有了全新的认识,通过配置 DMA 有效位 CPU 减压。将微机原理, 电子测量原理,虚拟仪器技术等学科中学过的相关知识进一步得到了巩固,锻炼 了动手能力。 然而在本次试验中,也有许多不足之处。由于使用 STM32 3.5 版库函数进行 相关开发,于是对 STM32 的寄存器了解不够透彻,使得一些代码过于繁琐。 附录附录 ADC 配置配置(DMA、定时器触发采样定时器触发采样) #include adc.h #define ADC1_DR_Address (u32)0 x40012400+0 x4c) _IO uint16_t ADC_Co

17、nvertedValue; /* * 函数名:ADC1_GPIO_Config * 描述 :使能ADC1和DMA1的时钟,初始化PC.0 * 输入 : 无 * 输出 :无 * 调用 :内部调用 */ void ADC1_GPIO_Config(void) GPIO_InitTypeDef GPIO_InitStructure; /* Enable DMA clock */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); /开启DMA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB

18、2Periph_GPIOA, ENABLE);/开启ADC时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(GPIOA, /* 函数名:ADC1_Mode_Config * 描述 :配置ADC1的工作模式为MDA模式 * 输入 : 无 * 输出 :无 * 调用 :内部调用 */ void ADC1_Mode_Config(void) DMA_InitTypeDef DMA_InitStructure; ADC_InitTypeDef ADC_I

19、nitStructure; /* DMA channel1 configuration */ DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address; /ADC地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)/内存 地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_BufferSize = 1; /缓存单元的个数 DMA_InitSt

20、ructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;/外设 地址固定 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /内存地址固 定 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; /半字 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_Mo

21、de = DMA_Mode_Circular; /循环传输 DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel1, DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);/启动中断标志 DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 configuration */ ADC_InitStructure.ADC_Mode = ADC_Mode_I

22、ndependent; /独立ADC模式 ADC_InitStructure.ADC_ScanConvMode = DISABLE ; /禁止扫描模式,扫 描模式用于多通道采集 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; /开启连续转换模 式,即不停地进行ADC转换 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2 ; /使用外部触发转换 /ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTr

23、igConv_None; / 不使用外部触发转换 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; /采集数据右对齐 ADC_InitStructure.ADC_NbrOfChannel = 1; /要转换的通道数目1 ADC_Init(ADC1, RCC_ADCCLKConfig(RCC_PCLK2_Div6); /*配置ADC1的通道1为55. 5个采样周期,序列为1 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_55Cycles5); ADC

24、_DMACmd(ADC1, ENABLE); /使能DMA传输 ADC_Cmd(ADC1, ENABLE); /使能ADC外设 10 ADC_ResetCalibration(ADC1); /复位校准寄存器 while(ADC_GetResetCalibrationStatus(ADC1); ADC_StartCalibration(ADC1); /ADC校准 while(ADC_GetCalibrationStatus(ADC1); ADC_ExternalTrigConvCmd(ADC1, ENABLE); /使用外部中断触发 /ADC_SoftwareStartConvCmd(ADC1,

25、 ENABLE); void timer_init() TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); /开启定时器时钟 TIM_TimeBaseStructure.TIM_Period = 1000; /重载时的值 触发时间 1000us,频率1000Hz TIM_TimeBaseStructure.TIM_Prescaler = 71; /分频系数 TIM_Time

26、BaseStructure.TIM_ClockDivision = 0; /时钟分割 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /向上计数 TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, /调用库函数写入寄存器 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; /选择定时器模式为脉 冲宽度调制模式1 TIM_OCInitStructure.TIM_OutputState =

27、 TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse = 100; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low; TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set; TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset; TIM_OC2Init(TIM2, TIM_Cmd(TIM2, ENABLE); TIM_CtrlPWMOutputs(TIM2, ENABLE); /控制TIM2 PWM输出 void ADC1_Init(void) ADC1_GPIO_Config(); /NVIC_User_Init(); /中断配置函数 ADC1_Mode_Config(); timer_init();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1