ADC 采樣時間如何設置才是正確的?
在 DMA 傳輸 AD 導致數據錯位時(啟停 DMA 導致傳輸通道錯位),上網搜了一篇關于 ADC 使用相關的文章《關于STM32 ADC自校準的個人理解》,感覺很不錯,分享給各位道友學習一下。
強烈大家看一看文中提到的 pdf 資料,將對 ADC 使用有更好的理解(這里面有介紹采樣時間和阻抗有關,不是隨便設置的,以前魚鷹都是隨便設置的,根本沒有考慮那么多,所以,理論知識還是非常重要的)。另外為了方便各位道友,魚鷹把文中資料放到公眾號里面了,回復 ADC 關鍵字即可獲取。
------以下是正文------
今天嘗試了下ADC的自校準,發現中文參考手冊里對校準和上電的關系完全翻譯錯了。E文最新版里是這么說的
也就是開始校準的時候已經上電并且是在上電至少2個ADC時鐘周期之后才開始校準。
關于校準碼,根據說明,會在校準結束后存入ADC_DR寄存器。
根據我的測試,不開啟校準時,ADC轉換的結果是:接地轉換值為0,接VCC轉換值為4093.
開啟校準再轉換時:校準碼為60,接地轉換原始值為0,接VCC轉換原始值為4095.
兩個情況所得結果差別很小,不知60是做什么用的。
去ST搜了下文檔,在一份概覽介紹里找到這么一段話
依據這段話,說明ADC的自校準是一個無需外界干預的過程,最后校準碼并不需要使用者來處理。而且根據參考手冊的說明,這個校準碼是用來消除每個電容上產生的誤差,這樣就更不可能讓用戶依據這個值去消除了,所以個人認為這個校準碼對使用者沒什么用處,只要校準完畢就OK了,中間的所有STM32都已經做好了。如果理解有誤,歡迎指正。
附件是找文檔的過程中發現的一份ADC通講,比較適合我這種初學者對ADC功能進行梳理總結用。
最后發句牢騷:GFW越來越操蛋了,國外技術論壇也TM封鎖這么多。
STM32 的 ADC 模式及其應用 CH AN3116.pdf
-------------------------------------
前幾天發過一篇帖子,叫:關于STM32 ADC自校準的個人理解(即上面的)文章大體說的是自校準前要先將ADON位置1,之后再校準。
本以為徹底的了解了自校準的過程,但是昨天晚上無意間看到了一個函數說明,不禁愁云又起,
按照這個說明,使用這個自校準函數前應當使ADC處于掉電狀態下,但是這樣似乎就與英文的參考手冊矛盾了。經過探查,方才知道ST的參考手冊敘述文筆和結構編排是TM有多爛!
依據手冊介紹,我將STM32的ADC分為三種狀態:掉電狀態、上電狀態、工作狀態。
當芯片啟動運行時,ADC處于掉電狀態。當第一次將ADON位設定為1時,ADC從掉電狀態進入上電狀態,也就是手冊里說的“從掉電狀態下喚醒”,這時ADON位已經為1。當我們再次設定ADON位等于1時,這時ADC會按照此時的ADC_CR1、ADC_CR2等寄存器的設置開始轉換工作,也就進入了工作狀態。這也就是下圖紅框中話的含義。
接下來再分析HAL_ADCEx_Calibration_Start這個函數,通過一層一層查找,方知這個函數之所以要放在HAL_ADC_Start()之前或HAL_ADC_Stop()之后是因為這個函數本身就會執行將ADON置1這么一條語句。
也就是,執行自校準時ADC必須處于前面所說的上電狀態,如果ADC在工作狀態下——正在轉換或者進行過轉換——則要將ADON位清零,使ADC關閉進入掉電狀態下,之后再將ADON置1,進入上電狀態,之后再校準,再之后該注入組的注入該規則組的SCAN。也就是函數的使用說明和英文版的參考手冊并不矛盾,而是TMD ST根本就沒把這個說清楚!
接下來在順便說一下為什么當ADON=1時再次設定置ADON位為1會進入工作狀態(知道的就不必往下看了)
原因就是這句話
看過正點原子教程的應該都有這個印象,在ADC轉換實驗中原子將ADC_CR2的EXTSEL位設定為111,將EXTTRIG位設定為1,之后通過SWSTART位置1的方式來啟動轉換。其實根本不用這么復雜,只需要將ADON再置1就可以啟動轉換,無論這個轉換是單個通道還是還是通道組,效果與軟件觸發方式完全一樣。
接下來再說說規則組的連續轉換。
昨天晚上一直在嘗試這個,想在中斷中讀取多個通道的值,一直不成功,只能得到最后一個被轉換通道的值,現在才發現,又TM被ST的參考手冊坑!了!
關于連續轉換模式,手冊里是這么說的,
一個規則通道被轉換完畢后EOC會被置位同時進入中斷。
但是,在ADC中斷章節又是這么說的,
一個通道組轉換完畢后才進入中斷,而非單個通道。這也就是說,當規則組采用中斷方式時ADC_DR里必定放置的是最后被轉換的那個通道的值。那么是不是上面那個連續轉換模式的說明寫錯了。又前后翻了手冊n遍發現不是。
其實這里的單次轉換模式和連續轉換模式講的都是針對1個通道的,而規則組多通道的轉換在手冊里其實是叫掃描模式(還有另外一個間斷模式),然后掃描模式里再按照CONT位的不同分為單次轉換模式和連續轉換模式。
也就是,文檔里的目錄層次結構如果是這樣會更利于閱讀和理解。
而不是像攤大餅一樣全部放在同一級目錄里。
現在我也才明白,為什么AN3116文檔中那么強烈的建議規則通道組連續轉換要使用DMA方式,因為用中斷就是白瞎啊!!!!
另外,中文參考手冊里關于掃描模式使用DMA的傳輸時間寫錯了
正確的應該是
只要ADC_DR更新就會進行傳遞。而ADC_DR會在每個通道轉換完后就更新。同時,這里也明確指出,使用掃描模式必須使用DMA。
有句話叫:一流的翻譯能把二流的文章翻譯成一流的作品,二流的翻譯能把一流的作品翻譯成二流的文章,二流的文章如果碰到二流的翻譯,只能成為三流的shit。在我看來ST屬于最后這一種,尤其是 be set翻譯成被設置,簡直是梗到家了。
之前看著數據手冊自學AVR時順風順水,錯誤和編排不當非常少,雖說STM32相比之下更復雜、產品線更長、頁數更多但是參考手冊里這么多明顯的敘述錯誤和槽糕的層次結構就我這個門外漢也能看出來啊,這么多錯誤和含混不清簡直就是殘害生命、初學者的噩夢啊,撞墻的心都有了。那STM8和STVD更是一塊爛豆腐,第一次見ERRATA能寫那么長的。現在看ST的參考手冊無論中英文都有一種哈利波特找魂器的感覺,要上下來回翻閱n次,然后將關聯點組織在一起,之后再去進行邏輯分析判斷正誤,太累心了!!!ST為中國市場砸這么多錢就不能好好寫寫自己的文檔嗎,重新編排一下能費幾個錢。中文版的文檔5年都沒改過了,翻譯都死光了嗎。各位前輩都是怎么過來的?難道因為一直在用函數庫沒關注過底層這些?
最后分享一個AN3116文檔中提到的范例包,里面有SCAN模式DMA傳輸的范例。結合關于STM32 ADC自校準的個人理解中的AN3116文檔一起使用“更有利于鈣質吸收”。
STM32 的ADC 模式及其應用 范例.zip
*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。