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