傳感器作為各個領域最重要的設備之一,產品種類之多,應用領域之廣,隨著“智能時代”的到來,傳感器的使用將發揮更加關鍵的作用。那么,要如何以最簡單,最高效的方式使用這些種類繁多,操作復雜的傳感器呢?
傳感器作為一種檢測裝置,它的應用早已滲透到諸如工業生產、宇宙探索、海洋探測、環境保護、資源調查、醫學診斷、生物工程、甚至文物保護等等極其之廣泛的領域。可以毫不夸張地說,從茫茫的太空,到浩瀚的海洋,以及各種復雜的工程系統,幾乎每一個現代化項目,都離不開傳感器。
目前,市面上已經存在大量各種類型,各種型號,不同廠家生產的各種傳感器,例如,溫度、濕度、電壓、電流、壓強、光照、加速度、角速度等等。它們的應用場景、產品參數、使用方法都不盡相同,這往往使許多項目開發人員在使用傳感器時舉步維艱:添加一個傳感器,就要編寫對應的驅動,提供一套訪問這個傳感器的接口。通常情況下,在一個復雜的系統中,傳感器往往不止一個,可能存在幾個或幾十個甚至更多不同種類的傳感器,若這些傳感器的使用接口都不相同,那么可想而知,軟件方面的工作量和復雜度又會有多大?無形中又增加了很大的開發難度。不僅如此,若基于多種傳感器開發的應用程序想跨平臺復用,而底層各個傳感器的接口卻千奇百怪,那么,這樣的工作量和復雜度又會上升到什么程度?
為了解決這些問題,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平臺上快速完成產品開發。
上一篇:安森美半導體助力奧斯卡小金人更璀璨
下一篇:TE Connectivity推出M8/M12 傳感器線束和全新 I/O 電纜組件
推薦閱讀
史海拾趣
為了提升產品質量和用戶體驗,DMEL Inc不斷加大對生產過程的管控力度。公司引進了先進的生產設備和管理系統,建立了嚴格的質量檢測體系。同時,DMEL Inc還加強了與供應商的合作,確保原材料的質量和供應的穩定性。這些措施的實施,使得DMEL Inc的產品質量得到了顯著提升,贏得了消費者的信賴和好評。
進入21世紀后,中國市場的快速發展吸引了Futaba Electric的注意。為了更好地服務于中國市場,公司于2002年在北京成立了雙葉電子科技開發(北京)有限公司。這家子公司專營Futaba Electric的全線產品,包括VFD真空熒光顯示管、RC無線遙控設備等。通過深耕中國市場,Futaba Electric不僅擴大了產品銷量,還進一步提升了品牌知名度和影響力。
隨著電子行業的快速發展,Barry Industries Inc意識到只有不斷創新才能在市場中立足。公司加大了對研發的投入,引進了一批高素質的研發人才,并建立了完善的研發體系。經過多年的努力,Barry成功突破了微波半導體封裝技術的多項關鍵技術,推出了多款性能卓越、具有創新性的產品。這些產品不僅廣泛應用于軍事、航天、通信等領域,還為公司贏得了市場的廣泛認可。
隨著公司規模的擴大和產品線的豐富,Anderson Electronics Inc公司開始積極拓展市場。公司通過與各大電子產品零售商建立合作關系,將產品銷往全國各地。同時,公司還加大了品牌宣傳力度,通過廣告、展會等多種渠道提升品牌知名度和影響力。在市場拓展的過程中,公司始終堅持質量第一的原則,以優質的產品和服務贏得了客戶的信賴和支持。
隨著全球化進程的加速,DAESAN公司開始將目光投向國際市場。他們制定了詳細的國際化戰略,積極拓展海外市場。通過與國外企業的合作和交流,DAESAN公司逐漸建立起全球化的生產和銷售網絡。他們的產品不僅暢銷亞洲市場,還成功打入歐美等發達國家市場。國際化戰略的實施,使DAESAN公司的品牌知名度和影響力得到了顯著提升。
集成電路是一種采用特殊工藝,將晶體管、電阻、電容等元件集成在硅基片上而形成的具有一定功能的器件,英文為縮寫為IC,也俗稱芯片。集成電路是六十年代出現的,當時只集成了十幾個元器件。 后來集成度越來越高,也有了今天的P-III。 集成電路根 ...… 查看全部問答∨ |
|
1、一個年輕人,如果三年的時間里,沒有任何想法,他這一生,就基本這個樣子,沒有多大改變了。 2、成功者就是膽識加魄力,曾經在火車上聽人談起過溫州人的成功,說了這么三個字,“膽子大”。這其實,就是膽識,而拿得起,放得下,就是魄力。 ...… 查看全部問答∨ |
每日無線詞匯----射線跟蹤模型 Ray Tracing Model(zt) 類比:每天有成千上萬的人從北京出發去往全國各地,假若現在想知道每天有多少乘客從北京出發到上海。理論上我們只要把每天從北京到上海所有可能的交通工具包括飛機、火車、汽車所能運輸的人加起來便可以了。但是你有可能少考慮一部分人,他們可能跑 ...… 查看全部問答∨ |
作過vxworks+powerpc平臺上中斷開發熟悉SIPNR_L寄存器的高手請進 小弟在MPC8260上做I2C controller 的驅動開發,在中斷回調函數中對SIPNR_L寄存器的值的I2C位進行判斷,居然發現有時會出現SIPNR_L的值為0. 按道理說,只有當發生了對應的I2C中斷,這個中斷回調函數才可能被調用,此時SIPNR寄存器中I2C的標志位應該被置1 ...… 查看全部問答∨ |
|
各位大俠 ,有誰知道指示表全自動檢定儀會用到MSP430的那一款單片機呀? 有知道的請聯系我0755-28168418 QQ:754181079… 查看全部問答∨ |