本文將介紹通用的I2C、UART和ADC接口。本文為《面向AWorks框架和接口的編程(上)》第三部分軟件篇——第7章通用外設(shè)接口——第4~6小節(jié):I2C總線、UART總線和A/D轉(zhuǎn)換器。
7.4 ?I2C總線
7.4.1 ?I2C總線簡(jiǎn)介
I2C器件的兩線制總線,不僅硬件電路非常簡(jiǎn)潔,而且還具有極強(qiáng)的復(fù)用性和可移植性。I2C總線不僅適用于電路板內(nèi)器件之間的通信,而且通過中繼器還可以實(shí)現(xiàn)電路板與電路板之間長(zhǎng)距離的信號(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ù)纳侠娮杈湍茌p易實(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ù)手冊(cè),對(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ù)手冊(cè)獲取。溫度使用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)樵谏倭亢?jiǎn)單的浮點(diǎn)運(yùn)算中,使用硬件浮點(diǎn)運(yùn)算單元計(jì)算時(shí),效率并不能得到明顯的提升,反而增加了系統(tǒng)的負(fù)擔(dān),例如,當(dāng)外部中斷產(chǎn)生時(shí),需要保護(hù)現(xiàn)場(chǎng),如果使用了硬件浮點(diǎn)運(yùn)算單元,則保護(hù)現(xiàn)場(chǎng)的數(shù)據(jù)量將大大增加。一般來講,只有在需要大量浮點(diǎn)運(yùn)算的場(chǎng)合(比如,在一些算法計(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ù)手冊(cè),這里僅為簡(jiǎn)單介紹使用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簡(jiǎn)介
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ù)迷娇臁3R姷牟ㄌ芈视?800、9600、14400、19200、38400、115200等等,如果波特率為115200,則表示每秒鐘可以傳輸115200位(注意:是bit,不是byte)數(shù)據(jù)。
空閑位
數(shù)據(jù)線上沒有數(shù)據(jù)傳輸時(shí),數(shù)據(jù)線處于空閑狀態(tài)。空閑狀態(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表示本次請(qǐng)求控制的命令,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表示本次請(qǐng)求控制的命令,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ù)值(步長(zhǎng)),其計(jì)算方法為:參考電壓/256=5/256=19.5mV。
看起來這里給出的10位A/D的步長(zhǎng)電壓值,但上述公式還定義了該模數(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輸入電壓的測(cè)量結(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)輸入和輸出字長(zhǎng)共同決定的,輸出精度定義了A/D可以進(jìn)行轉(zhuǎn)換的最小電壓變化。轉(zhuǎn)換精度就是A/D最小步長(zhǎng)值,該值可以通過計(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,但最高測(cè)量電壓降到了2.5V。而不降低基準(zhǔn)電壓又能提高分辨率的唯一方法是增加A/D的數(shù)字位數(shù),對(duì)于使用5V基準(zhǔn)電壓的12位A/D來說,其輸出范圍可達(dá)4096,其分辨率為1.22mV。
在實(shí)際的應(yīng)用場(chǎ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的測(cè)量精度一定小于其轉(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ù)與噪聲,以及長(zhǎng)期漂移等,因此在選擇一個(gè)電壓基準(zhǔn)時(shí),需根據(jù)系統(tǒng)要求的分辨率精度、供電電壓、工作溫度范圍等情況綜合考慮,不能簡(jiǎn)單地以單個(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)和高分辨率的場(chǎng)合。而對(duì)于12bits的AD來說,由于精度要求在0.1%左右的采集系統(tǒng),到底選哪個(gè)型號(hào)呢?測(cè)量系統(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)格的場(chǎng)合,可以直接使用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)換請(qǐng)求就只能排隊(duì)等待,urgent指定了轉(zhuǎn)換請(qǐng)求的緊急性,其決定了排隊(duì)的方式,若urgent為TRUE,表示緊急轉(zhuǎn)換請(qǐng)求,排隊(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è)更加精確的采樣值,最簡(jiǎn)單的處理方法就是取平均值,范例程序詳見程序清單7.45。
程序清單7.45 數(shù)據(jù)處理范例程序(取平均值)
注意,程序中,為了避免sum溢出,將sum的類型定義為了32位無符號(hào)數(shù)。最終的結(jié)果存儲(chǔ)在code變量中。
至此,獲得了一個(gè)較為精確的ADC采樣值,但在實(shí)際使用A/D轉(zhuǎn)換器時(shí),其目的往往并非簡(jiǎn)單的獲取一個(gè)ADC采樣值,而是獲取相應(yīng)通道的電壓值。可以通過基準(zhǔn)電壓和轉(zhuǎn)換位數(shù)將code轉(zhuǎn)換為電壓值,公式如下:
式中,code為讀取的編碼值,Vref為基準(zhǔn)電壓,bits為ADC的位數(shù)。實(shí)際中,2的bits次方可以簡(jiǎn)化為移位運(yùn)算,即:
獲取通道0輸入電壓的完整范例程序詳見程序清單7.46。
程序清單7.46 電壓采集綜合范例程序
在i.MX28x中,通道0對(duì)應(yīng)的外部輸入引腳時(shí)LRADC0引腳,運(yùn)行程序后,可以通過向該引腳接入模擬電壓來測(cè)試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)算,即:
上一篇:人工智能工程師真的有百萬年薪嗎
下一篇:從高通5G收費(fèi)標(biāo)準(zhǔn)計(jì)算國(guó)產(chǎn)廠商每年要支付300億
推薦閱讀
史海拾趣
在20世紀(jì)末和21世紀(jì)初,APEM通過一系列收購(gòu)和技術(shù)合作,不斷增強(qiáng)自身的技術(shù)實(shí)力和市場(chǎng)競(jìng)爭(zhēng)力。例如,APEM收購(gòu)了丹麥的高性能PCB輕觸開關(guān)制造商MEC,以及美國(guó)的開關(guān)面板制造商UNIFAB。這些收購(gòu)不僅使APEM獲得了先進(jìn)的技術(shù)和知識(shí)產(chǎn)權(quán),也為其在全球市場(chǎng)的競(jìng)爭(zhēng)中贏得了先機(jī)。
通過以上五個(gè)故事,我們可以看到APEM公司在電子行業(yè)的發(fā)展歷程中,始終堅(jiān)持創(chuàng)新、擴(kuò)張和合作的戰(zhàn)略,不斷壯大自身實(shí)力,成為行業(yè)內(nèi)的佼佼者。
隨著技術(shù)實(shí)力的不斷提升,鈺創(chuàng)科技開始積極拓展國(guó)際市場(chǎng)。公司憑借高品質(zhì)的產(chǎn)品和專業(yè)的技術(shù)服務(wù),成功打入歐美等發(fā)達(dá)國(guó)家市場(chǎng)。在國(guó)際市場(chǎng)上,鈺創(chuàng)科技面臨著更加激烈的競(jìng)爭(zhēng)和更高的品質(zhì)要求。然而,公司始終堅(jiān)持以客戶為中心的經(jīng)營(yíng)理念,不斷提升產(chǎn)品和服務(wù)質(zhì)量,贏得了越來越多客戶的信賴和支持。
在芯片短缺的大背景下,一家名為芯聯(lián)集成的公司憑借其敏銳的市場(chǎng)洞察力和快速響應(yīng)能力,迅速調(diào)整戰(zhàn)略,專注于車規(guī)級(jí)IGBT芯片和模組的代工生產(chǎn)。公司憑借高效的生產(chǎn)能力和嚴(yán)格的質(zhì)量控制,迅速獲得了多家頭部新能源車企的認(rèn)可,成為他們的合作伙伴。這一舉措不僅幫助芯聯(lián)集成度過了行業(yè)低谷,還使其在短時(shí)間內(nèi)實(shí)現(xiàn)了跨越式發(fā)展。
背景:進(jìn)入21世紀(jì)后,電子行業(yè)進(jìn)入了快速整合階段,大型企業(yè)紛紛通過并購(gòu)來擴(kuò)大規(guī)模、增強(qiáng)實(shí)力。Handok也加入了這一行列,制定了積極的并購(gòu)擴(kuò)張戰(zhàn)略。
發(fā)展:Handok通過精準(zhǔn)的市場(chǎng)分析和戰(zhàn)略評(píng)估,成功并購(gòu)了幾家在電子元器件和電子設(shè)備領(lǐng)域具有領(lǐng)先技術(shù)的中小企業(yè)。這些并購(gòu)不僅為Handok帶來了先進(jìn)的技術(shù)和人才儲(chǔ)備,還極大地拓寬了公司的產(chǎn)品線和服務(wù)范圍。
影響:并購(gòu)后的Handok實(shí)現(xiàn)了從單一產(chǎn)品向多元化產(chǎn)品線的轉(zhuǎn)型,市場(chǎng)競(jìng)爭(zhēng)力顯著提升,為公司的長(zhǎng)遠(yuǎn)發(fā)展奠定了堅(jiān)實(shí)的基礎(chǔ)。
背景:20世紀(jì)末,隨著電子技術(shù)的飛速發(fā)展,Handok敏銳地捕捉到了半導(dǎo)體行業(yè)的崛起機(jī)遇。公司決定投入大量研發(fā)資源,專注于開發(fā)新型半導(dǎo)體材料和技術(shù)。
發(fā)展:經(jīng)過數(shù)年的潛心研究,Handok成功研發(fā)出一種具有更高導(dǎo)電性和穩(wěn)定性的新型半導(dǎo)體材料,這一創(chuàng)新成果迅速獲得了業(yè)界的廣泛關(guān)注。公司迅速將這項(xiàng)技術(shù)應(yīng)用于生產(chǎn),推出了一系列高性能的半導(dǎo)體產(chǎn)品,迅速占領(lǐng)了市場(chǎng)的一席之地。
影響:Handok的技術(shù)革新不僅推動(dòng)了公司自身的快速發(fā)展,還對(duì)整個(gè)半導(dǎo)體行業(yè)產(chǎn)生了深遠(yuǎn)的影響,促進(jìn)了整個(gè)產(chǎn)業(yè)鏈的升級(jí)和轉(zhuǎn)型。
為了進(jìn)一步拓展市場(chǎng),勝利公司開始與其他品牌進(jìn)行跨界合作。例如,公司與知名運(yùn)動(dòng)品牌合作推出聯(lián)名款羽毛球鞋和服裝,吸引了更多消費(fèi)者的關(guān)注。此外,公司還與電商平臺(tái)合作,開展線上銷售業(yè)務(wù),為消費(fèi)者提供更加便捷的購(gòu)物體驗(yàn)。
簡(jiǎn)單介紹網(wǎng)絡(luò)攝像機(jī)知識(shí) 關(guān)鍵詞:網(wǎng)絡(luò)攝像機(jī);圖像壓縮編碼;DSP;ASIC 摘要:網(wǎng)絡(luò)攝像機(jī)是傳統(tǒng)攝像機(jī)與網(wǎng)絡(luò)視頻技術(shù)相結(jié)合的新一代產(chǎn)品,除了具備一般傳統(tǒng)攝像機(jī)所有的圖像捕捉功能外,機(jī)內(nèi)還內(nèi)置了數(shù)字化壓縮控制器和基于WEB的操作系統(tǒng),使得視頻數(shù)據(jù)經(jīng)壓縮加密 ...… 查看全部問答∨ |
|
白皮書:相變存儲(chǔ) - 帶來新應(yīng)用模式的全新技術(shù) http://comm.ednchina.com/Company/numonyx/resourcedetail.aspx?id=41 白皮書:用于蜂窩電話的低功耗非易失性存儲(chǔ)系統(tǒng)設(shè)計(jì) http://comm.ednchina.com/Company/numonyx/resourcedetail.aspx?id=40 ...… 查看全部問答∨ |
二手開發(fā)板,IC呆料免費(fèi)交易平臺(tái)www.dz-dailiao.cn,www.電子呆料.cn 二手開發(fā)板,IC呆料免費(fèi)交易平臺(tái)www.dz-dailiao.cn,www.電子呆料.cn… 查看全部問答∨ |
鼠標(biāo)一到技術(shù)支持就不顯示中文,前些時(shí)間也在貼子里提過,這么久都沒改,所以只能這么想了。唉!可憐的中國(guó)工程師啊! 下載 (30.7 KB) 2010-11-30 10:16 … 查看全部問答∨ |
LM3S9B96鎖死了!按照LM Flash Programmer在Configuration選項(xiàng)頁Quick Set欄選擇LM3S9B96,然后在Other utilities選項(xiàng)頁Debug Port Unlock框選擇“Fury and DustDevil Classes”,點(diǎn)下"unlock‘’ 按照提示操作后, ...… 查看全部問答∨ |
有沒有興趣做個(gè)隔離電源:用TPS55010 :隔離式 DC/DC 轉(zhuǎn)換器 本帖最后由 dontium 于 2015-1-23 13:14 編輯 總想做個(gè)微型隔離電源,終于有機(jī)會(huì)了。搞到了TPS55010 (隔離式 DC/DC 轉(zhuǎn)換器 )現(xiàn)在就是小變壓器不知道哪里買。最好價(jià)格不要高。否則搞不下去。 大家討論一下。怎么搞。 [ 本帖最后由 damiaa 于 20 ...… 查看全部問答∨ |
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 [ 本帖最后由 小新和小笛 ...… 查看全部問答∨ |
- 貿(mào)澤開售BeagleBoard CC33 2.4GHz Wi-Fi 6 BLE無線模塊
- 伊世智能發(fā)布「C2000 F29芯片」HSM信息安全固件,賦能AI服務(wù)器供電系統(tǒng)信息安全
- “你好BOE”2025首站啟幕 助力“橫琴-澳門國(guó)際數(shù)字藝術(shù)博覽會(huì)”打造沉浸式科技藝術(shù)新高地
- 消息稱蘋果曾計(jì)劃與波音合作推出衛(wèi)星家庭互聯(lián)網(wǎng)服務(wù)
- AI PC時(shí)代,英特爾和微軟引領(lǐng)PC產(chǎn)業(yè)翻開Windows 11 AI+ PC新篇章!
- 跨國(guó)地面與太空連接,5G NTN為未來6G打下堅(jiān)實(shí)基礎(chǔ)
- 全新英特爾至強(qiáng)6處理器:為滿足AI模型和數(shù)據(jù)集增長(zhǎng)需求而生
- 英飛凌攜手NVIDIA,引領(lǐng)未來AI服務(wù)器機(jī)架電源架構(gòu)變革
- 為AI PC加雙慧眼,英特爾與億道集團(tuán)、亦心科技帶來AI眼鏡與AI PC的首次結(jié)合
- ?意法半導(dǎo)體在 2025 年東南亞國(guó)際半導(dǎo)體展會(huì)展示邊緣人工智能和自動(dòng)化解決方案
- 貿(mào)澤開售BeagleBoard CC33 2.4GHz Wi-Fi 6 BLE無線模塊
- 2025研華嵌入式設(shè)計(jì)論壇上海站:聚焦Edge Computing & Edge AI,共探技術(shù)創(chuàng)新與生態(tài)融合
- 提高電機(jī)的效率與可持續(xù)性
- 【車內(nèi)消費(fèi)類接口測(cè)試】泰克賦能V-by-One HS技術(shù)在汽車電子測(cè)試領(lǐng)域的應(yīng)用
- 品英Pickering公司產(chǎn)品確保低空航空器的航電和電池安全可靠
- 國(guó)產(chǎn)機(jī)器人操作系統(tǒng)鴻道發(fā)布:支持華為、龍芯、英偉達(dá)等
- 消息稱美國(guó)暫停對(duì)華發(fā)動(dòng)機(jī)和半導(dǎo)體技術(shù)出口
- 碾壓NVIDIA!Cerebras全球尺寸最大芯片:驚人的40億個(gè)晶體管
- 充電樁行業(yè)太卷,該涉足嗎?
- 英特爾FPGA可編程加速平臺(tái)介紹,走近AI、數(shù)據(jù)中心、基因工程等大咖工程
- “搜器件”小程序又添新功能!
- 直播|基于英特爾® Agilex™ FPGA F-Tile的以太網(wǎng)硬核IP詳解及如何使用oneAPI對(duì)FPGA編程
- 報(bào)名抽取京東卡|2021慕尼黑華南電子展觀眾注冊(cè)進(jìn)行中
- 下載有禮|終于找到秘籍,示波器探頭的選擇和使用就靠它了!
- 愛“拼”才會(huì)贏 英飛凌柵極驅(qū)動(dòng)IC拼圖闖關(guān) 活動(dòng)開始啦!
- Littelfuse 新品賦能電子產(chǎn)品安全可靠并高效, 10+挑戰(zhàn)等你探索!
- 速度與激情,為你私人訂制。R&S攜多功能基礎(chǔ)示波器帶你身臨其境!
- 樂享愜意春天,TI A8開源硬件平臺(tái)體驗(yàn)季!
- 跨足360度相機(jī)產(chǎn)業(yè) 信驊Cupola360芯片問世
- 高通推出全球首款擴(kuò)展現(xiàn)實(shí)(XR)專用平臺(tái)
- Vishay推出首款汽車級(jí)光電三極管耦合器
- ASML入駐臺(tái)肥新竹商辦大樓
- 半導(dǎo)體設(shè)備需求旺 京鼎昆山廠添購(gòu)設(shè)備擴(kuò)充產(chǎn)能
- ARM7 Thumb系列嵌入式處理器介紹
- 基于ARM920T的嵌入式Linux系統(tǒng)的構(gòu)建
- 采用微程序控制和門級(jí)設(shè)計(jì)的嵌入式FPU微指令控制模塊
- 一款基于ARM7的嵌入式實(shí)驗(yàn)平臺(tái)設(shè)計(jì)
- 一個(gè)高性能、低功耗、低成本的嵌入式掌上娛樂系統(tǒng)的設(shè)計(jì)
- 【IoT畢業(yè)設(shè)計(jì)】STM32開發(fā)板+機(jī)智云IoT+實(shí)現(xiàn)智能空調(diào)控制
- 只能上QQ,上不了網(wǎng)頁怎么回事?
- 對(duì)中國(guó)目前3G的一點(diǎn)看法
- 好資料“時(shí)鐘參數(shù)shew和jitter介紹”!
- 是不是有個(gè)flable工具或框架
- TM1722驅(qū)動(dòng)段碼式液晶顯示屏的程序怎么寫呀?
- 震蕩電路咨詢
- ST傳感器(SensorTile)開發(fā)板流動(dòng)站上線(試運(yùn)營(yíng))
- 庫(kù)函數(shù)的原型在哪里可以看到
- 大家可以看看我的例程自己2天搭建的入門級(jí)USBD功能STM32F紅龍429_USBD-HID