0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

I2C總線、UART總線和A/D轉(zhuǎn)換器應(yīng)用設(shè)計(jì)

AGk5_ZLG_zhiyua ? 來源:互聯(lián)網(wǎng) ? 作者:佚名 ? 2018-05-28 08:57 ? 次閱讀

本文導(dǎo)讀

在傳統(tǒng)的基于寄存器的開發(fā)模式中,使用一個(gè)外設(shè)往往要閱讀英文手冊,理解寄存器每一位的含義,一步一步操作、調(diào)試,十分麻煩。AWorks提供的外設(shè)通用接口不僅可以跨平臺(tái)復(fù)用,而且非常簡潔,一個(gè)外設(shè)往往只有2~3個(gè)接口。本文將介紹通用的I2C、UARTADC接口。本文為《面向AWorks框架和接口的編程(上)》第三部分軟件篇——第7章通用外設(shè)接口——第4~6小節(jié):I2C總線、UART總線和A/D轉(zhuǎn)換器。

7.4 I2C總線

7.4.1 I2C總線簡介

I2C器件的兩線制總線,不僅硬件電路非常簡潔,而且還具有極強(qiáng)的復(fù)用性和可移植性。I2C總線不僅適用于電路板內(nèi)器件之間的通信,而且通過中繼器還可以實(shí)現(xiàn)電路板與電路板之間長距離的信號(hào)傳輸,因此使用I2C器件非常容易構(gòu)建系統(tǒng)級(jí)電子產(chǎn)品開發(fā)平臺(tái)。其特點(diǎn)如下:

  • 總線僅需2根信號(hào)線,減少了電路板的空間和芯片管腳的數(shù)量,降低了互連成本;

  • 同一條I2C總線上可以掛接多個(gè)器件,器件之間按不同的編址區(qū)分,因此不需要任何附加的I/O或地址譯碼器;

  • 非常容易實(shí)現(xiàn)I2C總線的自檢功能,以便及時(shí)發(fā)現(xiàn)總線的異常情況;

  • 總線電氣兼容性好,I2C總線規(guī)定器件之間以開漏I/O互連,因此只要選取適當(dāng)?shù)纳侠?a target="_blank">電阻就能輕易實(shí)現(xiàn)3V/5V邏輯電平的兼容;

  • 支持多種通信方式,一主多從是最常見的通信方式。此外還支持雙主機(jī)通信、多主機(jī)通信與廣播模式;

  • 通信速率高,其標(biāo)準(zhǔn)傳輸速率為100Kbps(每秒100K位),在快速模式下為400Kbps,按照后來修訂的版本,位速率可高達(dá)3.4Mbps。

7.4.2 I2C接口

絕大部分情況下,MCU都作為I2C主機(jī)與I2C從機(jī)器件通信,因此這里僅介紹AWorks中將MCU作為I2C主機(jī)的相關(guān)接口,接口原型詳見表7.14。

表7.14 I2C標(biāo)準(zhǔn)接口函數(shù)

1. 定義I2C從機(jī)器件實(shí)例

對(duì)于用戶來講,使用I2C總線的目的往往是用于操作一個(gè)從機(jī)器件,比如,LM75、E2PROM等。MCU作為I2C主機(jī)與從機(jī)器件通信,需要知道從機(jī)器件的相關(guān)信息,比如,I2C從機(jī)地址等。在AWorks中,定義了統(tǒng)一的從機(jī)器件類型:aw_i2c_device_t,用于包含從機(jī)器件相關(guān)的信息,以便主機(jī)正確的與之通信。該類型的具體定義用戶無需關(guān)心,在使用I2C操作一個(gè)從機(jī)器件前,必須先使用該類型定義一個(gè)與從機(jī)器件對(duì)應(yīng)的器件實(shí)例,例如:

其中,dev為用戶自定義的從機(jī)實(shí)例,其地址可以作為接口函數(shù)中p_dev的實(shí)參傳遞。

2. 初始化從機(jī)器件實(shí)例

當(dāng)完成從機(jī)器件實(shí)例的定義后,還需要完成其初始化,指定從機(jī)器件相關(guān)的信息,初始化函數(shù)的原型為:

其中,p_dev為指向I2C從機(jī)實(shí)例的指針,busid為I2C總線編號(hào),addr為從機(jī)器件地址,flags為從機(jī)器件相關(guān)的一些標(biāo)志。

在AWorks中,一個(gè)系統(tǒng)往往具有多條I2C總線,各總線之間通過busid區(qū)分,一個(gè)系統(tǒng)實(shí)際支持的I2C總線條數(shù)與具體硬件平臺(tái)相關(guān)。例如,在i.MX28x系統(tǒng)中,最高可以支持2條I2C總線,對(duì)應(yīng)的總線編號(hào)即為:0 ~ 1。busid參數(shù)即用于指定使用那條I2C總線與從機(jī)器件進(jìn)行通信。

addr為從機(jī)器件的I2C地址,由于讀/寫方向位由系統(tǒng)自動(dòng)控制,因此,地址中不需要包含讀寫方向位。地址可以為7位地址和10位地址。

flags為從機(jī)器件相關(guān)的屬性標(biāo)志,可分為3大類:從機(jī)地址的位數(shù)、是否忽略無應(yīng)答和器件內(nèi)子地址(通常又稱之為“寄存器地址”)的字節(jié)數(shù)。具體可用屬性標(biāo)志詳見表7.15,可使用“|”操作連接多個(gè)屬性標(biāo)志。

表7.15 從機(jī)設(shè)備屬性

例如,要使用I2C0(I2C總線的busid為0)操作溫度傳感器芯片LM75B,則應(yīng)該首先定義并初始化一個(gè)與LM75B對(duì)應(yīng)的從機(jī)器件。這就還需要知道兩點(diǎn)重要的信息:器件從機(jī)地址和實(shí)例屬性。

要獲取這些信息,就必須查看芯片相關(guān)的數(shù)據(jù)手冊,對(duì)于LM75B,其引腳分布圖詳見圖7.12。LM75B的器件地址為7位地址:1001A2、A1、A0,其中,A2、A1、A0分別為引腳A2、A1、A0的狀態(tài)。在擴(kuò)展板中,LM75B等效的應(yīng)用電路詳見圖7.11。

其中,R9和R10是I2C總線的上拉電阻,同時(shí),只要短接(J13_1、J13_2)與(J11_1、J11_2),LM75的SCL和SDA引腳分別與I2C0總線的SCL和SDA相連。

圖7.11 LM75B應(yīng)用電路

圖7.12 LM75B管腳圖

由圖7.11可知,A2、A1、A0均與地連接,因此,LM75的地址中相應(yīng)位的值均為0,由此可得LM75B的7位地址為:1001000,即0x48。

從機(jī)屬性分為從機(jī)地址屬性、應(yīng)答屬性和器件內(nèi)子地址屬性。LM75B的從機(jī)地址為7位,其對(duì)應(yīng)的屬性標(biāo)志為AW_I2C_ADDR_7BIT。

如果從機(jī)實(shí)例不能應(yīng)答,則設(shè)置AW_I2C_IGNORE_NAK標(biāo)志,一般來說,標(biāo)準(zhǔn)的I2C從機(jī)器件均可產(chǎn)生應(yīng)答信號(hào),除非特殊說明,否則都不需要使用該標(biāo)志。LM75B內(nèi)部共計(jì)有4個(gè)寄存器,它們的定義詳見表7.16。

表7.16 LM75B內(nèi)部寄存器列表

由表中地址欄內(nèi)容可知,所有寄存器的地址均為8位,因此,器件內(nèi)子地址為一個(gè)字節(jié),對(duì)應(yīng)的屬性標(biāo)志為:AW_I2C_SUBADDR_1BYTE。因?yàn)槠骷拥刂分挥幸粋€(gè)字節(jié),所以沒有高字節(jié)與低字節(jié)之分,也就無需使用

AW_I2C_SUBADDR_MSB_FIRST

或AW_I2C_SUBADDR_LSB_FIRST標(biāo)志。

通過以上分析,得到了LM75B相關(guān)的從機(jī)信息,為此,可以定義并初始化一個(gè)與LM75B對(duì)應(yīng)的從機(jī)器件實(shí)例,范例程序詳見程序清單7.26。

程序清單7.26 從機(jī)器件實(shí)例初始化函數(shù)范例程序

3. 讀操作

從I2C從機(jī)器件指定的子地址中讀出數(shù)據(jù)的函數(shù)原型為:

其中,p_dev為指向I2C從機(jī)實(shí)例的指針,subaddr為器件子地址,以指定讀取數(shù)據(jù)的位置,p_buf指向存放讀取數(shù)據(jù)的緩沖區(qū),nbytes指定讀取數(shù)據(jù)的字節(jié)數(shù)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示讀取成功,否則,表示讀取失敗。

由表7.16可知,在LM75B中,地址0存放了2字節(jié)的溫度值,如需讀取溫度,則可以直接從地址0中讀取2字節(jié)數(shù)據(jù),范例程序詳見程序清單7.27。

程序清單7.27 讀取數(shù)據(jù)范例程序

讀取的兩字節(jié)數(shù)據(jù)表示的溫度值是多少呢?這兩個(gè)字節(jié)具體表示的溫度值含義可從芯片的數(shù)據(jù)手冊獲取。溫度使用16位二進(jìn)制補(bǔ)碼表示,最高位為符號(hào)位,最高位為1時(shí),表示溫度為負(fù)數(shù)。讀取溫度時(shí),讀取的首個(gè)字節(jié)是高8位數(shù)據(jù),緊接著的字節(jié)是低8位數(shù)據(jù)。各個(gè)位表示的溫度權(quán)重詳見表7.17。

表7.17 溫度值數(shù)據(jù)各個(gè)位的含義

表中,2的n次方表示溫度的權(quán)重。實(shí)際中,LM75B的溫度分辨率有限,只能達(dá)到小數(shù)點(diǎn)后3位,低5位的值通常為0,是無效的,因此,LM75B實(shí)際溫度的分辨率為2-3,即0.125℃。

據(jù)此,可以將字節(jié)0和字節(jié)1合并為一個(gè)有符號(hào)的16位整數(shù),例如:

由于低5位無效,因此,式中將字節(jié)1與0xE0(1110 0000)作了 “與”運(yùn)算,將低5位可靠的清0。同時(shí),式中將整數(shù)部分左移了8位,小數(shù)部分也使用整數(shù)表示,相當(dāng)于把原溫度值擴(kuò)大了256(28)倍。因此,temp的值為實(shí)際溫度值的256倍,由此得到了LM75B采集到的溫度值。

基于此,可以編寫一個(gè)溫度采集的范例程序,詳見程序清單7.28。

程序清單7.28 溫度采集范例程序

程序中,每秒采集一次溫度值,并使用aw_kprintf()打印輸出。打印輸出當(dāng)前的溫度值時(shí),由于aw_kprintf()暫時(shí)不支持直接打印浮點(diǎn)數(shù),例如:

因此,分別打印了整數(shù)部分和小數(shù)部分,整數(shù)部分可以將temp整除256得到。計(jì)算小數(shù)部分時(shí),先將temp擴(kuò)大了1000倍,再除以256,得到的值即為實(shí)際溫度的1000倍,最后對(duì)1000取余,即可得到實(shí)際溫度小數(shù)點(diǎn)后3位的值。例如,實(shí)際溫度為11.375度,則temp的值為11.375的256倍,即2912,整數(shù)部分即為該值整除256:

小數(shù)部分的值計(jì)算過程如下:

最終打印輸出的結(jié)果即為:

這樣的計(jì)算過程雖然看起來復(fù)雜了一些,但是其卻從根本上避免了浮點(diǎn)運(yùn)算,保證了程序運(yùn)行的效率。在沒有硬件浮點(diǎn)運(yùn)算單元的MCU中,浮點(diǎn)運(yùn)算是通過軟件模擬的,效率非常低下。在AWorks中,如非必要,都應(yīng)該盡可能避免浮點(diǎn)運(yùn)算。即使是在有浮點(diǎn)運(yùn)算單元的MCU中,也應(yīng)該在一些基礎(chǔ)的運(yùn)算中避免使用浮點(diǎn)運(yùn)算,因?yàn)樵谏倭亢唵蔚母↑c(diǎn)運(yùn)算中,使用硬件浮點(diǎn)運(yùn)算單元計(jì)算時(shí),效率并不能得到明顯的提升,反而增加了系統(tǒng)的負(fù)擔(dān),例如,當(dāng)外部中斷產(chǎn)生時(shí),需要保護(hù)現(xiàn)場,如果使用了硬件浮點(diǎn)運(yùn)算單元,則保護(hù)現(xiàn)場的數(shù)據(jù)量將大大增加。一般來講,只有在需要大量浮點(diǎn)運(yùn)算的場合(比如,在一些算法計(jì)算中,很難使用整數(shù)運(yùn)算來避免浮點(diǎn)運(yùn)算),才使用浮點(diǎn)運(yùn)算。

需要特別說明的是,這里通過I2C總線直接讀取了LM75B溫度傳感器中的溫度值,僅用于介紹I2C總線接口的使用方法。實(shí)際中,AWorks已經(jīng)定義了通用的溫度接口,在應(yīng)用中讀取溫度時(shí),均建議直接使用通用的溫度接口。

4. 寫操作

向I2C從機(jī)實(shí)例指定的子地址中寫入數(shù)據(jù)的函數(shù)原型為:

其中,p_dev為指向I2C從機(jī)實(shí)例的指針,subaddr為器件子地址,以指定寫入數(shù)據(jù)的位置,p_buf指向存放待寫入數(shù)據(jù)的緩沖區(qū),nbytes指定寫入數(shù)據(jù)的字節(jié)數(shù)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示寫入成功,否則,表示寫入失敗。

由表7.16可知,在LM75B中,地址2和地址3中各存放了2字節(jié)的溫度值,分別表示溫度上限值(Thyst)和下限值(TOS),Thyst必須小于TOS,兩個(gè)溫度值均是可讀可寫的,默認(rèn)情況下,Thyst的值為75℃,TOS的值為80℃。它們存儲(chǔ)溫度值的格式和地址0中溫度值的格式類似,唯一不同的是,其表示溫度的分辨率只有0.5度,因此,小數(shù)部分只有一位有效,低7位全為0。例如,同樣將2字節(jié)數(shù)據(jù)看作一個(gè)有符號(hào)的16位整數(shù)temp,則temp的值為溫度值的256倍。由此可得,若要表示80.5度,則對(duì)應(yīng)的16位數(shù)據(jù)的值為:80.5 * 256 = 20608,即0x5080。

LM75B每次采集到新的溫度時(shí),都將與這兩個(gè)溫度值作比較,比較的結(jié)果將決定OS引腳的輸出,以作為一種溫度報(bào)警的機(jī)制。具體比較的方法與LM75B所處的模式相關(guān),LM75B可以工作在比較模式或中斷模式(可通過配置寄存器配置):若LM75B工作在比較模式,則當(dāng)采樣溫度大于TOS時(shí),OS引腳輸出激活電平(激活電平可以通過配置寄存器配置為高電平或低電平),當(dāng)采樣溫度降低到THYST以下時(shí),OS引腳恢復(fù)到正常電平;若LM75B工作在中斷模式,首先,采樣溫度與TOS比較,當(dāng)采樣溫度大于TOS時(shí),OS引腳輸出激活電平,直到主機(jī)讀取一次LM75B后,OS引腳將自動(dòng)恢復(fù)為正常電平。接著,采樣溫度將切換為與THYST比較,當(dāng)采樣溫度低于THYST時(shí),OS引腳輸出激活電平,直到主機(jī)讀取一次LM75B后,OS引腳將自動(dòng)恢復(fù)為正常電平。接著,又將采樣溫度切換為與TOS比較,當(dāng)采樣溫度大于TOS時(shí),OS引腳輸出激活電平,以此類推。示意圖詳見圖7.13。

圖7.13 LM75B的OS引腳輸出示意圖

注:圖中以激活電平為低電平,正常電平為高電平為例。在中斷模式下,OS引腳可以被兩種操作復(fù)位為正常電平:被主機(jī)讀取一次數(shù)據(jù);主機(jī)通過寫配置寄存器,使LM75B進(jìn)入關(guān)機(jī)模式。更多詳細(xì)的內(nèi)容可以查閱LM75B的數(shù)據(jù)手冊,這里僅為簡單介紹使用AWorks的I2C接口操作I2C從機(jī)器件的方法。

例如,要修改TOS的值為80.5℃,則需要修改TOS寄存器的值為0x5080,寫入時(shí),高字節(jié)先寫入,低字節(jié)后寫入,即先寫入0x50,后寫入0x80。范例程序詳見程序清單7.29。

程序清單7.29 寫入數(shù)據(jù)范例程序

由于TOS寄存器是可讀可寫的,為了驗(yàn)證是否寫入成功,可以通過I2C讀取接口,再讀取出TOS寄存器的值,如果讀出的值與寫入的值相同,則表明寫入成功。范例程序詳見程序清單7.30。

程序清單7.30 驗(yàn)證寫入數(shù)據(jù)是否成功的范例程序

7.5 UART總線

7.5.1 UART簡介

UART

(Universal Asynchronous Receiver/Transmitter)是一種通用異步收發(fā)傳輸器,其使用串行的方式在雙機(jī)之間進(jìn)行數(shù)據(jù)交換,實(shí)現(xiàn)全雙工通信。數(shù)據(jù)引腳僅包含用于接收數(shù)據(jù)的RXD和用于發(fā)送數(shù)據(jù)的TXD。

UART是一種串行通信協(xié)議,數(shù)據(jù)在數(shù)據(jù)線上按位一位一位的發(fā)送,UART協(xié)議主要有以下幾個(gè)概念需要了解:

  • 波特率

波特率是衡量數(shù)據(jù)傳輸速率的指標(biāo),表示每秒傳送數(shù)據(jù)的位數(shù),值越大,數(shù)據(jù)通信的速率越高,數(shù)據(jù)傳輸?shù)迷娇?。常見的波特率?800、9600、14400、19200、38400、115200等等,如果波特率為115200,則表示每秒鐘可以傳輸115200位(注意:是bit,不是byte)數(shù)據(jù)。

  • 空閑位

數(shù)據(jù)線上沒有數(shù)據(jù)傳輸時(shí),數(shù)據(jù)線處于空閑狀態(tài)??臻e狀態(tài)的電平邏輯為“1”。

  • 起始位

起始位表示一幀數(shù)據(jù)傳輸?shù)拈_始,起始位的電平邏輯是“0”。

  • 數(shù)據(jù)位

緊接起始位后,即為實(shí)際通信傳輸?shù)臄?shù)據(jù),數(shù)據(jù)的位數(shù)可以是5、6、7、8等,數(shù)據(jù)傳輸時(shí),從最低位開始依次傳輸。

  • 奇偶校驗(yàn)位

奇偶校驗(yàn)位用于接收方對(duì)數(shù)據(jù)進(jìn)行校驗(yàn),及時(shí)發(fā)現(xiàn)由于通信故障等問題造成的錯(cuò)誤數(shù)據(jù)。奇偶校驗(yàn)位是可選的,可以不使用奇偶校驗(yàn)位。奇偶校驗(yàn)有奇校驗(yàn)和偶校驗(yàn)兩種形式,該位的邏輯電平與校驗(yàn)方法和所有數(shù)據(jù)位中邏輯“1”的個(gè)數(shù)相關(guān)。

奇校驗(yàn):通過設(shè)置該位的值(“1”或“0”),使該位和數(shù)據(jù)位中邏輯“1”的總個(gè)數(shù)為奇數(shù)。例如,數(shù)據(jù)位為8位,值為:10011001,1的個(gè)數(shù)為4個(gè)(偶數(shù)),則奇校驗(yàn)時(shí),為了使1的個(gè)數(shù)為奇數(shù),就要設(shè)置奇偶校驗(yàn)位的值為1,使1的總個(gè)數(shù)為5個(gè)(奇數(shù))。

偶校驗(yàn):通過設(shè)置該位的值(“1”或“0”),使該位和數(shù)據(jù)位中邏輯“1”的總個(gè)數(shù)為偶數(shù)。例如,數(shù)據(jù)位為8位,值為:10011001,1的個(gè)數(shù)為4個(gè)(偶數(shù)),則偶校驗(yàn)時(shí),為了使1的個(gè)數(shù)為偶數(shù),就要設(shè)置奇偶校驗(yàn)位的值為0,使1的個(gè)數(shù)保持不變,為4(偶數(shù))。

通信雙方使用的校驗(yàn)方法應(yīng)該一致,接收方通過判斷“1”的個(gè)數(shù)是否為奇數(shù)(奇校驗(yàn))或偶數(shù)(偶校驗(yàn))來判定數(shù)據(jù)在通信過程中是否出錯(cuò)。

  • 停止位

停止位表示一幀數(shù)據(jù)的結(jié)束,其電平邏輯為“1”,其寬度可以是1位、1.5位、2位。即其持續(xù)的時(shí)間為位數(shù)乘以傳輸一位的時(shí)間(由波特率決定),例如,波特率為115200,則傳輸一位的時(shí)間為1/115200秒,約為8.68us。若停止位的寬度為1.5位,則表示停止位持續(xù)的時(shí)間為:1.5 × 8.68us ≈ 13us。

常見的幀格式為:1位起始位,8位數(shù)據(jù)位,無校驗(yàn),1位停止位。由于起始位的寬度恒為1位,不會(huì)變化,而數(shù)據(jù)位,校驗(yàn)位和停止位都是可變的,因此,往往在描述串口通信協(xié)議時(shí),都只是描述其波特率、數(shù)據(jù)位,校驗(yàn)位和停止位,不再單獨(dú)說明起始位。

注意,通信雙方必須使用完全相同的協(xié)議,包括波特率、起始位、數(shù)據(jù)位、停止位等。如果協(xié)議不一致,則通信數(shù)據(jù)會(huì)錯(cuò)亂,不能正常通信。在通信中,若出現(xiàn)亂碼的情況,應(yīng)該首先檢查通信雙方所使用的協(xié)議是否一致。

7.5.2 串行接口

在AWorks中,定義了通用的串行接口,可以使用串行接口操作UART,實(shí)現(xiàn)數(shù)據(jù)的收發(fā)。接口原型詳見表7.18。

表7.18 串行接口(aw_serial.h)

1. UART控制

在使用UART進(jìn)行數(shù)據(jù)傳輸前,需要正確配置串行通信協(xié)議,比如:波特率、數(shù)據(jù)位、停止位、校驗(yàn)位等。其函數(shù)原型為:

其中,com為串口設(shè)備的ID,request表示本次請求控制的命令,p_arg為與request對(duì)應(yīng)的參數(shù),其具體類型與request的值相關(guān)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示本次控制成功,否則,表示控制失敗。

在AWorks中,一個(gè)系統(tǒng)往往可以有多路串口輸出,例如,在i.MX28x中,有1路調(diào)試串口,5路應(yīng)用串口,為了區(qū)分各個(gè)串口,為各個(gè)串口設(shè)備分配了唯一的編號(hào),如在i.MX28x中,各個(gè)串口設(shè)備分配的編號(hào)詳見表7.19。

表7.19 各串口設(shè)備對(duì)應(yīng)的編號(hào)

COM0 ~ COM5是在aw_serial.h文件中定義的宏,即:

request表示本次請求控制的命令,p_arg為與之對(duì)應(yīng)的參數(shù)。常見命令與對(duì)應(yīng)p_arg參數(shù)的實(shí)際類型詳見表7.20。

表7.20 UART常用控制命令

  • 設(shè)置波特率

設(shè)置波特率使用SIO_BAUD_SET命令,該命令(包括后文以SIO_口味前綴的各個(gè)命令宏定義)在aw_sio_common.h文件中定義,aw_serial.h文件已經(jīng)自動(dòng)包含該文件,用于無需再額外包含。設(shè)置波特率為115200的范例程序詳見程序清單7.31。

程序清單7.31 設(shè)置波特率范例程序

  • 獲取波特率

獲取波特率使用SIO_BAUD_GET命令,獲取波特率的范例程序詳見程序清單7.32。

程序清單7.32 獲取波特率范例程序

  • 設(shè)置硬件參數(shù)

設(shè)置硬件參數(shù)包括通信協(xié)議相關(guān)的參數(shù),比如:數(shù)據(jù)位、校驗(yàn)位、停止位等。設(shè)置硬件參數(shù)對(duì)應(yīng)的命令為SIO_HW_OPTS_SET,其對(duì)應(yīng)的p_arg為32位整數(shù),是由多個(gè)參數(shù)宏通過或(“|”)運(yùn)算符連接組成。相關(guān)的參數(shù)宏詳見表7.21。

表7.21 UART硬件參數(shù)(aw_sio_common.h)

例如,幾種常見的配置范例詳見程序清單7.33。

程序清單7.33 設(shè)置硬件參數(shù)的范例程序

  • 獲取硬件參數(shù)

獲取當(dāng)前硬件參數(shù)的命令為SIO_HW_OPTS_GET。例如,通過獲取硬件參數(shù),判斷當(dāng)前使用何種校驗(yàn)方式的范例程序詳見程序清單7.34。

程序清單7.34 獲取硬件參數(shù)的范例程序

此外,在發(fā)送或接收數(shù)據(jù)時(shí),還會(huì)使用到幾個(gè)命令,這些命令在講解發(fā)送數(shù)據(jù)和接收數(shù)據(jù)時(shí)再詳細(xì)介紹。

2. 發(fā)送數(shù)據(jù)

在AWorks中,為每個(gè)串口設(shè)備都分配了一個(gè)發(fā)送數(shù)據(jù)緩沖區(qū)(默認(rèn)大小為128字節(jié)),用于緩存用戶發(fā)送的數(shù)據(jù)。當(dāng)用戶發(fā)送數(shù)據(jù)時(shí),首先會(huì)將數(shù)據(jù)加載到緩沖區(qū)中,加載到緩沖區(qū)后,串口設(shè)備將按照設(shè)定的波特率自動(dòng)發(fā)送緩沖區(qū)中的數(shù)據(jù)。用戶將數(shù)據(jù)寫入緩沖區(qū)后,即可不用再處理串口的發(fā)送,轉(zhuǎn)而處理其它事務(wù)。發(fā)送數(shù)據(jù)的函數(shù)原型為:

其中,com為串口設(shè)備的編號(hào),p_buffer指向待發(fā)送數(shù)據(jù)的緩沖區(qū),nbytes為發(fā)送數(shù)據(jù)的字節(jié)數(shù)。返回值為成功寫入緩沖區(qū)的數(shù)據(jù)個(gè)數(shù)。比如,發(fā)送一個(gè)字符串“Hello World!“,范例程序詳見程序清單7.35。

程序清單7.35 發(fā)送數(shù)據(jù)范例程序

3. 接收數(shù)據(jù)

在AWorks中,同樣為每個(gè)串口設(shè)備都分配了一個(gè)接收數(shù)據(jù)緩沖區(qū)(默認(rèn)大小為128字節(jié)),用于緩存串口設(shè)備接收到的數(shù)據(jù),用戶可以通過命令查詢當(dāng)前接收到的數(shù)據(jù)字節(jié)數(shù),其對(duì)應(yīng)的命令為:AW_FIONREAD,獲取COM1的接收緩沖區(qū)中已接收數(shù)據(jù)個(gè)數(shù)的范例程序詳見程序清單7.36。

程序清單7.36 獲取接收緩沖區(qū)中已接收數(shù)據(jù)個(gè)數(shù)的范例程序

用戶可通過接收數(shù)據(jù)接口讀取緩沖區(qū)中的數(shù)據(jù),其函數(shù)原型為:

其中,com為串口設(shè)備的編號(hào),p_buffer指向存儲(chǔ)讀取數(shù)據(jù)的緩沖區(qū),maxbytes為讀取數(shù)據(jù)的最大字節(jié)數(shù),其值往往與p_buffer指向的緩沖區(qū)大小一致。返回值為成功讀取的數(shù)據(jù)個(gè)數(shù)。例如,接收數(shù)據(jù)的范例程序詳見程序清單7.37。

程序清單7.37 接收數(shù)據(jù)范例程序

若當(dāng)前接收緩沖區(qū)中具有足夠的數(shù)據(jù),即已接收數(shù)據(jù)不小于maxbytes,則成功讀取maxbytes字節(jié)的數(shù)據(jù),函數(shù)立即返回。若沒有足夠的數(shù)據(jù),即已接收數(shù)據(jù)小于maxbytes小,則默認(rèn)情況下,會(huì)一直阻塞等待,直到接收的數(shù)據(jù)量達(dá)到maxbytes。若用戶不希望一直阻塞等待,則可以設(shè)定一個(gè)超時(shí)時(shí)間,當(dāng)?shù)却龝r(shí)間達(dá)到該值時(shí),無論是否接收到maxbytes字節(jié)的數(shù)據(jù),函數(shù)都會(huì)返回。

設(shè)定超時(shí)時(shí)間的命令為:AW_TIOCRDTIMEOUT(在aw_ioctl.h文件中定義)。設(shè)置超時(shí)時(shí)間為100ms的范例程序詳見程序清單7.38。

程序清單7.38 設(shè)置讀等待的超時(shí)時(shí)間為100ms

例如,通過串口控制LED0的亮滅,當(dāng)接收到"on"時(shí),則點(diǎn)亮LED0,當(dāng)接收到"off"時(shí),則熄滅LED0。同時(shí),當(dāng)接收到可以識(shí)別的"on"或"off"命令時(shí),回復(fù)"OK!",若是非法命令,無法識(shí)別,則回復(fù)"Failed! Unknown Command!",范例程序詳見程序清單7.39。

程序清單7.39 使用串口控制LED0的范例程序

7.6 A/D轉(zhuǎn)換器

7.6.1 模數(shù)信號(hào)轉(zhuǎn)換

1. 基本原理

我們經(jīng)常接觸的噪聲和圖像信號(hào)都是模擬信號(hào),要將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào),必須經(jīng)過采樣、保持、量化與編碼幾個(gè)過程,詳見圖7.14。

圖7.14 模數(shù)信號(hào)轉(zhuǎn)換示意圖

將以一定的時(shí)間間隔提取信號(hào)的大小的操作稱為采樣,其值為樣本值,提取信號(hào)大小的時(shí)間間隔越短越能正確地重現(xiàn)信號(hào)。由于縮短時(shí)間間隔會(huì)導(dǎo)致數(shù)據(jù)量增加,所以縮短時(shí)間間隔要適可而止。注意,取樣頻率大于或等于模擬信號(hào)中最高頻率的2倍,就能夠無失真地恢復(fù)原信號(hào)。

將采樣所得信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)往往需要一定的時(shí)間,為了給后續(xù)的量化編碼電路提供一個(gè)穩(wěn)定值,采樣電路的輸出還必須保持一段時(shí)間,而采樣與保持過程都是同時(shí)完成的。雖然通過采樣將在時(shí)間軸上連續(xù)的信號(hào)轉(zhuǎn)換成了不連續(xù)的(離散的)信號(hào),但采樣后的信號(hào)幅度仍然是連續(xù)的值(模擬量)。

此時(shí)可以在振幅方向上以某一定的間隔進(jìn)行劃分,決定個(gè)樣本值屬于哪一區(qū)間,將記在其區(qū)間的值分配給其樣本值。圖7.14將區(qū)間分割為0~0.5、0.5~1.5、1.5~2.5,再用0、1、2……代表各區(qū)間,對(duì)小數(shù)點(diǎn)后面的值按照四舍五入處理,比如,201.6屬于201.5~202.5,則賦值202;123.4屬于122.5~123.5,則賦值123,這樣的操作稱為量化。

量化前的信號(hào)幅度與量化后的信號(hào)幅度出現(xiàn)了不同,這一差值在重現(xiàn)信號(hào)時(shí)將會(huì)以噪聲的形式表現(xiàn)出來,所以將此差值稱為量化噪聲。為了降低這種噪聲,只要將量化時(shí)階梯間的間隔減小就可以了。但減小量化間隔會(huì)引起階梯數(shù)目的增加,導(dǎo)致數(shù)據(jù)量增大。所以量化的階梯數(shù)也必須適當(dāng),可以根據(jù)所需的信噪比(S/N)確定。

將量化后的信號(hào)轉(zhuǎn)換為二進(jìn)制數(shù),即用0和1的碼組合來表示的處理過程稱為編碼,“1”表示有脈沖,“0”表示無脈沖。當(dāng)量化級(jí)數(shù)取為64級(jí)時(shí),表示這些數(shù)值的二進(jìn)制的位數(shù)必須是6位;當(dāng)量化級(jí)數(shù)取為256級(jí)時(shí),則必須用8位二進(jìn)制數(shù)表示。

2. 基準(zhǔn)電壓

基準(zhǔn)電壓就是模數(shù)轉(zhuǎn)換器可以轉(zhuǎn)換的最大電壓,以8位A/D模數(shù)轉(zhuǎn)換器為例,這種轉(zhuǎn)換器可以將0V到其基準(zhǔn)電壓范圍內(nèi)的輸入電壓轉(zhuǎn)換為對(duì)應(yīng)的數(shù)值表示。其輸入電壓范圍分別對(duì)應(yīng)4096個(gè)數(shù)值(步長),其計(jì)算方法為:參考電壓/256=5/256=19.5mV。

看起來這里給出的10位A/D的步長電壓值,但上述公式還定義了該模數(shù)轉(zhuǎn)化器的轉(zhuǎn)換精度,無論如何所有A/D的轉(zhuǎn)換精度都低于其基準(zhǔn)電壓的精度,而提高輸出精度的唯一方法只有增加定標(biāo)校準(zhǔn)電路。

現(xiàn)在很多MCU都內(nèi)置A/D,即可以使用電源電壓作為其基準(zhǔn)電壓,也可以使用外部基準(zhǔn)電壓。如果將電源電壓作為基準(zhǔn)電壓使用的話,假設(shè)該電壓為5V,則對(duì)3V輸入電壓的測量結(jié)果為:(輸入電壓/基準(zhǔn)電壓)×255=(3/5)×255=99H。顯然,如果電源電壓升高1%,則輸出值為(3/5.05)×255=97H。實(shí)際上典型電源電壓的誤差一般在2~3%,其變化對(duì)A/D的輸出影響是很大的。

3. 轉(zhuǎn)換精度

A/D的輸出精度是由基準(zhǔn)輸入和輸出字長共同決定的,輸出精度定義了A/D可以進(jìn)行轉(zhuǎn)換的最小電壓變化。轉(zhuǎn)換精度就是A/D最小步長值,該值可以通過計(jì)算基準(zhǔn)電壓和最大轉(zhuǎn)換值的比例得到。對(duì)于上面給出的使用5V基準(zhǔn)電壓的8位A/D來說,其分辨率為19.5mV,也就是說,所有低于19.5mV的輸入電壓的輸出值都為0,在19.5mV~39mV之間的輸入電壓的輸出值為1,而在39mV~58.6mV之間的輸入電壓的輸出值為3,以此類推。

提高分辨率的一種方法是降低基準(zhǔn)電壓,如果將基準(zhǔn)電壓從5V降到2.5V,則分辨率上升到2.5/256=9.7mV,但最高測量電壓降到了2.5V。而不降低基準(zhǔn)電壓又能提高分辨率的唯一方法是增加A/D的數(shù)字位數(shù),對(duì)于使用5V基準(zhǔn)電壓的12位A/D來說,其輸出范圍可達(dá)4096,其分辨率為1.22mV。

在實(shí)際的應(yīng)用場合是有噪音的,顯然該12位A/D會(huì)將系統(tǒng)中1.22mV的噪音作為其輸入電壓進(jìn)行轉(zhuǎn)換。如果輸入信號(hào)帶有10mV的噪音電壓,則只能通過對(duì)噪音樣本進(jìn)行多次采樣并對(duì)采樣結(jié)果進(jìn)行平均處理,否則該轉(zhuǎn)換器無法對(duì)10mV的真實(shí)輸入電壓進(jìn)行響應(yīng)。

4. 累積精度

如果在放大器前端使用誤差5%的電阻,則該誤差將會(huì)導(dǎo)致12位A/D無法正常工作。也就是說,A/D的測量精度一定小于其轉(zhuǎn)換誤差、基準(zhǔn)電壓誤差與所有模擬放大器誤差的累計(jì)之和。雖然轉(zhuǎn)換精度會(huì)受到器件誤差的制約,但通過對(duì)每個(gè)系統(tǒng)單獨(dú)進(jìn)行定標(biāo),也能夠得到較為滿意的輸出精度。如果使用精確的定標(biāo)電壓作為標(biāo)準(zhǔn)輸入,且借助存儲(chǔ)在MCU程序中的定標(biāo)電壓常數(shù)對(duì)所有輸入進(jìn)行糾正,則可以有效地提高轉(zhuǎn)換精度,但無論如何無法對(duì)溫漂或器件老化而帶來的影響進(jìn)行校正。

5. 基準(zhǔn)源選型

引起電壓基準(zhǔn)輸出電壓背離標(biāo)稱值的主要因素是:初始精度、溫度系數(shù)與噪聲,以及長期漂移等,因此在選擇一個(gè)電壓基準(zhǔn)時(shí),需根據(jù)系統(tǒng)要求的分辨率精度、供電電壓、工作溫度范圍等情況綜合考慮,不能簡單地以單個(gè)參數(shù)為選擇條件。

比如,要求12 位A/D分辨到1LSB,即相當(dāng)于1/212=244ppm。如果工作溫度范圍在10℃,那么一個(gè)初始精度為0.01%(相當(dāng)于100ppm),溫度系數(shù)為10ppm/℃(溫度范圍內(nèi)偏移100ppm)的基準(zhǔn)已能滿足系統(tǒng)的精度要求,因?yàn)榛鶞?zhǔn)引起的總誤差為200ppm,但如果工作溫度范圍擴(kuò)大到15℃以上,該基準(zhǔn)就不適用了。

6. 常用基準(zhǔn)源

(1)初始精度的確定

初始精度的選擇取決于系統(tǒng)的精度要求,對(duì)于數(shù)據(jù)采集系統(tǒng)來說,如果采用n位的ADC,那么其滿刻度分辨率為1/2n,若要求達(dá)到1LSB的精度,則電壓基準(zhǔn)的初始精度為:

初始精度≤1/2n=1/2n×102%

如果考慮到其它誤差的影響,則實(shí)際的初始精度要選得比上式更高一些,比如,按1/2LSB的分辨率精度來計(jì)算,即上式所得結(jié)果再除以2,即:

初始精度≤1/2n+1=1/2n+1×102%

(2)溫度系數(shù)的確定

溫度系數(shù)是選擇電壓基準(zhǔn)另一個(gè)重要的參數(shù),除了與系統(tǒng)要求的精度有關(guān)外,溫度系數(shù)還與系統(tǒng)的工作溫度范圍有直接的關(guān)系。對(duì)于數(shù)據(jù)采集系統(tǒng)來說,假設(shè)所用ADC的位數(shù)是n,要求達(dá)到1LSB的精度,工作溫度范圍是ΔT,那么基準(zhǔn)的溫度系數(shù)TC可由下式確定:

同樣地,考慮到其它誤差的影響,實(shí)際的TC值還要選得比上式更小一些。溫度范圍ΔT通常以25℃為基準(zhǔn)來計(jì)算,以工業(yè)溫度范圍-40℃~+85℃為例,ΔT可取60℃(85℃-25℃),因?yàn)橹圃焐掏ǔT?5℃附近將基準(zhǔn)因溫度變化引起的誤差調(diào)到最小。

圖7.15 系統(tǒng)精度與基準(zhǔn)溫度系數(shù)TC的關(guān)系

如圖7.15所示是一個(gè)十分有用的速查工具,它以25℃為變化基準(zhǔn),溫度在1℃~00℃變化時(shí),8~20位ADC在1LSB分辨精度的要求下,將所需基準(zhǔn)的TC值繪制成圖,由該圖表可迅速查得所需的TC值。

TL431和REF3325/3330均為典型的電壓基準(zhǔn)源產(chǎn)品,詳見表7.22。TL431的輸出電壓僅用兩個(gè)電阻就可以在2.5~36V范圍內(nèi)實(shí)現(xiàn)連續(xù)可調(diào),負(fù)載電流1~100mA。在可調(diào)壓電源、開關(guān)電源、運(yùn)放電路常用它代替穩(wěn)壓二極管。REF3325輸出2.5V,REF3330輸出3.0V。

表7.22 電壓基準(zhǔn)源選型參數(shù)表

REF33xx是一種低功耗、低壓差、高精密度的電壓基準(zhǔn)產(chǎn)品,采用小型的SC70-3和SOT23-3封裝。體積小和功耗低(最大電流為5μA)的特點(diǎn)使得REF33xx系列產(chǎn)品成為眾多便攜式和電池供電應(yīng)用的最佳選擇。在負(fù)載正常的情況下,REF33xx系列產(chǎn)品可在高于指定輸出電壓180mV的電源電壓下工作,但REF3312除外,因?yàn)樗淖钚‰娫措妷簽?.8V。

圖7.16 12bits系統(tǒng)基準(zhǔn)選擇

從初始精度和溫漂特性來看,REF3325/3330均優(yōu)于TL431,但是TL431的輸出電壓范圍很寬,且工作電流范圍很大,甚至可以代替一些LDO。

由于基準(zhǔn)的初始精度和溫漂特性是影響系統(tǒng)整體精度的關(guān)鍵參數(shù),因此它們都不能用于高精密的采集系統(tǒng)和高分辨率的場合。而對(duì)于12bits的AD來說,由于精度要求在0.1%左右的采集系統(tǒng),到底選哪個(gè)型號(hào)呢?測量系統(tǒng)的初始精度,均可通過對(duì)系統(tǒng)校準(zhǔn)消除初始精度引入的誤差;對(duì)于溫漂的選擇,必須參考1LSB分辨精度來進(jìn)行選擇,詳見圖7.16。

如果不是工作在嚴(yán)苛環(huán)境下,通常工作溫度為-10℃~50℃,溫度變化在60℃,如果考慮0.1%系統(tǒng)精度,溫度特性低于50ppm,則選擇REF3325/3330。

7.6.2 A/D轉(zhuǎn)換接口

AWorks提供了A/D轉(zhuǎn)換接口,可以直接通過接口獲取相應(yīng)引腳輸入的模擬電壓大小。相關(guān)接口詳見表7.23。

表7.23 ADC通用接口函數(shù)

1. 獲取ADC通道的采樣率

獲取當(dāng)前ADC通道的采樣率,采樣率的單位為Samples/s,表示每秒進(jìn)行多少次采樣。其函數(shù)原型為:

其中,ch為ADC的通道號(hào),p_rate為輸出參數(shù),用以得到指定通道的采樣率。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示獲取成功,否則,表示獲取失敗,失敗的原因可能是通道號(hào)不存在。

通常情況下,一個(gè)A/D轉(zhuǎn)換器往往支持多個(gè)通道,即可以支持多路模擬信號(hào)輸入,在部分微控制器中,還存在多個(gè)A/D轉(zhuǎn)換器。在AWorks中,為了區(qū)分各個(gè)模擬信號(hào)輸入的通道,為每個(gè)通道定義了一個(gè)唯一的通道號(hào)。例如,在i.MX28x中,有LRADC和HSADC兩個(gè)A/D轉(zhuǎn)換器,它們分別支持16個(gè)通道和8個(gè)通道。各通道對(duì)應(yīng)的編號(hào)在{chip}_adc_def.h文件中使用宏的形式進(jìn)行了定義。例如,在i.MX28x中,各個(gè)通道號(hào)在imx28x_adc_def.h文件中定義如下:

由此可見,通過宏的形式,將通道號(hào) 0 ~ 23 使用了更具有意義的宏來表示。用戶也可通過查看此文件獲知當(dāng)前硬件平臺(tái)支持的ADC通道數(shù)目。

通道號(hào)的類型為aw_adc_channel_t,其本質(zhì)上是一個(gè)無符號(hào)整數(shù)類型,具體的位寬與平臺(tái)相關(guān)。如一個(gè)平臺(tái)中僅支持24個(gè)通道,則其類型可能為uint8_t,即使用8位來表示通道號(hào)。獲取通道0的采樣率范例程序詳見程序清單7.40。

程序清單7.40 獲取采樣率的范例程序

2. 設(shè)置ADC通道的采樣率

由于采樣頻率必須大于或等于模擬信號(hào)中最高頻率的2倍,才能夠無失真地恢復(fù)原信號(hào),因此,實(shí)際中,可能需要根據(jù)模擬信號(hào)的頻率調(diào)整A/D轉(zhuǎn)換器的采樣率。設(shè)置某一通道采樣率的函數(shù)原型為:

其中,ch為ADC的通道號(hào),rate為設(shè)置的采樣率。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示設(shè)置成功,否則,表示設(shè)置失敗。

一般情況下,若對(duì)采樣率沒有特殊的要求,使用默認(rèn)的采樣率即可。此外,A/D轉(zhuǎn)換器可能只支持部分采樣率,并不能支持任意的采樣率,當(dāng)使用該函數(shù)設(shè)置采樣率時(shí),系統(tǒng)會(huì)自動(dòng)設(shè)定一個(gè)最為接近的采樣率,因此,實(shí)際采樣率可能與設(shè)置的采樣率存在差異,實(shí)際采樣率可由aw_adc_rate_get()函數(shù)獲取。

注意,通常情況下,一個(gè)A/D轉(zhuǎn)換器的所有通道共用一個(gè)采樣率,因此,設(shè)置其中一個(gè)通道的采樣率時(shí),可能會(huì)影響其它通道的采樣率。

設(shè)置通道0的采樣率為1000的范例程序詳見程序清單7.41。

程序清單7.41 設(shè)置采樣率范例程序

設(shè)置采樣率為1000 Samples/s。表示每秒采集1000個(gè)數(shù)據(jù)點(diǎn),即每隔1毫秒采集一個(gè)數(shù)據(jù)點(diǎn)。

3. 獲取ADC通道的基準(zhǔn)電壓

一般來講,在對(duì)精度要求不是特別嚴(yán)格的場合,可以直接使用MCU的電源電壓作為ADC的基準(zhǔn)電壓。但若對(duì)精度要求較高,往往需要使用具有更高精度的外部基準(zhǔn)源電壓作為ADC的基準(zhǔn)電壓。當(dāng)前ADC實(shí)際使用的基準(zhǔn)電壓可通過該接口獲得,其函數(shù)原型為:

其中,ch為ADC的通道號(hào)。基準(zhǔn)電壓通過返回值返回:若返回值大于0,則獲取成功,其值即為基準(zhǔn)電壓(單位:mV);若返回值小于0,則獲取失敗。

獲取通道0的基準(zhǔn)電壓范例程序詳見程序清單7.42。

程序清單7.42 獲取基準(zhǔn)電壓范例程序

例如,基準(zhǔn)電壓為2.5V,則vref的值為2500。

4. 獲取ADC通道的轉(zhuǎn)換位數(shù)

獲取ADC通道的轉(zhuǎn)換位數(shù),其函數(shù)原型為:

其中,ch為ADC的通道號(hào)。轉(zhuǎn)換位數(shù)通過返回值返回:若返回值大于0,則獲取成功,其值即為轉(zhuǎn)換位數(shù);若返回值小于0,則獲取失敗。

獲取通道0的轉(zhuǎn)換位數(shù)范例程序詳見程序清單7.43。

程序清單7.43 獲取轉(zhuǎn)換位數(shù)范例程序

如在i.MX28x中,LRADC和HSADC均為12位AD轉(zhuǎn)換器,因此,bits的值為12。

5. 讀取ADC通道的采樣值

讀取指定通道的采樣值,其函數(shù)原型為:

其中,ch為ADC的通道號(hào),p_val為存儲(chǔ)采樣值的緩沖區(qū),samples指定本次采樣的次數(shù),urgent指定本次讀取操作的優(yōu)先級(jí)。返回值為標(biāo)準(zhǔn)的錯(cuò)誤號(hào),返回AW_OK時(shí)表示讀取成功,否則,表示讀取失敗。

p_val指向用于存儲(chǔ)采樣值的緩沖區(qū),緩沖區(qū)實(shí)際類型與ADC的位數(shù)相關(guān):若ADC的位數(shù)為 1 ~ 8,則其類型為uint8_t;若ADC的位數(shù)為9 ~ 16,則其類型為uint16_t;若ADC的位數(shù)為 17 ~ 32,則其類型為uint32_t。例如,在i.MX28x中,ADC的位數(shù)為12,則應(yīng)使用uint16_t類型的緩沖區(qū)來存儲(chǔ)ADC的采樣值。如定義一個(gè)大小為100的緩沖區(qū),以存儲(chǔ)100個(gè)采樣值:

samples表示本次讀取的采樣值個(gè)數(shù)。實(shí)際應(yīng)用中,每次讀取操作往往會(huì)讀取多個(gè)采樣值,以便通過取平均值等方法對(duì)采樣值進(jìn)行處理,得到更加準(zhǔn)確的結(jié)果。多個(gè)采樣值將依次存放在p_val指向的緩沖區(qū)中,需確保p_val指向的緩沖區(qū)的大小與samples保持一致。

實(shí)際上,讀取采樣值的操作包含的完整過程為:首先需要啟動(dòng)ADC轉(zhuǎn)換,然后等待轉(zhuǎn)換完成(轉(zhuǎn)換的時(shí)間與采樣率相關(guān)),轉(zhuǎn)換完成后,再將轉(zhuǎn)換結(jié)果存儲(chǔ)在用戶提供的緩沖區(qū)中。顯然,整個(gè)過程需要消耗一定的時(shí)間。雖然一個(gè)A/D轉(zhuǎn)換器往往有多個(gè)通道,但某一時(shí)刻只能對(duì)某一個(gè)通道的輸入進(jìn)行轉(zhuǎn)換,并不能同時(shí)轉(zhuǎn)換多個(gè)通道。若當(dāng)前A/D轉(zhuǎn)換器正在轉(zhuǎn)換中,則后續(xù)其它通道的轉(zhuǎn)換請求就只能排隊(duì)等待,urgent指定了轉(zhuǎn)換請求的緊急性,其決定了排隊(duì)的方式,若urgent為TRUE,表示緊急轉(zhuǎn)換請求,排隊(duì)時(shí)將插隊(duì)到頭部,以便當(dāng)前A/D轉(zhuǎn)換結(jié)束后,立即啟動(dòng)需要緊急轉(zhuǎn)換的通道;若urgent為FALSE,則排隊(duì)時(shí)將依次排至尾部。一般情況下,沒有特殊需求,urgent均設(shè)置為FALSE。

讀取100個(gè)采樣值的范例程序詳見程序清單7.44。

程序清單7.44 讀取采樣值的范例程序

此時(shí),多個(gè)采樣值存儲(chǔ)在adc_val中,實(shí)際中,每次讀取多個(gè)采樣值只是為了通過處理得到一個(gè)更加精確的采樣值,最簡單的處理方法就是取平均值,范例程序詳見程序清單7.45。

程序清單7.45 數(shù)據(jù)處理范例程序(取平均值)

注意,程序中,為了避免sum溢出,將sum的類型定義為了32位無符號(hào)數(shù)。最終的結(jié)果存儲(chǔ)在code變量中。

至此,獲得了一個(gè)較為精確的ADC采樣值,但在實(shí)際使用A/D轉(zhuǎn)換器時(shí),其目的往往并非簡單的獲取一個(gè)ADC采樣值,而是獲取相應(yīng)通道的電壓值。可以通過基準(zhǔn)電壓和轉(zhuǎn)換位數(shù)將code轉(zhuǎn)換為電壓值,公式如下:

式中,code為讀取的編碼值,Vref為基準(zhǔn)電壓,bits為ADC的位數(shù)。實(shí)際中,2的bits次方可以簡化為移位運(yùn)算,即:

獲取通道0輸入電壓的完整范例程序詳見程序清單7.46。

程序清單7.46 電壓采集綜合范例程序

在i.MX28x中,通道0對(duì)應(yīng)的外部輸入引腳時(shí)LRADC0引腳,運(yùn)行程序后,可以通過向該引腳接入模擬電壓來測試ADC采集的結(jié)果是否正確。

程序中,電壓值的計(jì)算未使用到浮點(diǎn)運(yùn)算,僅使用了整數(shù)運(yùn)算,效率較高。但運(yùn)算結(jié)果vol的值也只能精確的mV,若需要提高計(jì)算結(jié)果的精度,可以使用浮點(diǎn)數(shù)來存儲(chǔ)計(jì)算的結(jié)果,將vol的類型定義為float,即:

同時(shí),在計(jì)算電壓值時(shí),要確保表達(dá)式使用浮點(diǎn)運(yùn)算,即:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 轉(zhuǎn)換器
    +關(guān)注

    關(guān)注

    27

    文章

    8742

    瀏覽量

    147854
  • 致遠(yuǎn)電子
    +關(guān)注

    關(guān)注

    13

    文章

    409

    瀏覽量

    31390

原文標(biāo)題:AWorks軟件篇 — 通用外設(shè)接口(I2C、UART、ADC)

文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    設(shè)計(jì)方案:基于PCF8591的I2C總線A/DD/A轉(zhuǎn)換

    本資料是關(guān)于:基于PCF8591的I2C總線A/D、D/A轉(zhuǎn)
    發(fā)表于 07-26 22:47

    PCF8591_8位A/D and D/A轉(zhuǎn)換器相關(guān)資料下載

    3、數(shù)模轉(zhuǎn)換(D/A轉(zhuǎn)換)一、特征?●單電源供電?●通過I2C總線串行輸入/輸出?●用3個(gè)硬件地
    發(fā)表于 01-25 07:50

    基于WorldFIP 的現(xiàn)場總線-電流轉(zhuǎn)換器的開發(fā)The D

    本文針對(duì)在DCS 向FCS 過渡中一個(gè)急待解決的問題――常規(guī)儀表與現(xiàn)場總線的兼容,開發(fā)出基于WorldFIP 的現(xiàn)場總線-電流轉(zhuǎn)換器。文章介紹了WorldFIP 協(xié)議特點(diǎn),并著重介紹了轉(zhuǎn)換器
    發(fā)表于 06-03 08:10 ?25次下載

    PCA9306 I2C總線和SMBus雙向電平轉(zhuǎn)換器簡介

    PCA9306是一款支持I2C總線和SMBus的雙向電平轉(zhuǎn)換器,支持從1.0V~3.6V(Vref(1))到1.8V~5.5V(Vbias(ref)(2))的電平轉(zhuǎn)換,并且?guī)в惺鼓茌斎?/div>
    發(fā)表于 03-10 15:37 ?53次下載

    PCA9564 并行總線轉(zhuǎn)I2C總線接口芯片簡介

    PCA9564是一款采用CMOS工藝,支持并行總線與串行I2C總線通信轉(zhuǎn)換的接口器件,適用于微控制/處理器使用并行
    發(fā)表于 03-10 15:47 ?51次下載

    PCA9665并行總線轉(zhuǎn)I2C總線接口芯片簡介

    PCA9665是一款并行總線與串行I2C總線接口轉(zhuǎn)換的器件,適用于微控制/處理器使用并行總線擴(kuò)
    發(fā)表于 03-10 15:49 ?46次下載

    電平轉(zhuǎn)換I2C總線中的應(yīng)用(英)

    電平轉(zhuǎn)換I2C總線中的應(yīng)用(英)
    發(fā)表于 07-23 16:16 ?29次下載

    FXM2IC102 電壓轉(zhuǎn)換器,針對(duì)I2C總線應(yīng)用

    飛兆發(fā)布電壓轉(zhuǎn)換器FXM2IC102,針對(duì)I2C總線應(yīng)用 飛兆半導(dǎo)體公司 (Fairchild Semiconductor) 為設(shè)計(jì)人員提供用于I2C (Inter-Integrat
    發(fā)表于 09-02 08:52 ?895次閱讀

    采用I2C總線的ADS1100型16位模/數(shù)轉(zhuǎn)換器的設(shè)計(jì)

    采用I2C總線的ADS1100型16位模/數(shù)轉(zhuǎn)換器的設(shè)計(jì) ADS1100是采用2.7V~5.5V單電源供電的連續(xù)自校準(zhǔn)模/數(shù)(A/D
    發(fā)表于 02-26 15:01 ?3193次閱讀
    采用<b class='flag-5'>I2C</b><b class='flag-5'>總線</b>的ADS1100型16位模/數(shù)<b class='flag-5'>轉(zhuǎn)換器</b>的設(shè)計(jì)

    用于中間總線架構(gòu)的半調(diào)節(jié)總線轉(zhuǎn)換器

    用于中間總線架構(gòu)的半調(diào)節(jié)總線轉(zhuǎn)換器 SynQor推出了SQ60系列的新產(chǎn)品,擴(kuò)展了隔離半調(diào)節(jié)dc-dc轉(zhuǎn)換器的BusQor系列,用于中間總線
    發(fā)表于 01-04 10:00 ?775次閱讀

    電平轉(zhuǎn)換器解決I2C總線應(yīng)用的兼容性

    飛兆半導(dǎo)體公司(Fairchild Semiconductor)開發(fā)了一款可配置雙電壓電平轉(zhuǎn)換器產(chǎn)品FXMA2102,用于I2C總線接口應(yīng)用的電平轉(zhuǎn)換。FXMA2102能夠滿足移動(dòng)設(shè)備
    發(fā)表于 03-29 15:40 ?61次下載

    SPI、I2C、UART三種串行總線協(xié)議的區(qū)別

    SPI、I2C、UART三種串行總線協(xié)議的區(qū)別
    發(fā)表于 07-17 17:23 ?0次下載

    I2C與SPI與UART:如何布局這些通用總線

    ,UART等協(xié)議與下游MCU或可編程IC進(jìn)行接口。I2C總線,SPI總線UART總線之間的區(qū)別
    的頭像 發(fā)表于 11-08 17:33 ?1252次閱讀
    <b class='flag-5'>I2C</b>與SPI與<b class='flag-5'>UART</b>:如何布局這些通用<b class='flag-5'>總線</b>

    藍(lán)牙串口通訊總線——I2C/SPI/UART

    嵌入式工程師在做串口通信調(diào)試工作的時(shí)候,會(huì)經(jīng)常用到I2C、SPI、UART這3條總線,I2C、SPI、UART這三種通信
    的頭像 發(fā)表于 01-22 09:41 ?1777次閱讀
    藍(lán)牙串口通訊<b class='flag-5'>總線</b>——<b class='flag-5'>I2C</b>/SPI/<b class='flag-5'>UART</b>

    TCA39306-Q1雙路雙向I3C、I2C總線和SMBus電壓電平轉(zhuǎn)換器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《TCA39306-Q1雙路雙向I3CI2C總線和SMBus電壓電平轉(zhuǎn)換器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 06-21 11:03 ?0次下載
    TCA39306-Q1雙路雙向<b class='flag-5'>I3C</b>、<b class='flag-5'>I2C</b><b class='flag-5'>總線</b>和SMBus電壓電平<b class='flag-5'>轉(zhuǎn)換器</b>數(shù)據(jù)表