历史上的今天
返回首页

历史上的今天

今天是:2025年03月13日(星期四)

正在发生

2019年03月13日 | 技术文章—如何以最简单的方式获取传感器数据?

2019-03-13


传感器作为各个领域最重要的设备之一,产品种类之多,应用领域之广,随着“智能时代”的到来,传感器的使用将发挥更加关键的作用。那么,要如何以最简单,最高效的方式使用这些种类繁多,操作复杂的传感器呢?

 

传感器作为一种检测装置,它的应用早已渗透到诸如工业生产、宇宙探索、海洋探测、环境保护、资源调查、医学诊断、生物工程、甚至文物保护等等极其之广泛的领域。可以毫不夸张地说,从茫茫的太空,到浩瀚的海洋,以及各种复杂的工程系统,几乎每一个现代化项目,都离不开传感器。

 

目前,市面上已经存在大量各种类型,各种型号,不同厂家生产的各种传感器,例如,温度、湿度、电压、电流、压强、光照、加速度、角速度等等。它们的应用场景、产品参数、使用方法都不尽相同,这往往使许多项目开发人员在使用传感器时举步维艰:添加一个传感器,就要编写对应的驱动,提供一套访问这个传感器的接口。通常情况下,在一个复杂的系统中,传感器往往不止一个,可能存在几个或几十个甚至更多不同种类的传感器,若这些传感器的使用接口都不相同,那么可想而知,软件方面的工作量和复杂度又会有多大?无形中又增加了很大的开发难度。不仅如此,若基于多种传感器开发的应用程序想跨平台复用,而底层各个传感器的接口却千奇百怪,那么,这样的工作量和复杂度又会上升到什么程度?

 

为了解决这些问题,AWorks定义了通用的传感器接口,适用于各式各样的传感器,只要是挂载在AWorks系统中的传感器,都可以通过相同的操作接口来访问。同时,只要是基于这些通用接口开发的应用程序,都不会与具体的硬件设备绑定,换句话说,底层更换使用不同型号的传感器,对应用程序不会造成影响,应用程序可以不做任何改动。

 

从功能上看,传感器实现了对真实世界中某种物理信号(温度、湿度、气压等)的采集,在使用传感器时,最重要的操作就是从传感器中获取出相应的数据。接下来,进一步介绍如何通过接口获取传感器数据作。

 

1.      传感器通道ID

 

在介绍接口的使用方法之前,需要简单了解一个概念,AWorks之所以能够实现使用一套相同的接口访问所有类型的传感器,是因为AWorks对系统中的传感器进行了统一的管理。为了实现对各式各样的传感器进行统一管理,在AWorks中,定义了“传感器通道”的抽象概念,一路传感器通道用于完成一路物理信号的采集,系统为每个传感器通道分配了一个唯一的ID。例如,若此时系统中存在三个传感器,分别为温湿度传感器HTS221(能为系统提供一路温度和一路湿度通道),三轴磁传感器LIS3MDL(能位系统提供X,Y,Z轴三路磁数据通道和一路温度通道)和光照传感器BH1730(能为系统提供一路光照度采集通道),则对应的ID分配范例详见表 1。

 

表 1  传感器通道id分配

 

 

按照以上的传感器通道ID分配方式,理论上,系统中可以挂载无数个各种类型的传感器,新加入的传感器通道只需按照以上方式依次向后分配ID即可。通常情况下,该ID号的分配已经由系统完成,无需我们自行分配,我们只需简单知道当前系统中的有效ID号所对应的传感器通道类型即可。例如,当前AWorks系统中存在的传感器如表 1所示,有三个传感器,ID号为0~6,下文中函数接口ID的使用将以此为例。

 

2.      获取传感器数据

 

基于以上对传感器ID的描述,此时若想获取传感器的数据,只需在应用程序中调用获取传感器数据的函数接口即可,获取传感器数据的函数接口如下:

 

aw_err_t  aw_sensor_data_get (int id, aw_sensor_val_t *p_val);

 

其中,id即为传感器通道ID号,p_val为存放对应ID的传感器数据。此处aw_sensor_val_t类型为一个结构体,只需知道它是一个保存传感器数据的变量即可。

 

基于此,获取系统中任意传感器通道的数据只需调用该接口即可,例如,每隔500ms获取一次温度采样数据的程序范例如下:

 

1aw_sensor_val_t tem_val;

 

2while (1) {

 

3aw_sensor_data_get(0, &tem_val);  // 通道ID为0,对应表 1中的温度采集通道

 

4aw_mdelay(500);

 

5}

 

同样,若想获取光照度传感器采样数据,程序范例如下:

 

1aw_sensor_val_t als_val;

 

2while (1) {

 

3aw_sensor_data_get(6, &als_val);  // 通道ID为6,对应表 1中的光照度采集通道

 

4aw_mdelay(500);

 

5}

 

以此类推,只需要调用这一个相同的接口,便可以依次获取系统中所有传感器的数据。此时,或许有人会疑问,系统中那么多传感器,一个一个调用该接口,会不会显得繁琐?对于该问题,AWorks系统当然给出了答案,那就是提供同时获取多通道或者所有通道传感器数据的接口,该接口原型如下:

 

aw_err_t  aw_sensor_group_data_get (const int       *p_ids,

 

                                int                num,

 

                                aw_sensor_val_t *p_buf);

 

其中,p_ids为指向传感器通道id列表的指针;num表示通道的数目,即id列表的大小;p_buf指向用于存储各通道数据的缓存,缓存大小与num一致。基于该接口,可以同时获取多个或所有系统中传感器的采样数据,例如,每隔500ms获取当前表 1中所有的传感器通道采样数据的程序范例如下:

 

1const int        id_s[7] = {0, 1, 2, 3, 4, 5, 6}; // 应用程序使用7个通道

 

2aw_sensor_val_t  val_buf[7];           // 存储7个通道数据的缓存

 

3

 

4while (1) {

 

5aw_sensor_group_data_get(id_s, 7, val_buf);      // 获取当前系统所有传感器通道的采样数据

 

6aw_mdelay(500);

 

7}

 

基于此,AWorks系统的传感器接口已经完美的实现了使用同种接口获取所有传感器采样数据的功能。此时,或许有人又会提出疑问,这两个接口采用的似乎都是轮询的方式获取传感器数据,若在效率要求较高的场合,调用该接口是不是不太好呢?再者说,如今的许多传感器都可以采用中断触发的方式获取数据,这样可以大大提高应用程序的效率,那么能不能实现这种功能呢?当然!AWorks同样提供了这种接口,而且接口的调用非常方便,简洁。接下来将为你一一揭秘。

 

3.      触发方式获取传感器数据

 

如今大多数传感器内部都支持了通过中断触发的方式通知应用程序获取传感器数据的功能,应用程序只需检测触发类型做相应的处理即可,这样大大提高了应用程序的执行效率,避免了以查询这种耗时的方式主动获取传感器数据的操作。

 

传感器具有的触发方式一般由传感器本身决定。例如,温湿度传感器HTS221具有的可配置触发方式只有数据准备就绪触发;三轴磁传感器LIS3MDL具有的可配置触发方式有数据准备就绪触发和上下门限值触发。接下来将只以数据准备就绪触发方式,讲解如何高效的获取传感器数据。

 

在AWorks中,要实现通过触发方式获取传感器通道数据,只需要两步操作即可,第一步是配置传感器通道的触发回调函数,第二步则是打开该通道的触发。

 

首先,配置传感器通道触发模式的函数原型如下:

 

aw_err_t aw_sensor_trigger_cfg (int                   id,

 

uint32_t               flags,

 

                           aw_sensor_trigger_cb_t  pfn_cb,

 

                           void                 *p_arg);

 

其中,id为传感器通道的编号,flags参数为配置的触发模式对应的宏(此处只以数据准备就绪触发举例,其所对应的宏在AWorks中定义为AW_SENSOR_TRIGGER_DATA_READY,直接传入即可),pfn_cb为触发回调函数,p_arg为用户触发回调函数参数。触发回调函数的类型为aw_sensor_trigger_cb_t,定义如下:

 

typedef void (*aw_sensor_trigger_cb_t) (void *p_arg, uint32_t trigger_src);

 

其中,p_arg为用户触发回调函数参数,trigger_src为存放的触发类型。例如,此时要配置三轴磁传感器LIS3MDL的X轴采集通道(表 1通道2)的数据准备就绪触发,程序范例如下:

 

1/* 定义一个回调函数,用于当触发事件产生时,该函数被调用 */

 

2static void __pfn_trigger_callback (void *p_arg, uint32_t trigger_src)

 

3{

 

4    /* 数据准备就绪触发*/

 

5if (trigger_src & AW_SENSOR_TRIGGER_DATA_READY) {

 

6aw_sensor_data_get(2, &data_val);   // 触发方式获取该通道的采样数据

 

7   }

 

8}

 

9aw_sensor_trigger_cfg( 2,

 

10                      AW_SENSOR_TRIGGER_DATA_READY,

 

11                   __pfn_trigger_callback,

 

12                   NULL);               // 配置通道2的数据准备就绪触发

 

当以上程序完成通道的触发方式的配置后,接下来,只需打开该通道的触发即可,该函数接口的定义如下:

 

aw_err_t aw_sensor_trigger_on (int id);

 

该函数接口只需传入id即可。注意,aw_sensor_trigger_on函数接口必须在aw_sensor_trigger_cfg接口之后调用,先后顺序不能颠倒。此时,要通过触发方式获取三轴磁传感器LIS3MDL的X轴采集数据的完整程序范例如下:

 

1aw_sensor_val_t data_val;     // 定义传感器数据缓存区

 

2

 

3/* 定义一个回调函数,用于当触发事件产生时,该函数被调用 */

 

4static void __pfn_trigger_callback (void *p_arg, uint32_t trigger_src)

 

5{

 

6    /* 数据准备就绪触发*/

 

7if (trigger_src & AW_SENSOR_TRIGGER_DATA_READY) {

 

8aw_sensor_data_get(2, &data_val);   // 触发方式获取该通道的采样数据

 

9   }

 

10}

 

11

 

12int mian()

 

13{

 

14aw_sensor_trigger_cfg(2,

 

15                      AW_SENSOR_TRIGGER_DATA_READY,

 

16                  __pfn_trigger_callback,

 

17    NULL);   

 

18aw_sensor_trigger_on (2);

 

19while (1) {

 

20aw_mdelay(1000);

 

21}

 

22}

 

通过以上的接口,完美的实现了一种接口访问所有传感器数据的功能,并且这些接口可以在任何运行AWorks操作系统的平台上使用,且无论平台中的传感器类型和数目如何变化,只需要知道该平台传感器通道的ID信息,则都可以使用这些通用接口来进行访问。只要是基于该通用接口开发的应用程序,只要是在AWorks系统中,应用程序能实现“零”修改的移植。在软件意义上,真正实现了“一次编程、终生使用、跨平台”的历史难题。

 

4.      总结

 

AWorks是ZLG历时12年开发的下一代开源嵌入式开发平台,将MCU和OS的共性高度抽象为统一接口,支持平台组件“可插拔、可替换、可配置”,与硬件无关、与操作系统种类无关的方式设计,用户只需修改相应的头文件,即可实现“一次编程、终生使用、跨平台”。

 

并且ZLG推出了一系列搭载AWorks操作系统的Cortex-M0/3/4/7、Coterx-A7/8/9、ARM7/9、DSP等常用内核的核心板。使用这些核心板,即可在AWorks平台上快速完成产品开发。

 

 


推荐阅读

史海拾趣

General Industrial Controls ( GIC )公司的发展小趣事
电感量的大小会影响电路的响应速度和稳定性。一般来说,电感量越大,电路的响应速度越慢但稳定性越好;电感量越小则相反。因此需要根据具体需求选择合适的电感量。
GPD Optoelectronics Corp公司的发展小趣事
具有完善的保护电路,包括电流限制和热关断电路。
中科银河芯(GXCAS)公司的发展小趣事
输入信号的电压范围决定了三极管何时截止、何时饱和导通。
CHERRY公司的发展小趣事

90年代初,薄膜键盘凭借其低廉的价格和轻便的特性迅速占据了市场主导地位,机械键盘一度被边缘化。然而,Cherry并未放弃机械键盘业务,而是不断进行技术创新和产品升级。随着电竞行业的兴起和消费者对高品质输入设备的需求不断增加,机械键盘市场逐渐复苏。Cherry凭借其深厚的技术积累和品牌优势,成功抓住了这一市场机遇,实现了机械键盘业务的复兴。

Cal Test Electronics公司的发展小趣事

随着公司的发展,Cal Test Electronics逐渐与B&K Precision建立了紧密的合作关系。作为姊妹公司,双方在技术研发、产品制造和市场推广等方面展开了深度合作。这种共生关系不仅为Cal Test Electronics带来了更多的资源和支持,也使其在电子配件和测试产品领域的影响力逐渐扩大。通过共享技术和市场资源,双方共同推动了行业的发展。

Gaomi Xinghe Electronics公司的发展小趣事

背景:面对电子行业日新月异的技术变革和消费者日益多样化的需求,Galaxy深知持续创新的重要性。

行动:公司不断加大研发投入,致力于产品技术的突破和创新。同时,为了更好地满足市场需求和提升品牌形象,Galaxy推出了全新的品牌理念和系列产品。例如,“个性玩家 影驰显卡”的品牌理念以及独一无二的“影驰玩家系列”产品,凭借独特的双BIOS设计、蜂鸣器报警设计等创新功能,赢得了广大消费者的喜爱和认可。

成果:这些创新举措不仅提升了Galaxy产品的市场竞争力,还进一步巩固了公司在电子行业内的领先地位。

问答坊 | AI 解惑

WINCE的项目中,能引用System.timers吗?

我在C#程序中想添加个计时器:                 System.Timers.Timer aTimer = new System.Timers.Timer();                 aTimer.Elap ...…

查看全部问答>

请高手支招,寻找MAX323EPE的替换芯片

感谢您进来,祝您身体健康,财源滚滚! 我现在有一个硬件用的芯片是MAX323EPE,但是不支持VISTA和WIN7,有没有一种芯片能替换的,非常感谢。…

查看全部问答>

wince界面设计问题

请问要设计出这样的界面需要使用什么软件? 这种界面设计使用的什么方法。都是贴的图吗? 那具体设计过程是怎么样的? 好像是先设计整个界面,然后在截图。 …

查看全部问答>

在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口?

在WINCE60里面把CELLCORE组件加进了NK,怎么测试这块是不是可以正常工作?有没简单的测试AP可用?怎么测试RIL组件绑定了物理通信的串口?…

查看全部问答>

系统是怎么调用PS2驱动的入口函数的?

最近在做一个在JZ上的PS2驱动,因为是第一次做驱动,所以不清楚具体是怎样掉用这个驱动的入口函数的?请各位大大帮帮忙,有帮忙的都有10分,不够我再加…

查看全部问答>

ppc2003可以直接访问sql2000 server中的数据吗?

ppc2003通过wifi跟局域网连接后,可以通过编程直接访问服务器上sql2000 server中的数据吗?有人说必须在ppc上安装sql CE,然后通过sql CE跟服务器上的sql2000交换数据?真的是这样?…

查看全部问答>

vworks中多任务的实现能否以多个文件中发起

因设计的模块较多,在有的模块中有任务发起。有的模块中仅有函数调用,在vxSIM调试时,不能顺利进行下去。有人能批点一下不? 另外,在一个文件中发起任务,在另一个文件中实现任务,可以不? 在任务中再发起子任务可以这样设计吗?…

查看全部问答>

立即报名预约2010吉时利新能源与新材料测试技术研讨会

2010年度吉时利测试测量技术全国巡回研讨会将从9月初开始,在成都、重庆、合肥、南京、哈尔滨、武汉、兰州举办届时吉时利资深技术专家将与您深入交流: 绿色电子革命中的光电测试/新能源测试方案 新材料的测试方案 微弱信号测量难点与应对方 ...…

查看全部问答>

uCADCDMA通道4中断问题!

使用uC2.86   ADC使用DMA中断的模式,在DMA1_CH1 初始化以及 中断 都没问题,都可以进中断, 但是改成 DMA1_CH4 就再也不进中断了,为什么?? 难道 DR_ADDRESS 地址不对?? RCC,等其他设置应该都没问题请大家看下我的初始化函 ...…

查看全部问答>

问高手一个关于STM8 I2C的问题

最近在调STM8 的I2C(不想搞模拟的I2C),结果I2C没有调通,不知道问题所在,软件是参考I2C EEPROM固件那个程序写的。初始化如下: void IIC_Init(void) { UCHAR temp; CLK_PCKENR1 |= 0x01; I2C_CR1    = 0x00;  &n ...…

查看全部问答>