一、踩坑過(guò)程
最近用STM32F334做數(shù)字電源,用到了高速ADC采集電壓電流。設(shè)計(jì)的參考電壓VREF為3.3V,輸入信號(hào)經(jīng)運(yùn)放跟隨后直接接入單片機(jī)的采樣通道。一開(kāi)始測(cè)試一切正常,但隨著輸入信號(hào)增加到2.5V左右,采集到的電壓值突然嚴(yán)重偏大(比如實(shí)際2.5V,ADC采集到的電壓為2.6V)。
首先排除軟件問(wèn)題,因?yàn)殡妷狠^低時(shí)采集到的數(shù)據(jù)一切正常。然后檢查硬件問(wèn)題,確認(rèn)輸入信號(hào)正常,確認(rèn)參考電壓正常,甚至排除了通道間相互干擾的可能性,最終問(wèn)題依舊。也懷疑過(guò)單片機(jī)自身的缺陷,但根據(jù)多年的踩坑經(jīng)驗(yàn),大概率還是自己的硬件設(shè)計(jì)或者軟件有不完善的地方。
對(duì)比以往的經(jīng)驗(yàn),所用到的ADC的采樣率都很低(基本上小于1kHz),而這次采樣率很高(達(dá)到300kHz)。因此初步懷疑,這次和以往的不同應(yīng)該有什么沒(méi)注意到的問(wèn)題。由于需要快速采樣,本次的ADC時(shí)鐘到達(dá)72MHz,采樣時(shí)間設(shè)為了最小1.5個(gè)周期,單次采樣時(shí)間0.149us左右。配置代碼如下
ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable; //單次觸發(fā)模式 ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_7; //HRTIM_ADCTRG1 event ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_RisingEdge; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable; ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable; ADC_InitStructure.ADC_NbrOfRegChannel = 4; ADC_Init(ADC1, &ADC_InitStructure); /* ADC1 regular channel configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_1Cycles5); //VISENS ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 2, ADC_SampleTime_1Cycles5); //IOSENS ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 3, ADC_SampleTime_1Cycles5); //VOSENS1 ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 4, ADC_SampleTime_1Cycles5); //VOSENS2
懷疑采樣時(shí)間太快,導(dǎo)致采集出錯(cuò),因此將采樣時(shí)間設(shè)大。設(shè)大后有明顯效果,采集到的值誤差變小,基本判定此處有玄機(jī)。于是仔細(xì)看了下手冊(cè)關(guān)于采樣時(shí)間的的描述
描述中明確提到,需要有足夠的采樣時(shí)間,確保輸入信號(hào)對(duì)內(nèi)嵌的保持電容充電并達(dá)到穩(wěn)定狀態(tài)。之后把采樣時(shí)間設(shè)置到最大,采樣的結(jié)果好了很多,但卻沒(méi)有完全解決問(wèn)題。明顯這已經(jīng)不能真正解決問(wèn)題了,因?yàn)椴蓸訒r(shí)間已經(jīng)超出我能接受的范圍。同時(shí)還有一個(gè)疑惑,如果充電時(shí)間太短導(dǎo)致電壓未達(dá)到實(shí)際值,采樣結(jié)果應(yīng)該偏小才對(duì),為啥會(huì)偏大呢?看來(lái)是有必要把ADC的相關(guān)問(wèn)題系統(tǒng)徹底的研究一下了。首先應(yīng)該深入了解下單片機(jī)內(nèi)ADC的基本原理,在網(wǎng)上找到了一篇文章https://blog.csdn.net/Zhuo3364/article/details/142112282,看完后才真正解開(kāi)了我的疑惑。問(wèn)題就出在輸入信號(hào)的處理上。由于我直接運(yùn)放跟隨后接入ADC,在低速采樣時(shí)有足夠時(shí)間來(lái)穩(wěn)定電壓,所以不會(huì)有問(wèn)題。但在高速時(shí),采樣開(kāi)關(guān)開(kāi)啟的瞬間,放大器會(huì)產(chǎn)生尖峰。又由于采集時(shí)間很短,尖峰還未消除,采集開(kāi)關(guān)已經(jīng)關(guān)閉,因此實(shí)際采樣到的值會(huì)偏大。至此問(wèn)題算是真的找到了,下面將ADC采樣電路的設(shè)計(jì)要點(diǎn)總結(jié)一下。
二、ADC設(shè)計(jì)要點(diǎn)總結(jié)
1、基準(zhǔn)源的設(shè)計(jì)
首先基準(zhǔn)電壓肯定要穩(wěn),而且應(yīng)該要有一定的驅(qū)動(dòng)能力。有一篇關(guān)于基準(zhǔn)的文章https://www.bilibili.com/read/cv35121342/值得仔細(xì)研讀。
2、輸入信號(hào)的設(shè)計(jì)
輸入信號(hào)為什么要處理
關(guān)于輸入信號(hào),很多新手都會(huì)犯一個(gè)錯(cuò)誤,就是直接把電阻分壓的信號(hào)接入ADC采樣,如下圖示意。為什么說(shuō)這是個(gè)錯(cuò)誤呢,經(jīng)歷過(guò)的人就知道這樣采樣得到的值也會(huì)有偏差,嚴(yán)重時(shí)跟設(shè)計(jì)完全不符。
這個(gè)問(wèn)題在于,ADC本身有一定的輸入阻抗,但阻抗并不高,有些甚至只有幾kΩ。這樣直接接入信號(hào),ADC的輸入阻抗就會(huì)起到分壓的作用。如下圖,ADC的輸入阻抗Rz和R2并聯(lián)后再和R1分壓,因此實(shí)際分壓比就和設(shè)計(jì)的完全不同了,采樣到的值自然會(huì)和設(shè)計(jì)值差別很大。所以輸入信號(hào)應(yīng)該要做適當(dāng)?shù)奶幚怼?/p>
常規(guī)的處理,就是輸入信號(hào)加個(gè)跟隨器,因?yàn)榉糯笃鞯妮斎胱杩箍梢哉J(rèn)為是無(wú)窮大的,所以不存在上述分壓的問(wèn)題。這基本上可以滿(mǎn)足絕大部分低速采樣的需求,但對(duì)于高速采樣,只跟隨不濾波也會(huì)有問(wèn)題,這也是本次踩坑的點(diǎn)所在。
找了一個(gè)專(zhuān)用的ADC手測(cè)仔細(xì)研究了下,里面重點(diǎn)就強(qiáng)調(diào)了輸入信號(hào)抗混疊的處理。其實(shí)就是對(duì)輸入信號(hào)進(jìn)行低通濾波。
下面這張圖片也很好的顯示了輸入信號(hào)加RC濾波和不加的區(qū)別,這也是為什么我這次踩坑的原因。從不加RC的曲線可以看到,采樣瞬間放大器輸出信號(hào)產(chǎn)生了一個(gè)尖峰,如果采樣周期很短,尖峰還未消除,就完成了采樣,那么采樣到的值肯定偏大。而加了RC的曲線則是平穩(wěn)上升到實(shí)際的值。
三、反思 很多時(shí)候我們以為自己懂了,其實(shí)沒(méi)懂,只是湊巧沒(méi)出問(wèn)題而已。知其然后還是應(yīng)該要知其所以然,面對(duì)問(wèn)題方能處變不驚,游刃有余。
-
adc
+關(guān)注
關(guān)注
98文章
6495瀏覽量
544448 -
STM32
+關(guān)注
關(guān)注
2270文章
10895瀏覽量
355717
原文標(biāo)題:ADC高速采樣電路設(shè)計(jì)詳解:STM32 踩坑?
文章出處:【微信號(hào):zfdzszy,微信公眾號(hào):張飛電子實(shí)戰(zhàn)營(yíng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論