博客專欄

EEPW首頁(yè) > 博客 > ADC 采樣時(shí)間如何設(shè)置才是正確的?

ADC 采樣時(shí)間如何設(shè)置才是正確的?

發(fā)布人:魚鷹談單片機(jī) 時(shí)間:2021-10-21 來(lái)源:工程師 發(fā)布文章

在 DMA 傳輸 AD 導(dǎo)致數(shù)據(jù)錯(cuò)位時(shí)(啟停 DMA 導(dǎo)致傳輸通道錯(cuò)位),上網(wǎng)搜了一篇關(guān)于 ADC 使用相關(guān)的文章《關(guān)于STM32 ADC自校準(zhǔn)的個(gè)人理解》,感覺(jué)很不錯(cuò),分享給各位道友學(xué)習(xí)一下。

強(qiáng)烈大家看一看文中提到的 pdf 資料,將對(duì) ADC 使用有更好的理解(這里面有介紹采樣時(shí)間和阻抗有關(guān),不是隨便設(shè)置的,以前魚鷹都是隨便設(shè)置的,根本沒(méi)有考慮那么多,所以,理論知識(shí)還是非常重要的)。另外為了方便各位道友,魚鷹把文中資料放到公眾號(hào)里面了,回復(fù) ADC 關(guān)鍵字即可獲取。

------以下是正文------

今天嘗試了下ADC的自校準(zhǔn),發(fā)現(xiàn)中文參考手冊(cè)里對(duì)校準(zhǔn)和上電的關(guān)系完全翻譯錯(cuò)了。E文最新版里是這么說(shuō)的

1.jpg

也就是開始校準(zhǔn)的時(shí)候已經(jīng)上電并且是在上電至少2個(gè)ADC時(shí)鐘周期之后才開始校準(zhǔn)。

關(guān)于校準(zhǔn)碼,根據(jù)說(shuō)明,會(huì)在校準(zhǔn)結(jié)束后存入ADC_DR寄存器。

根據(jù)我的測(cè)試,不開啟校準(zhǔn)時(shí),ADC轉(zhuǎn)換的結(jié)果是:接地轉(zhuǎn)換值為0,接VCC轉(zhuǎn)換值為4093.

開啟校準(zhǔn)再轉(zhuǎn)換時(shí):校準(zhǔn)碼為60,接地轉(zhuǎn)換原始值為0,接VCC轉(zhuǎn)換原始值為4095.

兩個(gè)情況所得結(jié)果差別很小,不知60是做什么用的。

去ST搜了下文檔,在一份概覽介紹里找到這么一段話

2.jpg

依據(jù)這段話,說(shuō)明ADC的自校準(zhǔn)是一個(gè)無(wú)需外界干預(yù)的過(guò)程,最后校準(zhǔn)碼并不需要使用者來(lái)處理。而且根據(jù)參考手冊(cè)的說(shuō)明,這個(gè)校準(zhǔn)碼是用來(lái)消除每個(gè)電容上產(chǎn)生的誤差,這樣就更不可能讓用戶依據(jù)這個(gè)值去消除了,所以個(gè)人認(rèn)為這個(gè)校準(zhǔn)碼對(duì)使用者沒(méi)什么用處,只要校準(zhǔn)完畢就OK了,中間的所有STM32都已經(jīng)做好了。如果理解有誤,歡迎指正。

附件是找文檔的過(guò)程中發(fā)現(xiàn)的一份ADC通講,比較適合我這種初學(xué)者對(duì)ADC功能進(jìn)行梳理總結(jié)用。

最后發(fā)句牢騷:GFW越來(lái)越操蛋了,國(guó)外技術(shù)論壇也TM封鎖這么多。

3.jpg STM32 的 ADC 模式及其應(yīng)用 CH AN3116.pdf

-------------------------------------

前幾天發(fā)過(guò)一篇帖子,叫:關(guān)于STM32 ADC自校準(zhǔn)的個(gè)人理解(即上面的)文章大體說(shuō)的是自校準(zhǔn)前要先將ADON位置1,之后再校準(zhǔn)。

本以為徹底的了解了自校準(zhǔn)的過(guò)程,但是昨天晚上無(wú)意間看到了一個(gè)函數(shù)說(shuō)明,不禁愁云又起,

4.jpg

按照這個(gè)說(shuō)明,使用這個(gè)自校準(zhǔn)函數(shù)前應(yīng)當(dāng)使ADC處于掉電狀態(tài)下,但是這樣似乎就與英文的參考手冊(cè)矛盾了。經(jīng)過(guò)探查,方才知道ST的參考手冊(cè)敘述文筆和結(jié)構(gòu)編排是TM有多爛!

依據(jù)手冊(cè)介紹,我將STM32的ADC分為三種狀態(tài):掉電狀態(tài)、上電狀態(tài)、工作狀態(tài)。

當(dāng)芯片啟動(dòng)運(yùn)行時(shí),ADC處于掉電狀態(tài)。當(dāng)?shù)谝淮螌DON位設(shè)定為1時(shí),ADC從掉電狀態(tài)進(jìn)入上電狀態(tài),也就是手冊(cè)里說(shuō)的“從掉電狀態(tài)下喚醒”,這時(shí)ADON位已經(jīng)為1。當(dāng)我們?cè)俅卧O(shè)定ADON位等于1時(shí),這時(shí)ADC會(huì)按照此時(shí)的ADC_CR1、ADC_CR2等寄存器的設(shè)置開始轉(zhuǎn)換工作,也就進(jìn)入了工作狀態(tài)。這也就是下圖紅框中話的含義。

5.jpg

接下來(lái)再分析HAL_ADCEx_Calibration_Start這個(gè)函數(shù),通過(guò)一層一層查找,方知這個(gè)函數(shù)之所以要放在HAL_ADC_Start()之前或HAL_ADC_Stop()之后是因?yàn)檫@個(gè)函數(shù)本身就會(huì)執(zhí)行將ADON置1這么一條語(yǔ)句。

也就是,執(zhí)行自校準(zhǔn)時(shí)ADC必須處于前面所說(shuō)的上電狀態(tài),如果ADC在工作狀態(tài)下——正在轉(zhuǎn)換或者進(jìn)行過(guò)轉(zhuǎn)換——?jiǎng)t要將ADON位清零,使ADC關(guān)閉進(jìn)入掉電狀態(tài)下,之后再將ADON置1,進(jìn)入上電狀態(tài),之后再校準(zhǔn),再之后該注入組的注入該規(guī)則組的SCAN。也就是函數(shù)的使用說(shuō)明和英文版的參考手冊(cè)并不矛盾,而是TMD ST根本就沒(méi)把這個(gè)說(shuō)清楚!

接下來(lái)在順便說(shuō)一下為什么當(dāng)ADON=1時(shí)再次設(shè)定置ADON位為1會(huì)進(jìn)入工作狀態(tài)(知道的就不必往下看了)

原因就是這句話

6.jpg

看過(guò)正點(diǎn)原子教程的應(yīng)該都有這個(gè)印象,在ADC轉(zhuǎn)換實(shí)驗(yàn)中原子將ADC_CR2的EXTSEL位設(shè)定為111,將EXTTRIG位設(shè)定為1,之后通過(guò)SWSTART位置1的方式來(lái)啟動(dòng)轉(zhuǎn)換。其實(shí)根本不用這么復(fù)雜,只需要將ADON再置1就可以啟動(dòng)轉(zhuǎn)換,無(wú)論這個(gè)轉(zhuǎn)換是單個(gè)通道還是還是通道組,效果與軟件觸發(fā)方式完全一樣。

接下來(lái)再說(shuō)說(shuō)規(guī)則組的連續(xù)轉(zhuǎn)換。

昨天晚上一直在嘗試這個(gè),想在中斷中讀取多個(gè)通道的值,一直不成功,只能得到最后一個(gè)被轉(zhuǎn)換通道的值,現(xiàn)在才發(fā)現(xiàn),又TM被ST的參考手冊(cè)坑!了!

關(guān)于連續(xù)轉(zhuǎn)換模式,手冊(cè)里是這么說(shuō)的,

7.jpg

一個(gè)規(guī)則通道被轉(zhuǎn)換完畢后EOC會(huì)被置位同時(shí)進(jìn)入中斷。

但是,在ADC中斷章節(jié)又是這么說(shuō)的,

8.jpg

一個(gè)通道組轉(zhuǎn)換完畢后才進(jìn)入中斷,而非單個(gè)通道。這也就是說(shuō),當(dāng)規(guī)則組采用中斷方式時(shí)ADC_DR里必定放置的是最后被轉(zhuǎn)換的那個(gè)通道的值。那么是不是上面那個(gè)連續(xù)轉(zhuǎn)換模式的說(shuō)明寫錯(cuò)了。又前后翻了手冊(cè)n遍發(fā)現(xiàn)不是。

9.jpg

其實(shí)這里的單次轉(zhuǎn)換模式和連續(xù)轉(zhuǎn)換模式講的都是針對(duì)1個(gè)通道的,而規(guī)則組多通道的轉(zhuǎn)換在手冊(cè)里其實(shí)是叫掃描模式(還有另外一個(gè)間斷模式),然后掃描模式里再按照CONT位的不同分為單次轉(zhuǎn)換模式和連續(xù)轉(zhuǎn)換模式。

也就是,文檔里的目錄層次結(jié)構(gòu)如果是這樣會(huì)更利于閱讀和理解。

10.jpg

而不是像攤大餅一樣全部放在同一級(jí)目錄里。

現(xiàn)在我也才明白,為什么AN3116文檔中那么強(qiáng)烈的建議規(guī)則通道組連續(xù)轉(zhuǎn)換要使用DMA方式,因?yàn)橛弥袛嗑褪前紫拱。。。。?/p>

另外,中文參考手冊(cè)里關(guān)于掃描模式使用DMA的傳輸時(shí)間寫錯(cuò)了

11.jpg

正確的應(yīng)該是

12.jpg

只要ADC_DR更新就會(huì)進(jìn)行傳遞。而ADC_DR會(huì)在每個(gè)通道轉(zhuǎn)換完后就更新。同時(shí),這里也明確指出,使用掃描模式必須使用DMA。

有句話叫:一流的翻譯能把二流的文章翻譯成一流的作品,二流的翻譯能把一流的作品翻譯成二流的文章,二流的文章如果碰到二流的翻譯,只能成為三流的shit。在我看來(lái)ST屬于最后這一種,尤其是 be set翻譯成被設(shè)置,簡(jiǎn)直是梗到家了。

之前看著數(shù)據(jù)手冊(cè)自學(xué)AVR時(shí)順風(fēng)順?biāo)?,錯(cuò)誤和編排不當(dāng)非常少,雖說(shuō)STM32相比之下更復(fù)雜、產(chǎn)品線更長(zhǎng)、頁(yè)數(shù)更多但是參考手冊(cè)里這么多明顯的敘述錯(cuò)誤和槽糕的層次結(jié)構(gòu)就我這個(gè)門外漢也能看出來(lái)啊,這么多錯(cuò)誤和含混不清簡(jiǎn)直就是殘害生命、初學(xué)者的噩夢(mèng)啊,撞墻的心都有了。那STM8和STVD更是一塊爛豆腐,第一次見ERRATA能寫那么長(zhǎng)的?,F(xiàn)在看ST的參考手冊(cè)無(wú)論中英文都有一種哈利波特找魂器的感覺(jué),要上下來(lái)回翻閱n次,然后將關(guān)聯(lián)點(diǎn)組織在一起,之后再去進(jìn)行邏輯分析判斷正誤,太累心了?。。T為中國(guó)市場(chǎng)砸這么多錢就不能好好寫寫自己的文檔嗎,重新編排一下能費(fèi)幾個(gè)錢。中文版的文檔5年都沒(méi)改過(guò)了,翻譯都死光了嗎。各位前輩都是怎么過(guò)來(lái)的?難道因?yàn)橐恢痹谟煤瘮?shù)庫(kù)沒(méi)關(guān)注過(guò)底層這些?

最后分享一個(gè)AN3116文檔中提到的范例包,里面有SCAN模式DMA傳輸?shù)姆独?。結(jié)合關(guān)于STM32 ADC自校準(zhǔn)的個(gè)人理解中的AN3116文檔一起使用“更有利于鈣質(zhì)吸收”。

13.jpg

STM32 的ADC 模式及其應(yīng)用 范例.zip

*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。



關(guān)鍵詞: 單片機(jī)

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉