2.1.1 昇腾310芯片及Atlas 200 AI加速模块
一、实验内容与要求
1.1 实验内容
此次嵌入式系统综合实验设计的具体内容为根据实际需求,提出相应设计方案,利用学期中基础实验以及提高实验中的相关模块(至少为4个)进行编程设计实现,完成一个展示性较好,且较稳定的可应用系统。根据以上具体内容需要需求,我本次设计的实验题目为模拟监测温度系统,利用Led灯,温湿度传感器,四位八段数码管,Oled显示屏幕等模块进行实现,并在此次实现过程中获取诸多有益知识,学习编程技巧,积累软硬件结合能力等。
模拟监测温度系统的主要功能是监测温度信息,反馈温度环境安全信息,显示提醒信息。实验具体实现是利用各模块驱动开发板器件进行数据获取,数据分析,结果反馈:首步利用温湿度传感器获取环境温度信息,其次将温度监测数据进行相关数据分析后变作数码管输入合法格式参数,实现温度数据在数码管显示(因器件有限,取温度前四位数字),与此同时将此温度监测数据与系统设计的高温阈值、低温阈值进行比较,显示环境温度安全信息,如高温预警,低温预警,温度正常等。实验内容较为简单明确,设计内容实用贴近生活,属于嵌入式系统硬件实验的综合应用。
1.2 实验要求
嵌入式系统硬件综合实验的实验要求包含硬件模块使用数量,系统实现性能,系统完成独立性,编程完成使用,验收答辩及实验报告等具体条目:
硬件模块要求利用基础实验及提高实验中的至少4个实验模块;
设计系统要求展示性较强,具有稳定的运行性能;
本次综合实验要求单人独自设计,独自编程及实现;
设计系统代码文件要求上交时有较为明细的注释,结构清晰;
综合系统完成后进行验收,验收内容为系统使用情况,课件展示,设计报告等。
1.3 实验目的
嵌入式系统硬件综合实验的实验目的包括完成系统基本功能设计,增加硬件软件结合能力,巩固课程学习内容,培养解决问题能力,培养创新精神等条目:
实现设计系统的基本功能,达到实验预期效果;
通过使用开发板设计具体系统功能,来提高软硬件结合能力以及实践能力;
通过自主完成硬件实验设计,培养自我创新精神,加强解决问题能力;
通过分析系统运行过程,巩固课程学习内容,培养分析问题能力;
激发激发学习兴趣与热情,增强民族自信心与成就感;
二、实验原理与硬件连线
2.1 实验原理
实验原理部分主要介绍华为昇腾310芯片开发板总体介绍,模拟监测温度系统具体使用硬件情况,使用硬件驱动原理等及部分。
2.1.1 昇腾310芯片及Atlas 200 AI加速模块
昇腾(HUAWEI Ascend) 310是一款高能效、灵活可编程的人工智能处理器,在典型配置下可以输出16TOPS@INT8, 8TOPS@FP16,功耗仅为8W。采用自研华为达芬奇架构,集成丰富的计算单元, 提高AI计算完备度和效率,进而扩展该芯片的适用性。全AI业务流程加速,大幅提高AI全系统的性能,有效降低部署成本。
Atlas 200是一款高性能低功耗的AI加速模块,外形尺寸只有半张信用卡的大小,耗电量仅为9.5瓦,支持16通道实时高清视频分析,可以部署在摄像头、无人机和机器人等设备上。此次综合实验的实验板图片如图1所示。
图1 Atlas 200DK 实验开发板
2.1.2 模拟监测温度系统具体使用硬件
Atlas 200DK实验开发板的具体技术参数包含所有开发板使用硬件名称及技术参数情况。此次综合实验使用到的必需部分为芯片为主处理芯片Ascend310芯片,串行总线接口I2C部分,外置256MB的SPI Flash,Type-c接口。
而模拟监测温度系统应实验要求的至少使用4个在基本实验及提高实验中的基本模块则为128*64分辨率白色OLED显示屏、4路单色LED、4位8段数码管及实时温湿度传感器,以上具体必需器件及4个使用模块的作用详细列出如下条目,使用模块的位置则使用图片圈出如图2。
必需部分使用功能:
主处理芯片Ascend310:支持系统运行,提高强大算力;
串行总线I2C部分:4个使用模块申请I2C接口进行初始驱动;
外置内存卡:制卡后数据文件及使用文件存储;
Type-c接口:连接电脑和Atlas200DK开发板。
使用的4个模块:
OLED屏幕:显示“高温预警”,“低温预警”,“温度正常”等警示信息;
LED灯:系统开启工作标志,系统开启后自动闪烁3次;
数码管:实时显示温度信息,反馈监测结果;
温湿度传感器:监测温度,系统实现的最重要模块。
图2 系统具体使用模块
2.1.3 具体使用模块驱动原理
LED驱动:
在linux 中几乎所有的对象都被看做是文件,甚至包括那些并不是文件的对象。在此,我们将使用sysfs 的虚拟文件系统。sysfs 中暴露了硬件的驱动程序,因此可以轻松地使用它们。通过sysfs 方式控制GPIO,先访问/sys/class/gpio 目录,向export 文件写入GPIO 文件描述符,使得该GPIO 的操作接口从内核空间暴露到用户空间,GPIO 的操作接口包括direction 和value 等,direction 控制GPIO方向,而value 可控制GPIO 输出或获得GPIO 输入。
在Altas200 模块中有四个GPIO 控制器模块,GPIO 文件描述符和硬件管脚编号的对应信息如下表1所示:
表1 GPIO文件描述符及硬件管脚编号对应信息表
gpio控制器 | gpio数量 | gpio端口信号名称 | 文件描述符编号 |
gpio0 | 14 | GPIOn(n:0~13) | 498+n(498~511) |
gpio1 | 31 | GPIOn(n:32~62) | 467+n–32(467~497) |
gpio2 | 32 | GPIOn(n:64~95) | 435 + n–64(435~466) |
gpio3 | 2 | GPIOn(n:96~97) | 433 + n–96(433~434) |
在Altas200 实验板上 4 个 LED 和 GPIO 硬件管教的对应编号为:
LED1 GPIO2 LED2 GPIO59 LED3 GPIO60 LED4 GPIO81
LED2 和 LED3 暂时不能使用,本实验我们使用 LED1 和 LED4。
根据上表以及后续查看gpio信息,我们可以算出:
LED1对应的文件描述编号为498+2=500,LED4对应的文件描述编号为435+81-64=452。
使用的具体命令行列条如下:
在终端导出GPIO 对应的描述文件:echo N > /sys/class/gpio/export
GPIO 管脚方向设置
输入以下命令将管脚方向设置为输入echo in > /sys/class/gpio/gpioN/direction
输入以下命令将管脚方向设置为输出echo out > /sys/class/gpio/gpioN/direction
查看电平值:cat /sys/class/gpio/gpioN/value
输出低电平:echo 0 > /sys/class/gpio/gpioN/value
输出高电平:echo 1 > /sys/class/gpio/gpioN/value
debugfs 是Linux 系统下为了方便驱动开发人员对驱动调试的文件系统:
cat /sys/kernel/debug/gpio
温湿度传感器
SHT20,新一代 Sensirion 湿度和温度传感器在尺寸与智能方面建立了新的标准:它嵌入了适于回流焊的双列扁平无引脚 DFN 封装,底面 3x3mm,高度1.1mm。传感器输出经过标定的数字信号,标准 I2C 格式。SHT20 配有一个全新设计的 CMOSens®芯片、一个经过改进的电容式湿度传感元件和一个标准的能隙温度传感元件,其性能已经大大提升甚至超出了前一代传器(SHT1x 和 SHT7x)的可靠性水平。
数码管
根据图2所示的数码管内部电路,使用两个PCA9557 芯片控制管脚的通断,给PCA9557 写入不同的数据,管脚会输出不通的高低电平。管脚12、9、8、6 控制数码管的片选,管脚11、7、4、2、1、10、5、3 控制具体的A、B、C、D、E、F、G Led 灯。
图2 8位数码管内部电路
以驱动数码管显示数字3 为例,需要点亮A、B、C、D、G,使F、E 熄灭。首先A、B、C、D、E、F、G 的控制位输出低电平,Dig1、Dig2、Dig3、Dig4 输出高电平,数码管全部点亮。因此让F、E 熄灭只需要让控制E、F 的位保持高电平即可。因此PCA9557(add=0x18)=0x2E (00101110), PCA9557(add=0x1C) =0x29 (00101001)。让数码管显示不同的数字,控制数码管的片选位,每次刷新只让一位数字显示,当刷新速度超过人眼的接受的能力时,就可以观察到数码管分别显示不同的数字。
2.2 硬件连线
嵌入式系统硬件综合实验使用的硬件开发板Atlas200DK,其硬件连线具体情况如图3所示,具体阐述为USB-Typec线连接Atlas200和电脑,充电器连接Atlas200DK供电(在设计实验时有想过反馈信息进行邮件发送,使用千兆网口连接电脑配置网络)。
硬件连线较为简单,在设计系统时候也未出现太多错误状况,大多只是接口松动,供电不足等小细节。
图3 硬件连线情况
三、设计思路、步骤和程序流程图
3.1 设计思路
模拟监测温度系统的设计思路是在看到一些关于存储粮食的报道中跳跃出来的,粮食存储需要适宜的温度,去保证粮食以及食品的长期储存。同时在生活中对于植物的栽培,衣物的放置,药物的储存都有着对温度的高度要求。所以在看到这样的一些示例之后,我认为设计一个温度监测系统是一个有益且实用的一个应用雏形。
模拟监测温度系统所采用的模块有LED灯,OLED屏幕,数码管以及温湿度传感器。实现思路很简单,首先需要利用温湿度传感器来把环境温度实时测试,而最开始我只获取一次的温度数据,先把单次做好,那实时监测其实只是在一定时间间隔里去重复操作而已,所以我把温湿度传感器的驱动程序进行了改写,返回的是单次的温度数值。而获取温度之后呢,肯定需要进行展示,我设想的温度监测系统是有一个实时显示温度的屏幕或者数码管,所以我选择了数码管去实时显示温度,OLED屏幕去根据温度反馈注意信息。而为什么不选择OLED屏幕去显示温度呢,其实也有这样想过,但后面发现那反馈信息再显示在OLED屏幕上的话,有点鸡肋多余的感觉。
此温度监测系统的主体功能系统很简单,后面添加了一个标志系统开启的信号,用LED1闪烁3下标志系统已经开启,而后一直常亮来表示系统正在工作。而实时显示温度以及反馈注意信息,在完成单次设置后,设置间隔时间主要通过多次监测来实现,主要功能都在一个循环里面重复工作。
3.2 实验步骤
系统运行的主要实验步骤,顺序列条如下,不包括繁杂的编程步骤:
为开发板连接电源
type-c口连接Atlas200DK和电脑;
CMD窗口输入ssh HwHiAiUser@192.168.1.2登录Atlas200DK开发板;
MobaXter利用SSH连接输入ip:192.168.1.2以及用户名HwHiAiUser,密码Mind@123进入系统内部;
切换root用户
上传系统代码文件Ascend31011到/home/HwHiAiUser目录下;
输入设置gpio命令:
导出LED1对应文件描述符:
echo 500 > /sys/class/gpio/export
设置GPIO管脚方式为输出:
echo out > /sys/class/gpio/gpio500/direction
设置完成后,可输入以下命令查看是否设置gpio成功:
cat /sys/kernel/debug/gpio
进入代码文件build目录:cd /home/HwHiAiUser/Ascend31011/build
输入cmake ../src/ && make进行编译;
进入代码文件out目录:cd /home/HwHiAiUser/Ascend31011/out
执行 ./main -h输出执行功能列表;
执行 ./main -t mgx_Test命令开启系统;
Ctrl+Z结束程序;
3.3 程序流程图
根据上述实验步骤,可绘出模拟监测温度系统的执行程序流程图如图4所示。该温度监测系统具体实现流程是顺序执行,拥有的功能操作都较简单,不需要太复杂的程序调用,后期维护修改的步骤也顺序测试即可,所用到的功能模块原理也易查。
图4 监测温度系统程序流程图
四、程序清单与执行结果
4.1 程序清单
程序清单主要列举了main.cpp以及定义功能函数头文件task.h,功能实现函数task.cpp。
4.2 执行结果
在MobaXter终端执行./main -t mgx_Test命令之后,终端会显示各个模块申请I2C总线部署成功的消息,同时系统开启后,温湿度传感器每次获取的数据也会同样地显示在终端设备上(终端设备上的温度以及湿度信息比数码管显示得更加全面,而数码管在现实生活中更加简便以及醒目)显示信息如图5。
图5 MobaXter终端信息显示
系统开启后,首先响应的是LED灯,LED1会闪烁三次进行标识系统启动。LED1在系统未开启时起初状态为亮,系统开启而后首先变为灭,其次变为亮,循环三次后常亮,如图6~7所示。(注:LED2~LED4默认为全亮)
图6 LED闪烁:亮
图7 LED闪烁:灭
LED1闪烁完毕后,模拟监测温度系统开始监测温度,将所获取得温度数据显示在4位八段数码管上,同时根据环境温度值比较设置环境高低阈值进行OLED屏幕上的信息反馈(注:高温阈值设置为60度,低温阈值设置为30度;OLED屏幕上显示信息为“High Warning!!!!”,“Low Warning!!!!”,“Suitable TEMP”),运行结果见图8,9。
图8 数码管显示温度信息
图9 OLED屏幕显示反馈信息
五、程序调试说明和实验感想
5.1 调试说明
设置gpio时出现重复导出或者是导出错误,导致在实验LED1闪烁时出现无法打开文件描述符的问题,如图10;
解决方法:重新启动Atlas200DK开发板,原有程序会重置文件描述符导出与否;
设置gpio时出现占线或者gpio忙碌的问题,但这是第一次申请,如图10;
解决方法:使用cat /sys/kernel/debug/gpio查看gpio端口申请详细信息,进行取消申请或是重新启动程序,重新申请,如图11;
图10 gpio设置出现问题截图
图11 查看gpio设置情况
系统运作卡住或者是时间太慢,相隔时间太长,很久才测出一次温度数据,OLED屏幕以及数码管显示也十分缓慢;
解决方法:查看代码文件中是否有未修改的while循环,使得代码一直没有跳出;
查看代码中usleep函数或者是sleep函数数值是否设置太大;
查看开发板运行情况是否卡住,无法做出响应;
在各个模块申请I2C总线时,只能通过第一个模块的申请,后面模块申请不了。而且会提示Segmentation Fault的报错信息,如图12;
解决方法:网上查看Segmentation Fault错误信息的引起原因,逐步筛查,得出是因为内存越界非法访问等问题。因此去查看每个模块申请I2C总线后数据对象是否释放或者重置。我采取的方法是暴力free,避免了重置带来的格式以及地址错误。
图12 错误信息
Free各模块的数据对象出现错误,使用方法错误,如图13;
解决方法:先使用I2C函数中的free函数释放I2C资源,再使用正常的free释放数据对象。
图13 错误信息
5.2 实验特色
此次嵌入式系统硬件综合实验的模拟监测温度系统较为容易,代码方面工作也不特别困难,而它的特别之处在于与实际生活,农业生产,物品放置等些许方面关联度高,能够成为设计生活系统的应用雏形。其使用的器件是学期中基础实验以及提高实验中的重点内容,因此它的另一好处是可作为课程延续的一个成功应用,可谓学以致用。模拟监测温度系统与其他设计相比技术难点不占优势,但是在此基础上能够增加的点还足够继续进行,其创新性在于联系生活实际,增加对于技术以及社会生活,工业农业,生物制药等学科的挖掘,其真正实现或有千万种形态,在各个产业的发展也是这个监测系统带来的启发意义。
5.3 总结与展望
此次嵌入式系统综合硬件实验的模拟监测温度系统设计是嵌入式系统课程的重难点,包含了平时实验中在Atlas200DK中使用的主要模块使用,同时将其串联起来一起设计,也是对于课程学习的巩固以及加深理解。我对于此次模拟监测温度系统的完成有满意之处,也有不满之处。满意之处在于这是自己独立完成的一套系统,通过实现这个模拟监测温度系统,将之前所学的硬件知识有了一些更多的理解,比如gpio文件描述符的导出以及设置上,比如Linux命令使用上。包括对于温度获取后的数据分析,也是对于计算机理解的深入。最后能够将一个简单而展示性高的系统完成,并且在搜集资料,解决问题的过程中积累经验是达到开始前设计目标的。不满之处在于实现系统过程中对于数值设置,温度监测频率控制上出现了许多问题,去做太多不值当的工作。同时系统实现过程有对开题时一些要求的降低,也是准备以及学习工作的不足。计算机硬件知识的匮乏和编程的笨拙是需要积累练习的,之后实验过程中应该早做准备。我对于此次实验的展望还是挺多的,我在实现过程中有试过配置网络,使用STMP协议发送邮件,一直没有成功,花了三四天的时间却无功而返,之后有机会应该将此完成。同时我对于一个系统的理解应该是各部分协同工作,是一个并发的过程。但是能力有限无法实现,对于一个确切系统的完善,应该对于各部件之间的工作方式有一个明白的划分。进程方面的编程也没有太熟悉,对于现在的自己难度还是太大,所以希望之后花点时间拓宽点知识面以及动手能力。这个温度监测系统是否可以加上摄像头功能,比如人出现在这样的一个环境中,应该根据温度反馈信息及时警报,驱赶走人,脱离危险;同时温度监测的高低温阈值是否可以通过更加全能的,具有更多器件的芯片来进行交互设置等问题,都是我对这个项目的一些展望。