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