nrf52832的saadc基本功能:
1、支持差分輸入方式,測量結果爲兩輸入端口電壓差的轉換的有符號數值,這個功能對於啥橋式傳感器的數據採集真是太爽了,可以省一個電平平移放大電路
2、原始分辨率最高提升到12位,14位那個過採樣方式實現的,使用限制很多,不能掃描,還不如自己軟件解決要多少位有多少位。
3、新增“通道”概念,每個通道可以選定使用的+-信號源,轉換是以通道爲個體進行的,如果使能多個通道,則一次觸發完成全部通道的掃描轉換。
4、自帶EasyDMA,可以直接把數據打到RAM內,但不能像STM32那樣支持循環傳輸,復位指針只能靠手動
5、取消了外部電壓參考輸入,這個其實有點蛋疼,在測量端供電和MCU供電之間存在變動情況下可能會引入誤差,對於低頻信號,可以用軟件進行補償,但也還有點蛋疼
6、可以自主配置採樣時間,端口負載電阻之類參數
大家上網查資料都應該知道,nrf52832各種各樣的例程代碼非常少,特別是帶操作系統,如freertos的例程少之又少。今天給大家分享兩個關於nrf52832的saadc的兩種用法。一種是DMA的方式,使用硬件內部的PPI映射,和定時器,可以實現固定的採樣頻率採集ADC值;還有一種是單次轉換ADC,使用定時器設置規定的採樣頻率;
官方提供的saadc例程是使用第一個方法(不帶操作系統的)。在實際應用中,這種方法可能不適用。
下面,我來介紹第一種方法的底層配置及應用
(1)saadc配置
如圖所示,1:配置單端通道輸入AIN0,關於這個配置,涉及到採樣增益,參考電壓選擇,過採樣選擇和差分/單端輸入選擇,後面的文章我會繼續更新講解,感興趣的話可以關注我,一起學習;2:提供saadc中斷回調函數,第一個形參表示對應的通道配置結構體,如果爲NULL,則表示默認使用一個回調函數,這裏也可以輸入channel_config;在多通道saadc中,這裏可以設定多個回調函數,後面我也會更新文章專門介紹;3:通道配置初始化;4:nrf52832採樣雙buffer緩存,當然你可以只用一個,這裏的意思當採樣滿SAMPLES_IN_BUFFER個數據後,觸發回調函數,然後在回調函數中處理數據;
(2)定時器和PPI配置
如圖所示,1:PPI初始化,PPI具體是什麼不需要去深究,只要學會如何使用他的api接口就可以了;2:定時器初始化配置及中斷函數的綁定;3:定時時間設置,單位爲ms,設置定時器爲比較模式,這裏我們關注最後一個形參,false表示定時中斷失能,true表示定時中斷失能,如果使用EsayDMA的PPI方式,就使用不到定時中斷函數,設置好定時時間後,會自動根據定時好的時間循環去採樣,設置的時間即爲採樣頻率,但是必須給出中斷函數,這裏的中斷函數就是timer_handler。4:獲取指定定時器比較事件的地址和saadc採樣任務;5:分配ppi通道給saadc採樣任務。
(3)採樣事件使能
(4)回調函數
好了,第一種方法的配置介紹這裏,這種方法在例程中都有。下面給大家介紹第二種,單次轉換+定時器的方法,以單通道爲例,上面詳細介紹了函數的作用,下面我就不具體介紹了。
(1)saadc初始化配置
這裏配置了一個差分輸入的saadc,單通道的話,這裏的SAMPLES_IN_BUFFER爲1
(2)定時器初始化
將ppi初始化及相關配置取消,將定時器中斷使能true。
(3)定時器中斷函數
表示定時器400ms後採樣1個點,觸發回調函數。SAMPLES_IN_BUFFER=1
(4)回調函數
好了,兩種方法都已經介紹完了,下次我會分享一篇關於多通道單次轉換的文章,希望大家持續關注,如果有什麼不對的地方,多多指教,謝謝