在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

I2C總線、UART總線和A/D轉換器應用設計

AGk5_ZLG_zhiyua ? 來源:互聯網 ? 作者:佚名 ? 2018-05-28 08:57 ? 次閱讀

本文導讀

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

7.4 I2C總線

7.4.1 I2C總線簡介

I2C器件的兩線制總線,不僅硬件電路非常簡潔,而且還具有極強的復用性和可移植性。I2C總線不僅適用于電路板內器件之間的通信,而且通過中繼器還可以實現電路板與電路板之間長距離的信號傳輸,因此使用I2C器件非常容易構建系統級電子產品開發平臺。其特點如下:

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

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

  • 非常容易實現I2C總線的自檢功能,以便及時發現總線的異常情況;

  • 總線電氣兼容性好,I2C總線規定器件之間以開漏I/O互連,因此只要選取適當的上拉電阻就能輕易實現3V/5V邏輯電平的兼容;

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

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

7.4.2 I2C接口

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

表7.14 I2C標準接口函數

1. 定義I2C從機器件實例

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

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

2. 初始化從機器件實例

當完成從機器件實例的定義后,還需要完成其初始化,指定從機器件相關的信息,初始化函數的原型為:

其中,p_dev為指向I2C從機實例的指針,busid為I2C總線編號,addr為從機器件地址,flags為從機器件相關的一些標志。

在AWorks中,一個系統往往具有多條I2C總線,各總線之間通過busid區分,一個系統實際支持的I2C總線條數與具體硬件平臺相關。例如,在i.MX28x系統中,最高可以支持2條I2C總線,對應的總線編號即為:0 ~ 1。busid參數即用于指定使用那條I2C總線與從機器件進行通信。

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

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

表7.15 從機設備屬性

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

要獲取這些信息,就必須查看芯片相關的數據手冊,對于LM75B,其引腳分布圖詳見圖7.12。LM75B的器件地址為7位地址:1001A2、A1、A0,其中,A2、A1、A0分別為引腳A2、A1、A0的狀態。在擴展板中,LM75B等效的應用電路詳見圖7.11。

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

圖7.11 LM75B應用電路

圖7.12 LM75B管腳圖

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

從機屬性分為從機地址屬性、應答屬性和器件內子地址屬性。LM75B的從機地址為7位,其對應的屬性標志為AW_I2C_ADDR_7BIT。

如果從機實例不能應答,則設置AW_I2C_IGNORE_NAK標志,一般來說,標準的I2C從機器件均可產生應答信號,除非特殊說明,否則都不需要使用該標志。LM75B內部共計有4個寄存器,它們的定義詳見表7.16。

表7.16 LM75B內部寄存器列表

由表中地址欄內容可知,所有寄存器的地址均為8位,因此,器件內子地址為一個字節,對應的屬性標志為:AW_I2C_SUBADDR_1BYTE。因為器件子地址只有一個字節,所以沒有高字節與低字節之分,也就無需使用

AW_I2C_SUBADDR_MSB_FIRST

或AW_I2C_SUBADDR_LSB_FIRST標志。

通過以上分析,得到了LM75B相關的從機信息,為此,可以定義并初始化一個與LM75B對應的從機器件實例,范例程序詳見程序清單7.26。

程序清單7.26 從機器件實例初始化函數范例程序

3. 讀操作

從I2C從機器件指定的子地址中讀出數據的函數原型為:

其中,p_dev為指向I2C從機實例的指針,subaddr為器件子地址,以指定讀取數據的位置,p_buf指向存放讀取數據的緩沖區,nbytes指定讀取數據的字節數。返回值為標準的錯誤號,返回AW_OK時表示讀取成功,否則,表示讀取失敗。

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

程序清單7.27 讀取數據范例程序

讀取的兩字節數據表示的溫度值是多少呢?這兩個字節具體表示的溫度值含義可從芯片的數據手冊獲取。溫度使用16位二進制補碼表示,最高位為符號位,最高位為1時,表示溫度為負數。讀取溫度時,讀取的首個字節是高8位數據,緊接著的字節是低8位數據。各個位表示的溫度權重詳見表7.17。

表7.17 溫度值數據各個位的含義

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

據此,可以將字節0和字節1合并為一個有符號的16位整數,例如:

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

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

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

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

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

小數部分的值計算過程如下:

最終打印輸出的結果即為:

這樣的計算過程雖然看起來復雜了一些,但是其卻從根本上避免了浮點運算,保證了程序運行的效率。在沒有硬件浮點運算單元的MCU中,浮點運算是通過軟件模擬的,效率非常低下。在AWorks中,如非必要,都應該盡可能避免浮點運算。即使是在有浮點運算單元的MCU中,也應該在一些基礎的運算中避免使用浮點運算,因為在少量簡單的浮點運算中,使用硬件浮點運算單元計算時,效率并不能得到明顯的提升,反而增加了系統的負擔,例如,當外部中斷產生時,需要保護現場,如果使用了硬件浮點運算單元,則保護現場的數據量將大大增加。一般來講,只有在需要大量浮點運算的場合(比如,在一些算法計算中,很難使用整數運算來避免浮點運算),才使用浮點運算。

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

4. 寫操作

向I2C從機實例指定的子地址中寫入數據的函數原型為:

其中,p_dev為指向I2C從機實例的指針,subaddr為器件子地址,以指定寫入數據的位置,p_buf指向存放待寫入數據的緩沖區,nbytes指定寫入數據的字節數。返回值為標準的錯誤號,返回AW_OK時表示寫入成功,否則,表示寫入失敗。

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

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

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

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

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

程序清單7.29 寫入數據范例程序

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

程序清單7.30 驗證寫入數據是否成功的范例程序

7.5 UART總線

7.5.1 UART簡介

UART

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

UART是一種串行通信協議,數據在數據線上按位一位一位的發送,UART協議主要有以下幾個概念需要了解:

  • 波特率

波特率是衡量數據傳輸速率的指標,表示每秒傳送數據的位數,值越大,數據通信的速率越高,數據傳輸得越快。常見的波特率有4800、9600、14400、19200、38400、115200等等,如果波特率為115200,則表示每秒鐘可以傳輸115200位(注意:是bit,不是byte)數據。

  • 空閑位

數據線上沒有數據傳輸時,數據線處于空閑狀態。空閑狀態的電平邏輯為“1”。

  • 起始位

起始位表示一幀數據傳輸的開始,起始位的電平邏輯是“0”。

  • 數據位

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

  • 奇偶校驗位

奇偶校驗位用于接收方對數據進行校驗,及時發現由于通信故障等問題造成的錯誤數據。奇偶校驗位是可選的,可以不使用奇偶校驗位。奇偶校驗有奇校驗和偶校驗兩種形式,該位的邏輯電平與校驗方法和所有數據位中邏輯“1”的個數相關。

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

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

通信雙方使用的校驗方法應該一致,接收方通過判斷“1”的個數是否為奇數(奇校驗)或偶數(偶校驗)來判定數據在通信過程中是否出錯。

  • 停止位

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

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

注意,通信雙方必須使用完全相同的協議,包括波特率、起始位、數據位、停止位等。如果協議不一致,則通信數據會錯亂,不能正常通信。在通信中,若出現亂碼的情況,應該首先檢查通信雙方所使用的協議是否一致。

7.5.2 串行接口

在AWorks中,定義了通用的串行接口,可以使用串行接口操作UART,實現數據的收發。接口原型詳見表7.18。

表7.18 串行接口(aw_serial.h)

1. UART控制

在使用UART進行數據傳輸前,需要正確配置串行通信協議,比如:波特率、數據位、停止位、校驗位等。其函數原型為:

其中,com為串口設備的ID,request表示本次請求控制的命令,p_arg為與request對應的參數,其具體類型與request的值相關。返回值為標準的錯誤號,返回AW_OK時表示本次控制成功,否則,表示控制失敗。

在AWorks中,一個系統往往可以有多路串口輸出,例如,在i.MX28x中,有1路調試串口,5路應用串口,為了區分各個串口,為各個串口設備分配了唯一的編號,如在i.MX28x中,各個串口設備分配的編號詳見表7.19。

表7.19 各串口設備對應的編號

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

request表示本次請求控制的命令,p_arg為與之對應的參數。常見命令與對應p_arg參數的實際類型詳見表7.20。

表7.20 UART常用控制命令

  • 設置波特率

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

程序清單7.31 設置波特率范例程序

  • 獲取波特率

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

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

  • 設置硬件參數

設置硬件參數包括通信協議相關的參數,比如:數據位、校驗位、停止位等。設置硬件參數對應的命令為SIO_HW_OPTS_SET,其對應的p_arg為32位整數,是由多個參數宏通過或(“|”)運算符連接組成。相關的參數宏詳見表7.21。

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

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

程序清單7.33 設置硬件參數的范例程序

  • 獲取硬件參數

獲取當前硬件參數的命令為SIO_HW_OPTS_GET。例如,通過獲取硬件參數,判斷當前使用何種校驗方式的范例程序詳見程序清單7.34。

程序清單7.34 獲取硬件參數的范例程序

此外,在發送或接收數據時,還會使用到幾個命令,這些命令在講解發送數據和接收數據時再詳細介紹。

2. 發送數據

在AWorks中,為每個串口設備都分配了一個發送數據緩沖區(默認大小為128字節),用于緩存用戶發送的數據。當用戶發送數據時,首先會將數據加載到緩沖區中,加載到緩沖區后,串口設備將按照設定的波特率自動發送緩沖區中的數據。用戶將數據寫入緩沖區后,即可不用再處理串口的發送,轉而處理其它事務。發送數據的函數原型為:

其中,com為串口設備的編號,p_buffer指向待發送數據的緩沖區,nbytes為發送數據的字節數。返回值為成功寫入緩沖區的數據個數。比如,發送一個字符串“Hello World!“,范例程序詳見程序清單7.35。

程序清單7.35 發送數據范例程序

3. 接收數據

在AWorks中,同樣為每個串口設備都分配了一個接收數據緩沖區(默認大小為128字節),用于緩存串口設備接收到的數據,用戶可以通過命令查詢當前接收到的數據字節數,其對應的命令為:AW_FIONREAD,獲取COM1的接收緩沖區中已接收數據個數的范例程序詳見程序清單7.36。

程序清單7.36 獲取接收緩沖區中已接收數據個數的范例程序

用戶可通過接收數據接口讀取緩沖區中的數據,其函數原型為:

其中,com為串口設備的編號,p_buffer指向存儲讀取數據的緩沖區,maxbytes為讀取數據的最大字節數,其值往往與p_buffer指向的緩沖區大小一致。返回值為成功讀取的數據個數。例如,接收數據的范例程序詳見程序清單7.37。

程序清單7.37 接收數據范例程序

若當前接收緩沖區中具有足夠的數據,即已接收數據不小于maxbytes,則成功讀取maxbytes字節的數據,函數立即返回。若沒有足夠的數據,即已接收數據小于maxbytes小,則默認情況下,會一直阻塞等待,直到接收的數據量達到maxbytes。若用戶不希望一直阻塞等待,則可以設定一個超時時間,當等待時間達到該值時,無論是否接收到maxbytes字節的數據,函數都會返回。

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

程序清單7.38 設置讀等待的超時時間為100ms

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

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

7.6 A/D轉換器

7.6.1 模數信號轉換

1. 基本原理

我們經常接觸的噪聲和圖像信號都是模擬信號,要將模擬信號轉換為數字信號,必須經過采樣、保持、量化與編碼幾個過程,詳見圖7.14。

圖7.14 模數信號轉換示意圖

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

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

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

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

將量化后的信號轉換為二進制數,即用0和1的碼組合來表示的處理過程稱為編碼,“1”表示有脈沖,“0”表示無脈沖。當量化級數取為64級時,表示這些數值的二進制的位數必須是6位;當量化級數取為256級時,則必須用8位二進制數表示。

2. 基準電壓

基準電壓就是模數轉換器可以轉換的最大電壓,以8位A/D模數轉換器為例,這種轉換器可以將0V到其基準電壓范圍內的輸入電壓轉換為對應的數值表示。其輸入電壓范圍分別對應4096個數值(步長),其計算方法為:參考電壓/256=5/256=19.5mV。

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

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

3. 轉換精度

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

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

在實際的應用場合是有噪音的,顯然該12位A/D會將系統中1.22mV的噪音作為其輸入電壓進行轉換。如果輸入信號帶有10mV的噪音電壓,則只能通過對噪音樣本進行多次采樣并對采樣結果進行平均處理,否則該轉換器無法對10mV的真實輸入電壓進行響應。

4. 累積精度

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

5. 基準源選型

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

比如,要求12 位A/D分辨到1LSB,即相當于1/212=244ppm。如果工作溫度范圍在10℃,那么一個初始精度為0.01%(相當于100ppm),溫度系數為10ppm/℃(溫度范圍內偏移100ppm)的基準已能滿足系統的精度要求,因為基準引起的總誤差為200ppm,但如果工作溫度范圍擴大到15℃以上,該基準就不適用了。

6. 常用基準源

(1)初始精度的確定

初始精度的選擇取決于系統的精度要求,對于數據采集系統來說,如果采用n位的ADC,那么其滿刻度分辨率為1/2n,若要求達到1LSB的精度,則電壓基準的初始精度為:

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

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

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

(2)溫度系數的確定

溫度系數是選擇電壓基準另一個重要的參數,除了與系統要求的精度有關外,溫度系數還與系統的工作溫度范圍有直接的關系。對于數據采集系統來說,假設所用ADC的位數是n,要求達到1LSB的精度,工作溫度范圍是ΔT,那么基準的溫度系數TC可由下式確定:

同樣地,考慮到其它誤差的影響,實際的TC值還要選得比上式更小一些。溫度范圍ΔT通常以25℃為基準來計算,以工業溫度范圍-40℃~+85℃為例,ΔT可取60℃(85℃-25℃),因為制造商通常在25℃附近將基準因溫度變化引起的誤差調到最小。

圖7.15 系統精度與基準溫度系數TC的關系

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

TL431和REF3325/3330均為典型的電壓基準源產品,詳見表7.22。TL431的輸出電壓僅用兩個電阻就可以在2.5~36V范圍內實現連續可調,負載電流1~100mA。在可調壓電源、開關電源、運放電路常用它代替穩壓二極管。REF3325輸出2.5V,REF3330輸出3.0V。

表7.22 電壓基準源選型參數表

REF33xx是一種低功耗、低壓差、高精密度的電壓基準產品,采用小型的SC70-3和SOT23-3封裝。體積小和功耗低(最大電流為5μA)的特點使得REF33xx系列產品成為眾多便攜式和電池供電應用的最佳選擇。在負載正常的情況下,REF33xx系列產品可在高于指定輸出電壓180mV的電源電壓下工作,但REF3312除外,因為它的最小電源電壓為1.8V。

圖7.16 12bits系統基準選擇

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

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

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

7.6.2 A/D轉換接口

AWorks提供了A/D轉換接口,可以直接通過接口獲取相應引腳輸入的模擬電壓大小。相關接口詳見表7.23。

表7.23 ADC通用接口函數

1. 獲取ADC通道的采樣率

獲取當前ADC通道的采樣率,采樣率的單位為Samples/s,表示每秒進行多少次采樣。其函數原型為:

其中,ch為ADC的通道號,p_rate為輸出參數,用以得到指定通道的采樣率。返回值為標準的錯誤號,返回AW_OK時表示獲取成功,否則,表示獲取失敗,失敗的原因可能是通道號不存在。

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

由此可見,通過宏的形式,將通道號 0 ~ 23 使用了更具有意義的宏來表示。用戶也可通過查看此文件獲知當前硬件平臺支持的ADC通道數目。

通道號的類型為aw_adc_channel_t,其本質上是一個無符號整數類型,具體的位寬與平臺相關。如一個平臺中僅支持24個通道,則其類型可能為uint8_t,即使用8位來表示通道號。獲取通道0的采樣率范例程序詳見程序清單7.40。

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

2. 設置ADC通道的采樣率

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

其中,ch為ADC的通道號,rate為設置的采樣率。返回值為標準的錯誤號,返回AW_OK時表示設置成功,否則,表示設置失敗。

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

注意,通常情況下,一個A/D轉換器的所有通道共用一個采樣率,因此,設置其中一個通道的采樣率時,可能會影響其它通道的采樣率。

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

程序清單7.41 設置采樣率范例程序

設置采樣率為1000 Samples/s。表示每秒采集1000個數據點,即每隔1毫秒采集一個數據點。

3. 獲取ADC通道的基準電壓

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

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

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

程序清單7.42 獲取基準電壓范例程序

例如,基準電壓為2.5V,則vref的值為2500。

4. 獲取ADC通道的轉換位數

獲取ADC通道的轉換位數,其函數原型為:

其中,ch為ADC的通道號。轉換位數通過返回值返回:若返回值大于0,則獲取成功,其值即為轉換位數;若返回值小于0,則獲取失敗。

獲取通道0的轉換位數范例程序詳見程序清單7.43。

程序清單7.43 獲取轉換位數范例程序

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

5. 讀取ADC通道的采樣值

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

其中,ch為ADC的通道號,p_val為存儲采樣值的緩沖區,samples指定本次采樣的次數,urgent指定本次讀取操作的優先級。返回值為標準的錯誤號,返回AW_OK時表示讀取成功,否則,表示讀取失敗。

p_val指向用于存儲采樣值的緩沖區,緩沖區實際類型與ADC的位數相關:若ADC的位數為 1 ~ 8,則其類型為uint8_t;若ADC的位數為9 ~ 16,則其類型為uint16_t;若ADC的位數為 17 ~ 32,則其類型為uint32_t。例如,在i.MX28x中,ADC的位數為12,則應使用uint16_t類型的緩沖區來存儲ADC的采樣值。如定義一個大小為100的緩沖區,以存儲100個采樣值:

samples表示本次讀取的采樣值個數。實際應用中,每次讀取操作往往會讀取多個采樣值,以便通過取平均值等方法對采樣值進行處理,得到更加準確的結果。多個采樣值將依次存放在p_val指向的緩沖區中,需確保p_val指向的緩沖區的大小與samples保持一致。

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

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

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

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

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

注意,程序中,為了避免sum溢出,將sum的類型定義為了32位無符號數。最終的結果存儲在code變量中。

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

式中,code為讀取的編碼值,Vref為基準電壓,bits為ADC的位數。實際中,2的bits次方可以簡化為移位運算,即:

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

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

在i.MX28x中,通道0對應的外部輸入引腳時LRADC0引腳,運行程序后,可以通過向該引腳接入模擬電壓來測試ADC采集的結果是否正確。

程序中,電壓值的計算未使用到浮點運算,僅使用了整數運算,效率較高。但運算結果vol的值也只能精確的mV,若需要提高計算結果的精度,可以使用浮點數來存儲計算的結果,將vol的類型定義為float,即:

同時,在計算電壓值時,要確保表達式使用浮點運算,即:

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 轉換器
    +關注

    關注

    27

    文章

    8742

    瀏覽量

    147734
  • 致遠電子
    +關注

    關注

    13

    文章

    409

    瀏覽量

    31369

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

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    設計方案:基于PCF8591的I2C總線A/DD/A轉換

    本資料是關于:基于PCF8591的I2C總線A/DD/A
    發表于 07-26 22:47

    PCF8591_8位A/D and D/A轉換器相關資料下載

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

    基于WorldFIP 的現場總線-電流轉換器的開發The D

    本文針對在DCS 向FCS 過渡中一個急待解決的問題――常規儀表與現場總線的兼容,開發出基于WorldFIP 的現場總線-電流轉換器。文章介紹了WorldFIP 協議特點,并著重介紹了轉換器
    發表于 06-03 08:10 ?25次下載

    PCA9306 I2C總線和SMBus雙向電平轉換器簡介

    PCA9306是一款支持I2C總線和SMBus的雙向電平轉換器,支持從1.0V~3.6V(Vref(1))到1.8V~5.5V(Vbias(ref)(2))的電平轉換,并且帶有使能輸入
    發表于 03-10 15:37 ?53次下載

    PCA9564 并行總線I2C總線接口芯片簡介

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

    PCA9665并行總線I2C總線接口芯片簡介

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

    電平轉換I2C總線中的應用(英)

    電平轉換I2C總線中的應用(英)
    發表于 07-23 16:16 ?29次下載

    FXM2IC102 電壓轉換器,針對I2C總線應用

    飛兆發布電壓轉換器FXM2IC102,針對I2C總線應用 飛兆半導體公司 (Fairchild Semiconductor) 為設計人員提供用于I2C (Inter-Integrat
    發表于 09-02 08:52 ?894次閱讀

    采用I2C總線的ADS1100型16位模/數轉換器的設計

    采用I2C總線的ADS1100型16位模/數轉換器的設計 ADS1100是采用2.7V~5.5V單電源供電的連續自校準模/數(A/D
    發表于 02-26 15:01 ?3188次閱讀
    采用<b class='flag-5'>I2C</b><b class='flag-5'>總線</b>的ADS1100型16位模/數<b class='flag-5'>轉換器</b>的設計

    用于中間總線架構的半調節總線轉換器

    用于中間總線架構的半調節總線轉換器 SynQor推出了SQ60系列的新產品,擴展了隔離半調節dc-dc轉換器的BusQor系列,用于中間總線
    發表于 01-04 10:00 ?775次閱讀

    電平轉換器解決I2C總線應用的兼容性

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

    SPI、I2CUART三種串行總線協議的區別

    SPI、I2CUART三種串行總線協議的區別
    發表于 07-17 17:23 ?0次下載

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

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

    藍牙串口通訊總線——I2C/SPI/UART

    嵌入式工程師在做串口通信調試工作的時候,會經常用到I2C、SPI、UART這3條總線I2C、SPI、UART這三種通信
    的頭像 發表于 01-22 09:41 ?1764次閱讀
    藍牙串口通訊<b class='flag-5'>總線</b>——<b class='flag-5'>I2C</b>/SPI/<b class='flag-5'>UART</b>

    TCA39306-Q1雙路雙向I3CI2C總線和SMBus電壓電平轉換器數據表

    電子發燒友網站提供《TCA39306-Q1雙路雙向I3CI2C總線和SMBus電壓電平轉換器數據表.pdf》資料免費下載
    發表于 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'>轉換器</b>數據表
    主站蜘蛛池模板: 免费在线观看一级毛片 | 国产伦精品一区二区三区免 | 色色就色色 | 在线观看精品国产入口 | 精品视频在线观看视频免费视频 | 特黄黄三级视频在线观看 | 最新欧美一级视频 | 色天使在线观看 | 综合亚洲一区二区三区 | 亚洲高清美女一区二区三区 | 午夜视频一区二区 | 91福利免费视频 | 国产三级a三级三级天天 | 成人欧美精品一区二区不卡 | 天天摸天天摸天天躁 | 欧美性网站 | 亚洲美女激情视频 | 奇米影视7777 | 亚洲国产婷婷香蕉久久久久久 | 日韩欧美成人乱码一在线 | freesexvideo性欧美2 | 国产成人亚洲影视在线 | 高清毛片一区二区三区 | 色盈盈 | 国模视频一区 | 韩国免费特一级毛片 | 五月婷婷视频在线观看 | 五月天情网| 91新地址| 亚洲精品免费视频 | 高清性色生活片久久久 | 九九精品影院 | 四虎最新影院 | 成年人污视频 | 午色 | 亚洲偷偷 | a欧美视频 | 四虎影院一区二区 | 在线黄色免费观看 | 一级黄视频| 日本亚洲卡一卡2卡二卡三卡四卡 |