MAXQ7654在信號濾波中的應(yīng)用
基于高性能、16 位RISC MAXQ20 核, MAXQ7654 提供16 通道、12 位模數(shù)轉(zhuǎn)換器(ADC)和雙通道、12 位數(shù)模轉(zhuǎn)換器(DAC)。除模擬電路外,MAXQ7654 還具有完備的數(shù)字外設(shè),包括:CAN 控制器、SPI 接口和4 個8/16 位定時器,可用作計數(shù)器或可編程脈寬調(diào)制器。MAXQ7654 提供128kB 的程序存儲空間, 能夠勝任絕大多數(shù)嵌入式混合信號處理應(yīng)用。
?????? 本文所描述的應(yīng)用旨在展示MAXQ7654 的混合信號特性。微控制器利用一個DAC 產(chǎn)生帶噪聲的正弦波。DAC 輸出被接入一個ADC 輸入通道進(jìn)行采樣。得到的采樣通過一個簡易的有限激勵響應(yīng)(FIR)濾波器,以衰減信號中的高頻分量,從而在第二個DAC 產(chǎn)生連續(xù),光滑的正弦波輸出。
?????? 利用豐富的模擬和數(shù)字外設(shè),在很多有意思的應(yīng)用中都可施展MAXQ7654 的能力。本文聚焦于MAXQ7
? |
?
?????? 集成的模擬功能和外設(shè)使信號濾波成為可能
?????? MAXQ7654 集成了16 通道、12 位ADC,完成一次轉(zhuǎn)換僅需16 個時鐘周期。時鐘頻率為8MHz(最大值) 時,每秒可完成500,000 次采樣。測量單端模擬信號時可對多達(dá)16 路信號進(jìn)行采樣,測量差分信號時可對多達(dá)8 路輸入信號進(jìn)行采樣。該ADC 也可進(jìn)行溫度測量——MAXQ7654 內(nèi)含溫度傳感器,可讀取芯片(管芯)溫度。
?????? MAXQ7654 包括一個硬件乘加單元,用于信號處理。它能在一個周期中進(jìn)行兩個16 位乘法,并且還有一個可選的累加器功能,可工作于帶符號或無符號模式。這樣一來簡化了FIR 和IIR 濾波器的實現(xiàn);每個濾波因數(shù)只需3 個機(jī)器周期的處理,其中還包括了調(diào)用濾波器的開銷。
?????? JTAG 調(diào)試引擎是MAXQ 平臺公用的,當(dāng)應(yīng)用程序在目標(biāo)硬件上運(yùn)行時,利用它可完成寄存器和存儲器的讀、寫操作。采用JTAG 后還省掉了昂貴的仿真器。主要的C 編譯器提供商,如Rowley 、IAR 和Python 均支持MAXQ7654 及其調(diào)試功能。
?????? MAXQ 平臺的一個新增外設(shè)是控制器局域網(wǎng)(CAN) 2.0B 接口,它是常用于工業(yè)和汽車應(yīng)用的通信協(xié)議。MAXQ7654 的CAN 控制器支持15 個消息中心,比特率高達(dá)1Mbps 。當(dāng)受到或發(fā)出消息后以中斷形式通知系統(tǒng)。
?????? SPI.接口支持從機(jī)或主機(jī)模式,可進(jìn)行8 位或16 位數(shù)據(jù)傳輸。SPI 常見于小型芯片當(dāng)中,如可編程充電器、數(shù)字電位器、DAC、ADC 和存儲芯片。
?????? MAXQ7654 有4 個多功能定時器。這些定時器采用8 位或16 位計數(shù)方式,支持周期性中斷、脈寬調(diào)制、捕獲及比較功能的自動重裝載。
?????? 濾波應(yīng)用的軟件架構(gòu)
?????? 定時器產(chǎn)生中斷時第一個DAC 輸出帶噪聲的正弦波,以確保輸出采樣具有固定的間隔。設(shè)計用于生成正弦波的代碼涉及到復(fù)雜的浮點(diǎn)計算,實現(xiàn)起來運(yùn)算量很大。考慮到正弦波數(shù)據(jù)是周期性重復(fù)出現(xiàn)的。重新計?算那些不會隨時間改變的正弦波數(shù)據(jù)會造成資源浪費(fèi)。因此,在應(yīng)用程序一開始就預(yù)先算出一組正弦波數(shù)據(jù)。
?????? 在正弦波數(shù)據(jù)初始化之后,定時器產(chǎn)生周期性中斷。定時器中斷程序代碼中的一個偽隨機(jī)數(shù)產(chǎn)生器用來產(chǎn)生噪聲,噪聲被直接疊加到干凈的正弦波數(shù)據(jù)中。結(jié)果被傳給DAC 產(chǎn)生輸出信號。
為了保持演示程序代碼的簡潔,在用于產(chǎn)生輸出正弦波的定時中斷中同時對模擬輸入信號進(jìn)行采樣。當(dāng)讀取輸入采樣后,采樣信號通過簡易的FIR 濾波軟件處理,為使效率最大化,該濾波軟件用匯編語言來實現(xiàn)。濾波后的采樣信號隨后從第2 個DAC 輸出。用示波器來比較兩個DAC 的輸出,可以發(fā)現(xiàn):一條正弦曲波較為粗糙,帶有噪聲,而另一條正弦波則看上去比較干凈,由于FIR 濾波器的長度,帶有輕微的相位延遲。
?????? 噪聲正弦波的生成和采樣
?????? 定時器中斷程序代碼如下,程序開始時已預(yù)先計算好正弦波數(shù)據(jù),本段代碼將其轉(zhuǎn)換為噪聲正弦波數(shù)據(jù)。
?sample = static_sin_data[sinindex++]
;
sinnoise = ((sinnoise ^ 0x5C) * 31) + 0xabcd;
thisnoise = sinnoise;
if (thisnoise & 0x01)
{
thisnoise = thisnoise & 0x1ff;
}
else
{
thisnoise =
? |
;
}
sample += thisnoise;
if (sample < 0)
?
sample = sample * -1;
if (sample > 4095)
sample = 8192 - sample;
DACI1 = sample; // Send value to DAC #1
if (sinindex >= SIN_WAVE_STEPS)
sinindex = 0;?
?????? sinnoise 變量用來存儲偽隨機(jī)噪聲(可能是正的或負(fù)的)。噪聲被疊加給干凈的正弦波數(shù)據(jù)后,所產(chǎn)生的噪聲正弦波數(shù)據(jù)被直接賦給DACI1 寄存器,以進(jìn)行數(shù)模轉(zhuǎn)換。
?????? 從ADC 讀取采樣數(shù)據(jù)的過程幾乎同樣簡單。設(shè)置完ADC 的采樣輸入引腳后,軟件可通過檠疊USY 位或者使能中斷來獲知轉(zhuǎn)換已經(jīng)結(jié)束。本實例代碼使用了查詢方式。
?inputsample = ADC_Convert_Poll(AIN0 | START_CONV | CONTINUOUS)
;
..
.
unsigned int ADC_Convert_Poll (unsigned int Control_Reg)
{
ACNT = Control_Reg; // Set the ADC parameters
while( ACNT_bit.ADCBY == 1); // Wait till ADC is not busy
return ADCD; // Return the ADC result
}?
?????? 注意,MAXQ7654 中ADC 的采樣率是500ksps 。在8MHz 時鐘下,只需等待16 個時鐘周期便可完成一次轉(zhuǎn)換。
?????? 設(shè)計一個簡單的數(shù)字濾波器
?????? 本應(yīng)用所產(chǎn)生的波形中包含一個強(qiáng)低頻信號和大量的高頻噪聲。用一個簡單的低通濾波器可凈化該信號。
?????? 一個通用的FIR 濾波器可用下式描述:
?????? Y = An Xn?
?????? 其中An 是濾波因數(shù),Xn 是以前的采樣輸入,Y 是濾波器當(dāng)前的輸出。濾波因子決定濾波器的頻率響應(yīng),即不同的頻率成分是怎樣被衰減或突出的。
?????? 可用一個Java 小程序(與本文源代碼一同發(fā)布)來基于極-零圖生成濾波因數(shù)(圖1)。該程序可生成一組高精度的浮點(diǎn)濾波因數(shù)。不過,由于MAXQ7654 有16 位硬件乘加器,因此需要將浮點(diǎn)因數(shù)轉(zhuǎn)換成16 位精度的定點(diǎn)因數(shù)。這一轉(zhuǎn)換會給理想的濾波器變換引入誤差。因此,該Java 程序也給出了建立在定點(diǎn)因數(shù)之上的實際變換結(jié)果,并以圖形方式給出了誤差。注意:盡管該程序既支持極點(diǎn)(突出頻率分量)也支持零點(diǎn)(衰減頻率分量),但演示代碼只使用零點(diǎn)。無限激勵響應(yīng)濾波器(包含極點(diǎn)和零點(diǎn))可以由另外的軟件來實現(xiàn)。
在應(yīng)用程序窗口底部的文本框中給出了生成的16 位定點(diǎn)濾波因數(shù)以及其中的小數(shù)位數(shù)。
??????????????
圖1. 圖中給出了生成濾波器因數(shù)的Java 程序輸出。該程序可生成理想轉(zhuǎn)換結(jié)果、實際轉(zhuǎn)換結(jié)果、誤差和16 位濾波器因數(shù)。
?????? 高效數(shù)字濾波器的實現(xiàn)
?????? 本節(jié)討論怎樣在一個真正的數(shù)字濾波器里實現(xiàn)定點(diǎn)因數(shù)。為獲得最佳性能,數(shù)字濾波器算法采用匯編語言編寫。這使得應(yīng)用設(shè)計人員可根據(jù)具體要求來優(yōu)化濾波器程序。一兩個額外的周期都可對應(yīng)用的最大濾波器長度和采樣率產(chǎn)生顯著影響。
?????? 本演示程序所采取的兩個關(guān)鍵措施使濾波器效率最大化。首先,該應(yīng)用采用非滾動的濾
? |
?
?????? 第2 個有助于改進(jìn)濾波器效率的關(guān)鍵點(diǎn)是,將RAM 中的256 個字做為存儲先前輸入數(shù)據(jù)的環(huán)形緩沖器 (通用濾波器方程中的Xn 項)。如果濾波器有250 個因數(shù),則無論如何必須儲存250 個先前的輸入值,這樣一來RAM 中的256 個字并沒有被浪費(fèi)。這樣設(shè)計的好處在于MAXQ 的基址-偏址指針可被用來生成硬件環(huán)形緩沖器。由于指針會自動在緩沖器邊界滾動,因此濾波器軟件不需要檢查指針是否已達(dá)數(shù)據(jù)緩沖器的起始位置。以下是數(shù)字濾波器代碼:
filtersample:
push DP[1]
push DPC
move AP, #0
sub #2048
move DPC, #10h
move BP, #W:sampletable
; preserve IAR's software stack
; probably needs this preserved
; select accumulator 0
; normalize the input sample
; DP[0] byte mode, BP word mode
; start of the sample table
move DP[0], #B:sampleindex ; point to sample current index
move AP, #1
move ACC, @DP[0]
move Offs, ACC
add #1
move @DP[0], ACC
move @BP[Offs], A[0]
move MCNT, #22h
filterloop:
;
; Unroll the filter loop for speed.
; select accumulator 1
; get current table index
; put it in the offset register
; increment the current index
; restore the table pointer
; store the current sample
; signed, accum, clear regs first
;
move MA, #0x16
move MB, @BP[Offs--]
move MA, #0x48
move MB, @BP[Offs--]
...
move MA, #0x7
move MB, @BP[Offs--]
move MA, #0x2
move MB, @BP[Offs--]
nop
move A[2], MC2 ; get MAC result HIGH
move A[1], MC1 ; get MAC result MID
move A[0], MC0 ; get MAC result LOW
代碼中首先對輸入采樣標(biāo)準(zhǔn)化。由于MAXQ7654 有12 位ADC,因此輸入值從0 到4095 。為了使用數(shù)字濾波器,輸入值應(yīng)被標(biāo)準(zhǔn)化為-2048 至+2047 ,也就是減去2048 (2048 = 211)。一旦輸入采樣的指針初始化完成,并且當(dāng)前輸入采樣被儲存,程序代碼即開始執(zhí)行濾波操作。
?
?????? MAXQ 中的硬件乘加器單元使用起來十分方便。濾波器因數(shù)和輸入采樣載入乘法器寄存器,一個時鐘周期之后便可獲得相乘的結(jié)果。通過BP[OFF]指針可讀取輸入采樣,濾波器因數(shù)采用硬件編碼,從圖1 所示的輸出窗口直接獲得(重現(xiàn)如下):
?????? 首行中的"14"表明濾波器中的數(shù)字其小數(shù)點(diǎn)之后有14 位,濾波完成后結(jié)果必須右移14 位。"27"表明濾波器有27 個因數(shù)。在這些控制參數(shù)之后,列出了濾波器系數(shù),從A0 開始(0x16, 0x48, 0xad, ..) 。
?????? 濾波器算法執(zhí)行完之后,累加結(jié)果即出現(xiàn)在乘加寄存器MC0、MC1、MC2 中。必須對該結(jié)果進(jìn)行移位以補(bǔ)償定點(diǎn)基數(shù)。
????
? |
?
move MA, #COEFFICIENT_n
move MB, @BP[Offs--]
同時,如有必要,還注意應(yīng)改變移位數(shù)。
?????? 結(jié)果
?????? 這個簡易的濾波器工作得很理想。圖2 給出了用示波器捕獲的兩個MAXQ7654 DAC 的波形。可以觀察到由于FIR 濾波器的長度,在干凈的輸出信號中存在相移。
???????
圖2. 下面的波形是MAXQ7654 中DAC 輸出的帶噪聲信號。它被采樣、濾波并輸出后顯示為上面的波形。
?????? 評估板
?????? MAXQ7654 評估板的原理圖隨源代碼一同發(fā)布。該評估板有很多用來評估MAXQ7654 微控制器的可選項。電源電壓和外圍器件配置可通過跳線進(jìn)行選擇,并且芯片的每個引腳在評估板上都有引出。MAXQ7654 評估板(參見圖3)還集成了JTAG 硬件,因此加載或調(diào)試時無需外部電路板。
??????????
??????? 圖3. MAXQ7654 評估板上有大量I/O、按鈕和原型設(shè)計區(qū),是評估MAXQ7654 的理想平臺。
?????? 結(jié)束語
?????? 正如我們所見,MAXQ7654 是一個高性能、應(yīng)用廣泛的混合信號微處理器。MAXQ7654 簡單的演示代碼和高集成設(shè)計可使性能最大化,該器件可在信號濾波應(yīng)用領(lǐng)域為設(shè)計者提供易于使用的解決方案。
評論
查看更多