nRF52832開發日誌--SAADC調試

今天各類事情比較多.......技術活時間略少,就搞了這一項~html

52832的ADC和以前51822系列仍是有蠻大差異的:
一、支持差分輸入方式,測量結果爲兩輸入端口電壓差的轉換的有符號數值,這個功能對於啥橋式傳感器的數據採集真是太爽了,能夠省一個電平平移放大電路
二、原始分辨率最高提高到12位,14位那個過採樣方式實現的,使用限制不少,不能掃描,還不如本身軟件解決要多少位有多少位。
三、新增「通道」概念,每一個通道能夠選定使用的+-信號源,轉換是以通道爲個體進行的,若是使能多個通道,則一次觸發完成所有通道的掃描轉換。
四、自帶EasyDMA,能夠直接把數據打到RAM內,但不能像STM32那樣支持循環傳輸,復位指針只能靠手動
五、取消了外部電壓參考輸入,這個其實有點蛋疼,在測量端供電和MCU供電之間存在變更狀況下可能會引入偏差,對於低頻信號,能夠用軟件進行補償,但也還有點蛋疼
六、能夠自主配置採樣時間,端口負載電阻之類參數
NRF52832開發日誌——SAADC調試

NRF52832開發日誌——SAADC調試
先上調試經過的代碼,這裏實現了5個通道的轉換,其中兩個差分通道,三個單端通道,以手動方式觸發,在線程中每100mS觸發一次,數據保存在m_buffer_pool數組中。
NRF52832開發日誌——SAADC調試
 
這幾點關注:
一、官方庫挺不錯了,提供了一個默認的端口配置的宏定義,很方便,然而實際上仍是蠻多東西須要修改的,但這個方法挺能夠借鑑
NRF52832開發日誌——SAADC調試
因而我也照着醬紫本身定義了兩種我經常使用的端口配置的方式,代碼能夠少很多了。這裏MCU我用供電是1.8V,因此1/3的增益就夠完成全量程範圍的數據的轉換了。
NRF52832開發日誌——SAADC調試

二、添加SAADC相關庫文件時候,這個文件記得也要添加,在./nrf_driver/hal/路徑裏面
NRF52832開發日誌——SAADC調試

三、配置好正式開始使用ADC模塊時候這裏須要注意下:
nrf_drv_saadc_buffer_convert()
這個函數實際是用來配置EasyDMA用的,也就是指定打到內存的位置和限制,但並不會開啓轉換。而且EasyDMA的指針是雙buffer形式的,能夠在前一個在使用的狀況下直接更新。
不過這裏的size這個參量的說明,Buffer size in words,看的有點暈吖,以字爲單位的大小??每次轉換結果都是半字大小,以字爲單位,掃描通道數目必須是偶數啦?並且也不能表明轉換次數的單位啊。若是是以字方式存放,那就是個廢話,這裏填的就應該是項數的2倍,可是例程裏面填的又是5........懶得看源碼了,反正我就直接填了個數組項數,每次傳輸完都會復位指針,也不至於溢出了。先就醬紫吧。
 
nrf_drv_saadc_sample_convert()
這個函數嘛,block方式的轉換,反正我是不會用的,浪費CPU時間浪費電
 
nrf_drv_saadc_sample()
這個就是正經開啓一次轉換的函數了。轉換完成後,會自動在中斷程序裏面調用初始化時候配置的回調函數,而且會獲得相關中斷的事件的信息。
NRF52832開發日誌——SAADC調試


ADC這塊總的來說仍是提高蠻大,不過和我但願的仍是有蠻大差距。最重要的,即便使用TIMER+PPI觸發,結合EasyDMA來傳輸數據,依舊存在一個缺陷,不能循環方式緩存,致使最終仍是須要CPU的參與來維持正常的轉換,必定程度上會減小CPU睡眠時間比例和持續長度。並且,使用庫函數彷佛並無辦法關掉ADC的中斷,初始化的event_handler必須提供,且每次轉換完成都會產生中斷,勢必喚醒CPU。這樣的話,就致使使CPU在ADC連續採集一段時間以後,再批處理數據不太好實現了。
對於此,一種方案就是本身繞過庫函數本身造輪子,編寫相關代碼,也是能夠實現得了的。另外一種方式,若是採集頻率高於CPU處理頻率惟一目的是更好進行軟件濾波減小偏差,也能夠經過提升外圍硬件的濾波性能,取代軟件濾波,原先批處理時候才進行採樣轉換,在同一個時間點屢次採樣減小此次時間點的偏差,而軟件濾波就徹底由硬件代勞了。
相關文章
相關標籤/搜索