TMS320F2812內(nèi)部集成了ADC轉(zhuǎn)換模塊,該模塊具有如下的功能: 1.12位ADC核,內(nèi)置了雙采樣-保持器(S/H); 2.順序采樣模式或者同步采樣模式; 3.模擬輸入:0V~3V;(2812的AD不能輸入負(fù)壓,如果有負(fù)電平輸入,需要通過絕對(duì)值電路將負(fù)電平轉(zhuǎn)換為正電平之后再輸入到AD) 4.快速轉(zhuǎn)換時(shí)間運(yùn)行在25MHz,ADC時(shí)鐘,或12.5MSPS; 5.16通道,多路選擇輸入; 6.自動(dòng)序列化,在單一時(shí)間段內(nèi)最大能提供16個(gè)自動(dòng)A/D轉(zhuǎn)換,每個(gè)轉(zhuǎn)換可編程對(duì)16個(gè)輸入通道中的任何一個(gè)進(jìn)行選擇。 7.序列發(fā)生器可按2個(gè)獨(dú)立的8狀態(tài)序列發(fā)生器或1個(gè)16狀態(tài)序列發(fā)生器。 我們?cè)陧?xiàng)目實(shí)際研發(fā)過程中采用的AD采樣的硬件電路如下圖所示: ![]() 圖1為電流信號(hào)檢測(cè)與調(diào)理電路,電壓信號(hào)的檢測(cè)與調(diào)理電路與此相類似。從電流傳感器輸出的信號(hào)CT1首先經(jīng)過了由R1、C1組成的低通濾波電路,濾除高頻干擾信號(hào),然后通過U1構(gòu)成的電壓跟隨器,實(shí)現(xiàn)了電路前后兩級(jí)的隔離。由于2812的I/O口輸入電平必須低于3.3V,因此在芯片引腳的輸入前端加了一個(gè)穩(wěn)壓管Z1,使AD口輸入的電壓幅值不超過3V。 TMS320F2812雖然有12位精度,但在實(shí)際的使用過程中,我們發(fā)現(xiàn),ADC的轉(zhuǎn)換結(jié)果誤差較大,如果直接將此轉(zhuǎn)換結(jié)果用于控制回路,必然會(huì)降低控制精度,最大的轉(zhuǎn)換誤差可以達(dá)到9%。那么如何來提高AD采樣的精度呢,下面列出了幾種常見的方法: 1.硬件角度 (1)硬件濾波,濾除干擾信號(hào); (2)電路板布線時(shí)需要注意不要讓ADCINxx引腳運(yùn)行在靠近數(shù)字信號(hào)通路的地方,這樣能使耦合到ADC輸入端的數(shù)字信號(hào)開關(guān)噪聲大大降低; (3)采用適當(dāng)?shù)母綦x技術(shù),將ADC模塊電源引腳和數(shù)字電源隔離; (4)如果采樣電路部分是經(jīng)過多路開關(guān)切換的,可以在多路開關(guān)輸出上接下拉電阻到地; (5)采樣通道上的電容效應(yīng)也可能會(huì)導(dǎo)致AD采樣誤差,因?yàn)椴蓸油ǖ郎系牡刃щ娙菘赡苓€在保持有上一個(gè)采樣數(shù)據(jù)的數(shù)值的時(shí)候,就對(duì)當(dāng)前數(shù)據(jù)進(jìn)行采樣,會(huì)造成當(dāng)前數(shù)據(jù)不準(zhǔn)確。如果條件允許,可以在每次轉(zhuǎn)化完成后現(xiàn)將輸入切換到參考地,然后在對(duì)信號(hào)進(jìn)行下一次采樣。 2.軟件角度 (1)多次采樣取平均值算法,最為簡單; (2)數(shù)字濾波算法,例如采用中值濾波法,具體方法為:連續(xù)采樣20個(gè)數(shù)據(jù),對(duì)這些數(shù)據(jù)進(jìn)行排序之后,去掉最小的5個(gè)和最大的5個(gè),然后取中間10個(gè)采樣數(shù)據(jù)的平均值。 (3)軟件校正算法。F2812的ADC轉(zhuǎn)換精度較差的主要原因是存在增益誤差(Gain Error)和偏置誤差(Offset Error),要提高轉(zhuǎn)換精度就必須對(duì)兩種誤差進(jìn)行補(bǔ)償,下面將具體介紹這種實(shí)用的補(bǔ)償方法。 理想的12位ADC應(yīng)該是沒有增益誤差和偏置誤差的,因此其轉(zhuǎn)換的計(jì)算公式為: Y=x*mi 其中,x=input count=inputvoltage*4095/3.0V Y=output count Mi=ideal gain=1 但是,實(shí)際上F2812的AD是存在增益誤差和偏置誤差的,其轉(zhuǎn)換的計(jì)算公式如式2所示: Y=x*ma+mb 其中,ma=actual gain B=actualoffset (與輸入為0時(shí)相關(guān)) 實(shí)際的和理想的轉(zhuǎn)換計(jì)算曲線如圖2所示: ![]() 在校正的時(shí)候,首先選用ADC的任意兩個(gè)通道(例如A1,A2)作為參考輸入通道,并分別 輸入已知的直流參考電壓,通過讀取相應(yīng)的結(jié)果寄存器獲取轉(zhuǎn)換值,利用兩組輸出值便可求 得ADC模塊得校正增益和校正偏置,然后利用這兩個(gè)值對(duì)其他通道轉(zhuǎn)換數(shù)據(jù)進(jìn)行補(bǔ)償。 首先,計(jì)算兩個(gè)通道得參考電壓轉(zhuǎn)換后得理想結(jié)果。在講述算法之前,我們先來看看各個(gè)參數(shù)之間的關(guān)系,如下圖所示: ![]() y = x * ma + b ma = (yH – yL)/(xH – xL) b = yL – xL*ma CalGain = (xH – xL)/(yH – yL) CalOffset = yL * CalGain – xL x = y * CalGain – CalOffset 給A1通道加2.5V,給A2通道加0.5V。 A1input=VHigh=2.5V,則2.5*4095/3.0=3413(理想值) A2input=VLow=0.5V,則0.5*4095/3.0=683(理想值) 校正C語言的算法如下: #defineHIGH_IDEAL_COUNT 3413//理想高值 #defineLOW_IDEAL_COUNT 683//理想低值 #define SAMPLES20//采樣次數(shù) //定義所需的各個(gè)變量 Uint16Avg_HighActualCount; Uint16Avg_LowActualCount; Uint16Sum_HighActualCount; Uint16Sum_LowActualCount; Uint16 CalGain; Uint16CalOffset; Uint16HighActualCount[SAMPLES]; Uint16LowActualCount[SAMPLES]; //變量初始化 Voidinitvar (void) { Avg_HighActualCount=0; Avg_LowActualCount=0; Sum_HighActualCount=0; Sum_LowActualCount=0; CalGain=0; CalOffset=0; Uint16 I; For(i=0;i<SAMPLES;I++) { HighActualCount[I]=0; LowActualCount=0; } } //計(jì)算增益和偏置的函數(shù) Voidcalerror (void) { Static Unit16 i;//采樣計(jì)數(shù) Uint16k; HighActualCount=AdcRegs.AdcResult1>>4;//讀采樣數(shù)據(jù) LowActualCount=AdcRegs.AdcResult2>>4; If(i>=SAMPLES)//采樣滿規(guī)定次數(shù) { i=0; for(k=0;k<SAMPLES;k++) { Sum_HighActualCount+= HighActualCount; Sum_LowActualCount+=LowActualCount; } Avg_HighActualCount= Sum_HighActualCount/SAMPLES;//多次采樣取平均值 Avg_LowActualCount= Sum_LowActualCount/SAMPLES; CalGain = (HIGH_IDEAL_COUNT - LOW_IDEAL_COUNT)//計(jì)算增益系數(shù) CalOffset =Avg_LowActualCount*CalGain - LOW_IDEAL_COUNT; //計(jì)算偏置 } I++; } //在ADC_ISR中,對(duì)各個(gè)通道進(jìn)行校正: Interrupt Adc_Isr (void) { 。。。。。。。。。。 。。。。。。。。。。 } |
|