一、踩坑過程
最近用STM32F334做數字電源,用到了高速ADC采集電壓電流。設計的參考電壓VREF為3.3V,輸入信號經運放跟隨后直接接入單片機的采樣通道。一開始測試一切正常,但隨著輸入信號增加到2.5V左右,采集到的電壓值突然嚴重偏大(比如實際2.5V,ADC采集到的電壓為2.6V)。
首先排除軟件問題,因為電壓較低時采集到的數據一切正常。然后檢查硬件問題,確認輸入信號正常,確認參考電壓正常,甚至排除了通道間相互干擾的可能性,最終問題依舊。也懷疑過單片機自身的缺陷,但根據多年的踩坑經驗,大概率還是自己的硬件設計或者軟件有不完善的地方。
對比以往的經驗,所用到的ADC的采樣率都很低(基本上小于1kHz),而這次采樣率很高(達到300kHz)。因此初步懷疑,這次和以往的不同應該有什么沒注意到的問題。由于需要快速采樣,本次的ADC時鐘到達72MHz,采樣時間設為了最小1.5個周期,單次采樣時間0.149us左右。配置代碼如下
ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable; //單次觸發模式 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
懷疑采樣時間太快,導致采集出錯,因此將采樣時間設大。設大后有明顯效果,采集到的值誤差變小,基本判定此處有玄機。于是仔細看了下手冊關于采樣時間的的描述
描述中明確提到,需要有足夠的采樣時間,確保輸入信號對內嵌的保持電容充電并達到穩定狀態。之后把采樣時間設置到最大,采樣的結果好了很多,但卻沒有完全解決問題。明顯這已經不能真正解決問題了,因為采樣時間已經超出我能接受的范圍。同時還有一個疑惑,如果充電時間太短導致電壓未達到實際值,采樣結果應該偏小才對,為啥會偏大呢?看來是有必要把ADC的相關問題系統徹底的研究一下了。首先應該深入了解下單片機內ADC的基本原理,在網上找到了一篇文章https://blog.csdn.net/Zhuo3364/article/details/142112282,看完后才真正解開了我的疑惑。問題就出在輸入信號的處理上。由于我直接運放跟隨后接入ADC,在低速采樣時有足夠時間來穩定電壓,所以不會有問題。但在高速時,采樣開關開啟的瞬間,放大器會產生尖峰。又由于采集時間很短,尖峰還未消除,采集開關已經關閉,因此實際采樣到的值會偏大。至此問題算是真的找到了,下面將ADC采樣電路的設計要點總結一下。
二、ADC設計要點總結
1、基準源的設計
首先基準電壓肯定要穩,而且應該要有一定的驅動能力。有一篇關于基準的文章https://www.bilibili.com/read/cv35121342/值得仔細研讀。
2、輸入信號的設計
輸入信號為什么要處理
關于輸入信號,很多新手都會犯一個錯誤,就是直接把電阻分壓的信號接入ADC采樣,如下圖示意。為什么說這是個錯誤呢,經歷過的人就知道這樣采樣得到的值也會有偏差,嚴重時跟設計完全不符。
這個問題在于,ADC本身有一定的輸入阻抗,但阻抗并不高,有些甚至只有幾kΩ。這樣直接接入信號,ADC的輸入阻抗就會起到分壓的作用。如下圖,ADC的輸入阻抗Rz和R2并聯后再和R1分壓,因此實際分壓比就和設計的完全不同了,采樣到的值自然會和設計值差別很大。所以輸入信號應該要做適當的處理。
常規的處理,就是輸入信號加個跟隨器,因為放大器的輸入阻抗可以認為是無窮大的,所以不存在上述分壓的問題。這基本上可以滿足絕大部分低速采樣的需求,但對于高速采樣,只跟隨不濾波也會有問題,這也是本次踩坑的點所在。
找了一個專用的ADC手測仔細研究了下,里面重點就強調了輸入信號抗混疊的處理。其實就是對輸入信號進行低通濾波。
下面這張圖片也很好的顯示了輸入信號加RC濾波和不加的區別,這也是為什么我這次踩坑的原因。從不加RC的曲線可以看到,采樣瞬間放大器輸出信號產生了一個尖峰,如果采樣周期很短,尖峰還未消除,就完成了采樣,那么采樣到的值肯定偏大。而加了RC的曲線則是平穩上升到實際的值。
三、反思 很多時候我們以為自己懂了,其實沒懂,只是湊巧沒出問題而已。知其然后還是應該要知其所以然,面對問題方能處變不驚,游刃有余。
-
adc
+關注
關注
98文章
6498瀏覽量
544629 -
STM32
+關注
關注
2270文章
10900瀏覽量
355982
原文標題:ADC高速采樣電路設計詳解:STM32 踩坑?
文章出處:【微信號:zfdzszy,微信公眾號:張飛電子實戰營】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論