Hi3518EV200平臺ADC多通道取樣流程

生活常識發表於2017-11-22

Hi3518EV200 ADC


本文針對Hi3518EV200平臺處理器,通過ADC單次取樣方式,實現對多通道(1~4通道)ADC進行取樣控制。本文僅僅是對Hi3518EV200晶片ADC的用法的介紹,不涉及ADC具體的工作原理、轉換原理等細節內容。廢話不多說,直入正題!

Hi3518EV200晶片ADC模組簡介:

特性:

 電源電壓:3.3V
 掃描頻率不能高於200K/s
 獨立通道:4路

特點:

 支援單次啟動,每次掃描一個通道,不濾毛刺,提供中斷以及查詢。
 支援連續掃描功能:
      根據ch_vld自動輪詢各通道
      根據Tscan(掃描間隔)啟動連續查詢
      根據Tglitch進行濾毛刺,完成對毛刺的有效判定
      上報LSADC轉換結果、對應的通道號
      上報中斷:有按鍵中斷,按鍵有變化中斷(此部分不太明白,是筆誤寫成了按鍵還是另有深意,不太清楚)

以上特性和特點摘自Hi3518EV200晶片手冊,文章還會摘取Hi3518EV200晶片手冊的部分暫存器截圖以作介紹。

ADC的實現方法簡述:

Hi3518EV200平臺的ADC模組支援4個通道,分兩種模式取樣:
第一種是單次掃描模式,支援多通道掃描;
第二種是連續Scan掃描模式,支援多通道掃描(測試驗證未成功,在此處就不多說了)

單次掃描模式的工作實現方法

  1. 開啟ADC時鐘
  2. 各個控制暫存器配置(參考手冊流程配置,含取樣值位數,通道使能,單次掃描,不支援powerdown等)
  3. 使用request_irq註冊ADC中斷,中斷號19
    以上配置封裝成Init函式,模組載入時初始化ADC模組使用

ADC開始取樣

具體操作函式封裝為ADC_Start(),包含以下工作:

  1. 判斷需要取樣的通道和上次工作的通道是否為同一個通道(為什麼要這麼做,在下面內容會有說明)
  2. Disable中斷,停止ADC,清空所有通道中斷,清空通道使能,使能需要取樣的通道,備份該通道等下次取樣判斷
  3. 如果1中的判斷是同一個通道,就忽略2中操作
  4. 開始ADC取樣,使能ADC中斷
  5. 備份本次取樣的通道號,以備下次取樣時在1中進行判斷

中斷處理函式的工作

  1. 判斷使能的是哪個通道
  2. 判斷該使能的通道的中斷標誌是否置位(即該通道轉換是否完成,一般都會完成)
  3. 獲取該通道轉換後的值
  4. 如果註冊了其他對該資料操作的函式,就執行
  5. 清空該通道的中斷標誌位(此處需要小心操作,不然會引起不可知現象,詳細見下文說明)


需要在中斷處理函式中設定ADC轉換狀態,在呼叫開始ADC轉換的地方,判斷ADC取樣是否正在進行,如果ADC正在使用(即ADC轉換已經開始,轉換完成中斷還未發生),就延時等待,直到該中斷完成之後再開啟ADC轉換。

ADC取樣具體實現:

通過配置ADC模組的相關配置暫存器使ADC正常工作。


ADC時鐘:

開啟ADC時鐘
ADC時鐘配置在PERI_CRG31暫存器(參考下圖),要開啟ADC的時鐘,需要將[1]置1。

ADC軟復位:

這裡的ADC軟復位是指SAR_ADC的軟復位請求,在PERI_CRG31寄存將[2]置1表示復位,置0表示撤銷復位。

ADC引數配置:

ADC引數配置部分需要設定LSADC_CTRL0配置暫存器。


在初始化ADC時需要將ADC復位(為何要先復位,不太清楚,感覺這樣做對裝置來說更安全),設定ADC進入復位狀態需要設定配置暫存器,把[15]置1即可。

ADC時鐘撤銷復位:將時鐘暫存器PERI_CRG3的[2]置0,通上述開啟ADC時鐘。
ADC退出復位狀態:將LSADC_CTRL0配置暫存器的[15]置0。

ADC通道使能,選擇需要使用的ADC通道使能,將相應的位置1相應通道有效,置0則相應通道無效。
0通道 [8]置1
1通道 [9]置1
2通道 [10]置1
3通道 [11]置1

ADC轉換精度設定
[31:24] 設為0xFF 表示8bit精度,即取樣範圍:0~255

ADC掃描模式選擇
[13] 0 單次掃描模式

ADC的PowerDown支援選擇
[14] 0 不支援

到這裡,ADC的復位和初始化工作完成,具體的初始化操作ADC單次取樣流程可以參考下圖流程。每次復位都需要重新設定初始化引數。


ADC中斷設定

需要註冊ADC中斷,在ADC取樣完成時發出中斷,開始記錄取樣值。中斷流程和別的中斷處理類似(比如按鍵中斷),ADC的中斷號是19。具體中斷細節此處省略。

開始ADC取樣:

開始ADC取樣的一些操作步驟:

  1. 先要判斷ADC當前的取樣通道和要取樣的通道是否相同,如果ADC當前的取樣通道和要取樣的通道不相同,需要進行一些操作使ADC通道切換到需要取樣的通道。(這一步不是必須,如果要多路取樣,建議加上該部分,具體原因下文介紹)
  2. 將ADC的中斷使能關閉,即將中斷使能暫存器LSADC_CTRL4的[0]置0
  3. 停止ADC取樣,即將Stop配置暫存器LSADC_CTRL8的[31:0]寫入任意值就可以實現停止ADC取樣,比如寫入1
  4. 將ADC要取樣的通道的中斷清除,設定中斷清除暫存器LSADC_CTRL6的[3:0]位,將通道號相對應的位置1
  5. 關閉ADC各通道使能,在配置暫存器LSADC_CTRL0的[11:8]位全部清零
  6. 單獨使能要進行取樣的通道,設定配置暫存器LSADC_CTRL0的[11:8]位將相應通道使能,如將[8]置1使能A通道
  7. 備份本次取樣通道號,用來在開始工作時判斷通道是否相同時(第1步)使用
  8. 如果ADC當前的取樣通道號和要取樣的通道相同,就可以跳過第2.3.4.5.6.7直接啟動ADC取樣
  9. 啟動ADC取樣,設定Start配置暫存器LSADC_CTRL7的[31:0]位,寫入任意值就可以啟動ADC取樣,比如寫入1
  10. 最後要使能ADC取樣中斷,取樣完成後發出中斷,將中斷使能暫存器LSADC_CTRL4的[0]位置1

以上的ADC取樣操作可以用簡單的方法,只需第2.3.4.5.6.9.10步即可,如果只使用單通道取樣,只需要將這幾步操作放到ADC初始化操作中執行一次就可以,不用每次開始ADC取樣都設定。至於為什麼比較麻煩,是為了應對多路取樣時,有的通道取樣時間間隔比較小,有的通道取樣時間間隔比較大,造成的重複無意義的操作。

舉例說明:ADC要取樣的是光照、溫度資料,在取樣時間間隔不多的時候,比如光敏一秒一次,溫度三秒一次,這樣的情況是沒有什麼差別的,但是如果時間間隔差的很多,比如光敏一秒一次,溫度30秒一次,這樣的情況,在兩次溫度取樣間隔內的30秒,光敏要取樣30次,就要初始化30次,這是沒有必要的。所以就需要加上第1步的判斷邏輯,如果需要取樣的通道和上次取樣的通道是同一個通道,就免去了重複初始化同一個通道的操作,減輕處理負擔。

ADC中斷處理函式:

在中斷髮生時需要做的工作:

  1. 逐個判斷各通道是否有效,也可以獲取配置暫存器LSADC_CTRL0的[11:8]位來確定當前取樣通道。
    因為使用的是單個通道逐個取樣的方法,所以同一時刻只有一個通道在工作,通過在中斷函式中檢測哪個通道被使能可以得到是由哪個通道取樣發生的中斷。
  2. 檢查中斷狀態暫存器,判斷相應通道的掃描值是否有效
    檢查中斷狀態暫存器LSADC_CTRL5的[3:0]位是否被置1,置1則相應通道的掃描值有效,否則無效。
  3. 如果中斷狀態有效,就可以讀取ADC取樣值
    直接讀取資料保持暫存器LSADC_CTRL3:
    [7:0] 通道A掃描值
    [15:8] 通道B掃描值
    [23:16] 通道C掃描值
    [31:24] 通道D掃描值
  4. 清除中斷狀態標誌
    設定中斷清除暫存器LSADC_CTRL6的[3:0]位,將相應的位置1,清除相應通道的中斷
  5. 需要新增保險機制,在中斷髮生後即第1步之後,如果2、3步判斷失敗,就沒法進行4步的清中斷,這將導致ADC取樣卡死(不取樣也不執行中斷)
    此時的解決方法就是復位ADC,但是這樣做有點粗暴,比較好的方法還是避免出現這種卡死現象,比如新增第5步的保險機制,即判斷中斷都沒有執行時就清除4步暫存器中的對應通道中斷,或者清除所有通道中斷。

之後就是對獲取到的ADC取樣值進行處理了,略。

總結

至此,ADC通過單次取樣的方式對多通道取樣的方法介紹完畢,通過這種方法就能通過單次取樣的方式對多個通道的資料進行輪流取樣了,取樣獲取到的資料是在前邊設定的取樣精度範圍內,根據實際需要進行處理。有必要提醒下,實時取樣得到的資料會存在一些漂移,可以通過硬體濾波使資料穩定,或者在軟體中新增濾波演算法,對取樣得到的資料進行濾波處理。如果朋友們有更好的實現方法,還請指教一二,歡迎相互交流心得。

附:資料手冊上的ADC相關配置暫存器截圖




附:ADC取樣支援連續掃描處理

連續掃描處理過程在驗證時沒有得到想要的效果,在這裡不便多說,下面僅列出文件中連續掃描處理流程參考。


Over!

相關文章