MAXQ7654在信號濾波中的應用
基于高性能、16 位RISC MAXQ20 核, MAXQ7654 提供16 通道、12 位模數轉換器(ADC)和雙通道、12 位數模轉換器(DAC)。除模擬電路外,MAXQ7654 還具有完備的數字外設,包括:CAN 控制器、SPI 接口和4 個8/16 位定時器,可用作計數器或可編程脈寬調制器。MAXQ7654 提供128kB 的程序存儲空間, 能夠勝任絕大多數嵌入式混合信號處理應用。
?????? 本文所描述的應用旨在展示MAXQ7654 的混合信號特性。微控制器利用一個DAC 產生帶噪聲的正弦波。DAC 輸出被接入一個ADC 輸入通道進行采樣。得到的采樣通過一個簡易的有限激勵響應(FIR)濾波器,以衰減信號中的高頻分量,從而在第二個DAC 產生連續,光滑的正弦波輸出。
?????? 利用豐富的模擬和數字外設,在很多有意思的應用中都可施展MAXQ7654 的能力。本文聚焦于MAXQ7
? |
?
?????? 集成的模擬功能和外設使信號濾波成為可能
?????? MAXQ7654 集成了16 通道、12 位ADC,完成一次轉換僅需16 個時鐘周期。時鐘頻率為8MHz(最大值) 時,每秒可完成500,000 次采樣。測量單端模擬信號時可對多達16 路信號進行采樣,測量差分信號時可對多達8 路輸入信號進行采樣。該ADC 也可進行溫度測量——MAXQ7654 內含溫度傳感器,可讀取芯片(管芯)溫度。
?????? MAXQ7654 包括一個硬件乘加單元,用于信號處理。它能在一個周期中進行兩個16 位乘法,并且還有一個可選的累加器功能,可工作于帶符號或無符號模式。這樣一來簡化了FIR 和IIR 濾波器的實現;每個濾波因數只需3 個機器周期的處理,其中還包括了調用濾波器的開銷。
?????? JTAG 調試引擎是MAXQ 平臺公用的,當應用程序在目標硬件上運行時,利用它可完成寄存器和存儲器的讀、寫操作。采用JTAG 后還省掉了昂貴的仿真器。主要的C 編譯器提供商,如Rowley 、IAR 和Python 均支持MAXQ7654 及其調試功能。
?????? MAXQ 平臺的一個新增外設是控制器局域網(CAN) 2.0B 接口,它是常用于工業和汽車應用的通信協議。MAXQ7654 的CAN 控制器支持15 個消息中心,比特率高達1Mbps 。當受到或發出消息后以中斷形式通知系統。
?????? SPI.接口支持從機或主機模式,可進行8 位或16 位數據傳輸。SPI 常見于小型芯片當中,如可編程充電器、數字電位器、DAC、ADC 和存儲芯片。
?????? MAXQ7654 有4 個多功能定時器。這些定時器采用8 位或16 位計數方式,支持周期性中斷、脈寬調制、捕獲及比較功能的自動重裝載。
?????? 濾波應用的軟件架構
?????? 定時器產生中斷時第一個DAC 輸出帶噪聲的正弦波,以確保輸出采樣具有固定的間隔。設計用于生成正弦波的代碼涉及到復雜的浮點計算,實現起來運算量很大??紤]到正弦波數據是周期性重復出現的。重新計?算那些不會隨時間改變的正弦波數據會造成資源浪費。因此,在應用程序一開始就預先算出一組正弦波數據。
?????? 在正弦波數據初始化之后,定時器產生周期性中斷。定時器中斷程序代碼中的一個偽隨機數產生器用來產生噪聲,噪聲被直接疊加到干凈的正弦波數據中。結果被傳給DAC 產生輸出信號。
為了保持演示程序代碼的簡潔,在用于產生輸出正弦波的定時中斷中同時對模擬輸入信號進行采樣。當讀取輸入采樣后,采樣信號通過簡易的FIR 濾波軟件處理,為使效率最大化,該濾波軟件用匯編語言來實現。濾波后的采樣信號隨后從第2 個DAC 輸出。用示波器來比較兩個DAC 的輸出,可以發現:一條正弦曲波較為粗糙,帶有噪聲,而另一條正弦波則看上去比較干凈,由于FIR 濾波器的長度,帶有輕微的相位延遲。
?????? 噪聲正弦波的生成和采樣
?????? 定時器中斷程序代碼如下,程序開始時已預先計算好正弦波數據,本段代碼將其轉換為噪聲正弦波數據。
?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 變量用來存儲偽隨機噪聲(可能是正的或負的)。噪聲被疊加給干凈的正弦波數據后,所產生的噪聲正弦波數據被直接賦給DACI1 寄存器,以進行數模轉換。
?????? 從ADC 讀取采樣數據的過程幾乎同樣簡單。設置完ADC 的采樣輸入引腳后,軟件可通過檠疊USY 位或者使能中斷來獲知轉換已經結束。本實例代碼使用了查詢方式。
?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 個時鐘周期便可完成一次轉換。
?????? 設計一個簡單的數字濾波器
?????? 本應用所產生的波形中包含一個強低頻信號和大量的高頻噪聲。用一個簡單的低通濾波器可凈化該信號。
?????? 一個通用的FIR 濾波器可用下式描述:
?????? Y = An Xn?
?????? 其中An 是濾波因數,Xn 是以前的采樣輸入,Y 是濾波器當前的輸出。濾波因子決定濾波器的頻率響應,即不同的頻率成分是怎樣被衰減或突出的。
?????? 可用一個Java 小程序(與本文源代碼一同發布)來基于極-零圖生成濾波因數(圖1)。該程序可生成一組高精度的浮點濾波因數。不過,由于MAXQ7654 有16 位硬件乘加器,因此需要將浮點因數轉換成16 位精度的定點因數。這一轉換會給理想的濾波器變換引入誤差。因此,該Java 程序也給出了建立在定點因數之上的實際變換結果,并以圖形方式給出了誤差。注意:盡管該程序既支持極點(突出頻率分量)也支持零點(衰減頻率分量),但演示代碼只使用零點。無限激勵響應濾波器(包含極點和零點)可以由另外的軟件來實現。
在應用程序窗口底部的文本框中給出了生成的16 位定點濾波因數以及其中的小數位數。
??????????????
圖1. 圖中給出了生成濾波器因數的Java 程序輸出。該程序可生成理想轉換結果、實際轉換結果、誤差和16 位濾波器因數。
?????? 高效數字濾波器的實現
?????? 本節討論怎樣在一個真正的數字濾波器里實現定點因數。為獲得最佳性能,數字濾波器算法采用匯編語言編寫。這使得應用設計人員可根據具體要求來優化濾波器程序。一兩個額外的周期都可對應用的最大濾波器長度和采樣率產生顯著影響。
?????? 本演示程序所采取的兩個關鍵措施使濾波器效率最大化。首先,該應用采用非滾動的濾
? |
?
?????? 第2 個有助于改進濾波器效率的關鍵點是,將RAM 中的256 個字做為存儲先前輸入數據的環形緩沖器 (通用濾波器方程中的Xn 項)。如果濾波器有250 個因數,則無論如何必須儲存250 個先前的輸入值,這樣一來RAM 中的256 個字并沒有被浪費。這樣設計的好處在于MAXQ 的基址-偏址指針可被用來生成硬件環形緩沖器。由于指針會自動在緩沖器邊界滾動,因此濾波器軟件不需要檢查指針是否已達數據緩沖器的起始位置。以下是數字濾波器代碼:
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
代碼中首先對輸入采樣標準化。由于MAXQ7654 有12 位ADC,因此輸入值從0 到4095 。為了使用數字濾波器,輸入值應被標準化為-2048 至+2047 ,也就是減去2048 (2048 = 211)。一旦輸入采樣的指針初始化完成,并且當前輸入采樣被儲存,程序代碼即開始執行濾波操作。
?
?????? MAXQ 中的硬件乘加器單元使用起來十分方便。濾波器因數和輸入采樣載入乘法器寄存器,一個時鐘周期之后便可獲得相乘的結果。通過BP[OFF]指針可讀取輸入采樣,濾波器因數采用硬件編碼,從圖1 所示的輸出窗口直接獲得(重現如下):
?????? 首行中的"14"表明濾波器中的數字其小數點之后有14 位,濾波完成后結果必須右移14 位。"27"表明濾波器有27 個因數。在這些控制參數之后,列出了濾波器系數,從A0 開始(0x16, 0x48, 0xad, ..) 。
?????? 濾波器算法執行完之后,累加結果即出現在乘加寄存器MC0、MC1、MC2 中。必須對該結果進行移位以補償定點基數。
????
? |
?
move MA, #COEFFICIENT_n
move MB, @BP[Offs--]
同時,如有必要,還注意應改變移位數。
?????? 結果
?????? 這個簡易的濾波器工作得很理想。圖2 給出了用示波器捕獲的兩個MAXQ7654 DAC 的波形??梢杂^察到由于FIR 濾波器的長度,在干凈的輸出信號中存在相移。
???????
圖2. 下面的波形是MAXQ7654 中DAC 輸出的帶噪聲信號。它被采樣、濾波并輸出后顯示為上面的波形。
?????? 評估板
?????? MAXQ7654 評估板的原理圖隨源代碼一同發布。該評估板有很多用來評估MAXQ7654 微控制器的可選項。電源電壓和外圍器件配置可通過跳線進行選擇,并且芯片的每個引腳在評估板上都有引出。MAXQ7654 評估板(參見圖3)還集成了JTAG 硬件,因此加載或調試時無需外部電路板。
??????????
??????? 圖3. MAXQ7654 評估板上有大量I/O、按鈕和原型設計區,是評估MAXQ7654 的理想平臺。
?????? 結束語
?????? 正如我們所見,MAXQ7654 是一個高性能、應用廣泛的混合信號微處理器。MAXQ7654 簡單的演示代碼和高集成設計可使性能最大化,該器件可在信號濾波應用領域為設計者提供易于使用的解決方案。
評論