版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章城市环境采集Linux开发案例
3.2城市扬尘监测系统开发案例城市环境采集Linux开发案例项目采用Web服务器BOA提供服务,通过字符设备驱动获取气体传感器采集数据值,最终软件界面使用WEB框架实现,根据功能需求分析,城市扬尘监测系统主要分为两个功能界面,分别如下:1)运营首页页面:将TVOC气体传感器采集的数据,通过仪表盘以及曲线图显示在界面上。2)环境数据页面:城市PM2.5:环境数据动态分布图。3.2.1软件界面框架分析城市扬尘监测系统运营首页环境数据扬尘天气扬尘曲线城市综合信息展示城市环境采集Linux开发案例Web页面总体上采用bootstrap框架实现,通过fusioncharts图表库设计仪表盘以及曲线图。主界面分为左右两部分,左边用于显示一级导航,右边用于显示二级导航以及主体内容。主体内容通过栅格系统进行布局显示城市扬尘监测系统功能界面。3.2.1软件界面框架分析div.headul.side-navul.top-navdiv.contentdiv.maincontainer-fluiddiv.col-lg-6col-md-6col-sm-6col-xs-6div.col-lg-6col-md-6col-sm-6col-xs-6div.rowdiv.row城市环境采集Linux开发案例1)内核采用工业I/O子系统来控制ADC,该子系统主要为AD转换或者DA转换的传感器设计。下面以SAR-ADC为例子,介绍ADC的基本配置方法。2)SAR-ADC设备树配置方法如下:RK3399SAR-ADC的DTS节点在kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi文件中定义,如下所示:3.2.2TVOCLinux驱动开发ADC设备驱动开发(程序源码详细请查看文档)saradc:saradc@ff100000{compatible="rockchip,rk3399-saradc";reg=<0x00xff1000000x00x100>;interrupts=<GIC_SPI62IRQ_TYPE_LEVEL_HIGH0>;#io-channel-cells=<1>;clocks=<&cruSCLK_SARADC>,<&cruPCLK_SARADC>;clock-names="saradc","apb_pclk";status="disabled";};城市环境采集Linux开发案例ADC驱动已经被编译到缺省内核中,不需要使用insmod方式加载。TVOC传感器ADC驱动测试通过sysfs方式进行操作,首先调用open函数打开设备文件“/sys/devices/platform/ff100000.saradc/iio:device0”,接着在adcReadRaw中调用设备文件的read函数读取ADC接口原始电压数据,读取的数据在adcReadCh0Volage函数转换成有效TVOC检测数据。3.2.2TVOCLinux驱动开发TVOC应用程序(程序源码详细请查看文档)intadcReadRaw(intch){ intret=-1; if(ch>=0&&ch<=5){ charbuf[128]; snprintf(buf,128,DEVDIR"/in_voltage%d_raw",ch); intfd=open(buf,O_RDONLY); if(fd>0){ ret=read(fd,buf,128); if(ret>0){ buf[ret]='\0'; ret=atoi(buf); } close(fd); } } returnret;}城市环境采集Linux开发案例GPIO(GeneralPurposeInputOutput,GPIO是微处理器的通用输入/输出接口。微处理器可以通过向GPIO控制寄存器写入数据来控制GPIO的模式,实现对某些设备的控制或信号采集功能。GPIO在工作时有3种工作模式,即输入、输出和高阻态,这三种状态的使用和功能都有所不同,在设置时需要根据实际的外接设备来对引脚进行配置。下面对GPIO的这三种状态进行简单的概述。(1)输入模式。输入模式是指GPIO被配置为接收外接电平信息的模式,通常读取的信息为电平信息,即高电平为1,低电平为0。这时读取的高低电平是根据微处理器的电源高低来划分的,相对于5V电源的微处理器,判断为高电平时的检测电压为3.3~5V;小于2V时则微处理器判断为低电平。相对于3.3V电源的微处理器,判断为高电平时的检测电压为2~3.3V;小于0.8V时则微处理器判断为低电平。3.2.3LEDLinux驱动开发GPIO驱动开发基础城市环境采集Linux开发案例(2)输出模式。输出模式是指GPIO被配置为主动向外部输出电压的模式,通过向外输出电压可以实现对一般开关类设备的实时主动控制。当程序中向相应引脚写1时,GPIO会向外输出高电平,通常这个电平为微处理器的电源电压;当程序中向相应引脚写0时,GPIO会向外输出低电平,通常这个低电平为电源地的电压。(3)高阻态模式。高阻态模式是指GPIO引脚内部电阻的阻值无限大,大到几乎占有外接输出的全部电压。这种模式通常在微处理器采集外部模拟电压时使用,通过将相应GPIO引脚配置为高阻态模式和输入模式,通过配合微处理器的ADC可以实现准确的模拟量电平读取。GPIO驱动是Linux驱动开发中最基础、常用的驱动。例如要驱动一个LED灯、键盘扫描、输出高低电平等等。Linux内核在硬件操作层的基础上封装了一些统一的GPIO操作接口,也就是GPIO驱动框架。3.2.3LEDLinux驱动开发GPIO驱动开发基础城市环境采集Linux开发案例1)设备树基本概念ARM内核版本3.x之后引入了原来体系架构用于描述硬件资源的数据结构FlattenedDeviceTree,通过bootloader将硬件资源传给内核,使得内核和硬件资源描述相对独立。3.x之后的内核支持设备树,除了内核编译时需要打开相对应的选项外,bootloader也需要支持将设备树的数据结构传给内核。DeviceTree描述的信息包括CPU的数量和类别、内存基地址和大小、总线和桥、外设连接、中断控制器和中断使用情况和GPIO使用情况等。2)设备树的组成和使用设备树包含DTC(devicetreecompiler),DTS(devicetreesource和DTB(devicetreeblob)。其对应关系如图所示。
设备树DTS、DTSIDTBDTC3.2.3LEDLinux驱动开发城市环境采集Linux开发案例3)DTS和DTSI*.dts文件是一种ASCII文本对DeviceTree的描述,位于内核的/arch/arm/boot/dts目录下,一个*.dts文件对应一个ARM处理器,*.dtsi文件作用:一个SOC可能有多个不同的电路板,而每个电路板拥有一个*.dts,为了减少代码的冗余,设备树将这些共同部分提炼保存在*.dtsi文件中,供不同的dts共同使用。*.dtsi的使用方法,类似于头文件的使用,在dts文件中需要进行包含用到的*.dtsi文件。4)DTC编译工具DTC可以将.dts文件编译成.dtb文件。DTC的源代码位于内核的scripts/dtc目录,内核选中CONFIG_OF,编译内核的时候,主机可执行程序DTC就会被编译出来。即scripts/dtc/Makefile中:
设备树hostprogs-y:=dtcalways:=$(hostprogs-y)5)DTBDTC编译*.dts生成的二进制文件(*.dtb),bootloader在引导内核时,会预先读取*.dtb到内存,进而由内核解析。3.2.3LEDLinux驱动开发城市环境采集Linux开发案例LED硬件如图所示。4个LED灯最左侧D1可以用PWM0通道来控制,D2,D3,D4地址分别对应:gpio29,gpio211,gpio212。LED驱动开发3.2.3LEDLinux驱动开发城市环境采集Linux开发案例1)设备树分析:设备树位于:gw3399/kernel/arch/arm64/boot/dts/rockchip/x3399-linux.dts由此可知四个LED灯的IO口分别对应:LED驱动开发gpios=<&gpio29GPIO_ACTIVE_LOW>;gpios=<&gpio211GPIO_ACTIVE_LOW>;gpios=<&gpio212GPIO_ACTIVE_LOW>; gpios=<&gpio08GPIO_ACTIVE_LOW>;2)LED配置需要在设备树里添加如下内容,LED共有四个,所以需要添加四个子节点,LED配置如下:leds{compatible="gpio-leds";(程序源码详细请查看文档)3.2.3LEDLinux驱动开发城市环境采集Linux开发案例3)LED驱动开发驱动源代码位置:gw3399-linux/kernel/drivers/leds/leds-gpio.c。驱动代码如下所示:LED驱动开发(完整程序源码详细请查看文档)staticstructplatform_drivergpio_led_driver={.probe=gpio_led_probe,.shutdown=gpio_led_shutdown,.driver={.name="leds-gpio",.of_match_table=of_gpio_leds_match,},};staticconststructof_device_idof_gpio_leds_match[]={{.compatible="gpio-leds",},{},};MODULE_DEVICE_TABLE(of,of_gpio_leds_match);3.2.3LEDLinux驱动开发城市环境采集Linux开发案例3)LED驱动开发驱动源代码位置:gw3399-linux/kernel/drivers/leds/leds-gpio.c。驱动代码如下所示:LED驱动开发(完整程序源码详细请查看文档)staticstructplatform_drivergpio_led_driver={.probe=gpio_led_probe,.shutdown=gpio_led_shutdown,.driver={.name="leds-gpio",.of_match_table=of_gpio_leds_match,},};staticconststructof_device_idof_gpio_leds_match[]={{.compatible="gpio-leds",},{},};MODULE_DEVICE_TABLE(of,of_gpio_leds_match);3.2.3LEDLinux驱动开发城市环境采集Linux开发案例LED驱动主要实现对硬件设备的基本控制,具体的功能要由上层应用调用驱动提供的接口对设备进行控制。LED应用功能函数说明如表所示。LED应用程序(完整LED源码详细请查看文档)3.2.3LEDLinux驱动开发函数名称参数说明函数功能voidledInit(void)无led初始化voidledOn(intleds)leds:led灯参数LED打开函数voidledOff(intleds)leds:led灯参数LED关闭函数城市环境采集Linux开发案例PWM(PulseWidthModulation,PWM)脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值),根据设定的周期和占空比从I/O口输出控制信号,一般用来控制LED灯亮度或电机转速。占空比:输出的PWM中,高电平保持的时间与该时钟周期的时间之比。如图所示。PWM驱动开发概述(完整LED源码详细请查看文档)3.2.4PWMLinux驱动开发脉冲时间脉冲时间周期城市环境采集Linux开发案例RK3399下PWM的驱动编写,依赖于内核pwm的API,开发步骤如下:1)PWM控制的设备驱动文件中包含以下头文件:2)申请PWM使用3)配置PWM的占空比4)使能PWM函数5)禁止pwm6)释放PWM资源,比如释放所申请的pwm7)设置PWM输出极性8)内核PWM驱动常见结构体与函数PWM设备Linux驱动开发(完整程序源码详细请查看文档)3.2.4PWMLinux驱动开发城市环境采集Linux开发案例LED的PWM驱动通过sysfs虚拟文件系统方式控制操作,首先调用pwmLedInit函数,通过以下接口对设备初始化。
pwmLedPeriod(1000);//设置1000ns的持续时间
pwmLedEnable(0);//设置使能
pwmLedValue(0);//设置占空比
pwmLedPolarity(0);//设置正常模式PWM应用程序(完整程序源码详细请查看文档)3.2.4PWMLinux驱动开发城市环境采集Linux开发案例扬尘检测功能设计分为web应用设计和ARM扩展板硬件功能设计两部分组成。Web应用用于显示扬尘实时采集数据以及历史曲线图;ARM扩展板硬件功能设计主要分为三个部分第一:LED灯根据扬尘梯度显示灯个数第二:OLED屏用于显示TVOC采集数据值第三:点阵屏根据扬尘实时采集数据显示不同笑脸3.2.5扬尘检测功能设计1、Web应用设计Web应用程序主要是实时显示TVOC传感器采集数据,并通过图表的形式展现。城市环境采集界面主要有两大功能,一是TVOC传感器采集数据实时显示,二是传感器采集数据历史曲线展示。2、ARM扩展板硬件功能设计扬尘监测主应用程序是系统项目在网关上运行的核心程序,程序运行流程与功能说明:1)初始化OLED屏、点阵屏、LED灯2)adcReadRaw()读取TVOC传感器数据3)计算扬尘梯度4)读取TVOC传感器数据5)OLED屏字符显示城市环境采集Linux开发案例(HTML源码详细请查看文档)3.2.5扬尘检测功能设计6)OLED设备写数据操作,更新屏幕显示7)点阵屏笑脸显示8)点阵屏刷新显示内容9)关闭LED灯,根据扬尘梯度点亮LED灯10)休眠1秒继续到3)步骤进行循环程序中使用的主要函数说明城市环境采集Linux开发案例(主应用程序源码详细请查看文档)3.2.5扬尘检测功能设计函数名称功能说明voidfontShow16(intx,inty,char*str,void(*df)(int,int,int))OLED屏8*16或16*16字符显示voidled8x8Face(inti)点阵屏笑脸显示voidled8x8Point(intx,inty,intst)点阵屏设置指定坐标数据voidoledInit(void)OLED屏初始化voidled8x8Init(void)点阵屏初始化voidledInit(void)LED初始化intadcReadRaw(intch)读取ADC接口原始电压数据1、ARM扩展模块硬件连接ARM扩展模块硬件连接,参考1.1.5开发实践:显示模块驱动开发与测试。2、Boa编译与安装1)通过Moba软件复制boa源码到边缘计算网关2)解压源码,运行配置命令./configure。3)修订源码4)boa配置城市环境采集Linux开发案例(程序源码详细请查看文档)3.2.6开发实践:扬尘检测系统3、城市扬尘监测功能测试1)通过Moba软件复制boa_reference文件到边缘计算网关。将boa_reference文件下的www文件拷贝到根目录。城市环境采集Linux开发案例(程序源码详细请查看文档)3.2.6开发实践:扬尘检测系统$sudocp-r/home/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度护校与养老机构合作服务合同3篇
- 女生节活动策划方案(3篇)
- 中小学校实验室内部管理制度范文(二篇)
- 2025年度物流运输安全环保服务协议范本3篇
- 液压铣床课程设计摘要
- 财务分析图表课程设计
- 平路机安全操作规程范文(2篇)
- 二零二五年度房地产租赁权包销合同3篇
- 2025年上半年安全员工作总结(3篇)
- 2024年沪教版高三历史上册阶段测试试卷
- 河南省郑州市郑州经济技术开发区2023-2024学年七年级上学期期末历史试题(无答案)
- 2024年新奥集团股份有限公司招聘笔试参考题库含答案解析
- 工作述职评分表
- 新疆大学新疆数字经济研究院:2023新疆平台经济发展调研报告
- 酒店预订确认函
- 小学课爱国主义教育教案
- 会计师事务所审计工作底稿
- 内科抗菌药物合理使用优秀课件
- 触摸一体机整机检验标准 1.0
- 关于人员的处置方案
- 2023年社区体育研究报告5篇
评论
0/150
提交评论