<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

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

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

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

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

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

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

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

1.jpg

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

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

根據我的測試,不開(kāi)啟校準時(shí),ADC轉換的結果是:接地轉換值為0,接VCC轉換值為4093.

開(kāi)啟校準再轉換時(shí):校準碼為60,接地轉換原始值為0,接VCC轉換原始值為4095.

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

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

2.jpg

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

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

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

3.jpg STM32 的 ADC 模式及其應用 CH AN3116.pdf

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

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

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

4.jpg

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

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

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

5.jpg

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

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

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

原因就是這句話(huà)

6.jpg

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

接下來(lái)再說(shuō)說(shuō)規則組的連續轉換。

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

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

7.jpg

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

但是,在A(yíng)DC中斷章節又是這么說(shuō)的,

8.jpg

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

9.jpg

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

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

10.jpg

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

現在我也才明白,為什么AN3116文檔中那么強烈的建議規則通道組連續轉換要使用DMA方式,因為用中斷就是白瞎?。。。?!

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

11.jpg

正確的應該是

12.jpg

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

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

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

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

13.jpg

STM32 的ADC 模式及其應用 范例.zip

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



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

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>