最近我們在開發乙個專案時,用到了mcu自帶的adc,在除錯過程中發現通道之間村在相互干擾的問題。以前其實也用過好幾次,但要求都不高所以沒有太關注,此次因為物理量的量程較大,所以看到了變化。
首先來說明一下此次的軟硬體環境,mcu採用的是stm32f103vet6,adc採用自帶的adc1,使用通道6和7。在軟體方面,我們使用版本為1.4的hal庫,使用dma方式採集。
接下來,我們描述一下現象。在下邊有兩幅截圖,左邊是只給第二路輸入為100%時輸入顯示99.962%。而右邊的圖是在第一路輸入也新增100%輸入時顯示的結果,第一路輸入為99.9643%而第二路輸入變成了100.0418%。
這個影響在只需要顯示數值時,沒有特別的要求可以忽略,但在控制中有時可能會引起不必要的波動。正好我們此次要求較高,但因週期很急,硬體採用了原來專案中類式的電路,就出現了這一問題。修改硬體肯定是來不及的,只能是想其他辦法盡量修正。
我們首先收集資料分析,在一路輸入為0的情況下,另一路輸入0-100%的輸入觀察第一路的訊號變化。分別在55.5個時鐘週期和239.5個時鐘週期的取樣頻率下,獲得乙個通道對另乙個通道的影響資料,如下圖所示:
由以上兩幅圖我們可以發現,取樣週期越長通道間的相互干擾就越小,反之則越大。乙個同到的輸入訊號越強烈則在另乙個通道上在成的干擾訊號越強烈,反之則越小。如上圖所示,我們對資料作曲線擬合,我們發現最多3次多項式姐可以很好的近似表示他們的關係。
有了上述對通道間相互干擾的資料關係的認識,一般來說本通道的輸入與輸出間應該是乙個線性關係,但實際上總會有寫偏差,我們測得資料的實際情況同樣作曲線擬合。我們發現資料劇本是符合線性關係的,但為了更精確我們也可採用高次多項式,一般三次多項式完全就可滿足,如下圖所示:
經過上面的分析我們以2個通道為例來獲得最終結果。兩個同道的輸入設為:[x1,x2],兩個通道我們想得到的輸出為:[y1,y2],而兩輸入對y1的影響為:[a1,b1],兩個輸入對y2的影響為:[a2,b2]。則其函式關係可表示為:y1=a1*x1+b1*x2和y2=a2*x2+b2*x1,其中各變數及係數均為向量,根據所想要採取的解析函式確定。
在本次專案中,我們採用三次多項式函式來擬合,所以根據三次多項式來確定上述量及解析目標量。
解析完成後,我們再做測試,量通道件的相互干擾可以減少到1%以下,想要完全消除有困難,畢竟只是軟體處理。
最終的解決辦法是在硬體電路上消除這干擾,如在要求較高時,盡量不要採用mcu自帶的adc和dac來做模擬量的輸入輸出。
STM32的ADC輸入通道配置
stm32中最多有3個adc模組,每個模組對應的通道不完全重疊。下圖是stm32f103cde資料手冊中的總框圖的左下角,圖中可以看出有8個外部adc管腳分別接到了3個adc模組,有8個外部adc管腳只分別接到了2個adc模組,還有5個外部adc管腳只接到了adc3模組,這樣總共是21個通道。下表是...
STM32的ADC多通道取樣
用hal庫寫的好處就是可以不用進行配置io口發步驟.有良好的相容性,更換晶元的時候改 也簡單.rcc我在左側的 裡不用勾選,因為我用的是內部時鐘,不用選.下面是我配置的時鐘 之所以是48m,還要分頻呢.下面直接上 其他的都預設.然後按alt p,設定下工程,格式如下 這個可以把 格式更模組化。建議選...
STM32多通道ADC操作
自 今天嘗試了下stm32的adc取樣,並利用dma實現取樣資料的直接搬運儲存,這樣就不用cpu去參與操作了。找了不少例子參考,adc和dma的設定了解了個大概,並直接利用開發板來做一些實驗來驗證相關的操作,保證自己對各部分設定的理解。我這裡用了3路的adc通道,1路外部變阻器輸入,另外兩路是內部的...