微控制器 (μC) 比以往任何時候都更具有類似 DSP 的功能,以及更傳統(tǒng)的 ALU 內(nèi)核。遺憾的是,許多不熟悉DSP算法和編碼技術(shù)的固件開發(fā)人員未能充分利用這些設(shè)備提供的功能。本文是固件開發(fā)人員在低成本μC中使用信號處理技術(shù)的入門書。
微控制器角色的轉(zhuǎn)變
不久前,使用μC進(jìn)行設(shè)計意味著CPU本身周圍有大量的外設(shè)和支持芯片。即使CPU有足夠的嵌入式ROM和RAM,任何重要的項目都需要外部支持芯片提供的功能。當(dāng)系統(tǒng)涉及任何類型的模擬信號時,這一點從未如此真實。即使是最簡單的模擬信號要求,系統(tǒng)復(fù)雜性也會膨脹。但是,這就是問題所在——聲音、溫度、壓力和其他自然現(xiàn)象的現(xiàn)實世界仍然是模擬的。實際上,能夠在模擬世界中運行的系統(tǒng)需要:
傳感器和模擬模擬信號調(diào)理器,用于將物理現(xiàn)象轉(zhuǎn)換為電信號
數(shù)據(jù)采集子系統(tǒng)至少由具有足夠精度和速度的模數(shù)轉(zhuǎn)換器(ADC)和數(shù)模轉(zhuǎn)換器(DAC)組成
能夠處理采樣數(shù)據(jù)的數(shù)字信號處理器 (DSP)
具有足夠吞吐量的μC來管理DSP、數(shù)據(jù)采集子系統(tǒng)和其他外設(shè),并具有足夠的剩余帶寬以平穩(wěn)執(zhí)行控制和用戶界面功能;μC還可能包含程序ROM和數(shù)據(jù)RAM
這些復(fù)雜的設(shè)備提高了最終產(chǎn)品的成本,使其價格超出了低端應(yīng)用的范圍。然而,一類新的μC已經(jīng)出現(xiàn),它通過在同一芯片上嵌入高性能數(shù)據(jù)采集子系統(tǒng)、類似DSP的功能和RISC CPU內(nèi)核來簡化與模擬世界的接口。現(xiàn)代μC的集成示意圖如圖1所示。
新一代μC的一個例子是MAXQ3120。除了常用的UART、定時器和I/O端口陣列外,MAXQ3120還集成了一組外設(shè),使模擬接口變得簡單:
16 位、1 周期 RISC 內(nèi)核
一對 16 位、Σ-Δ ADC
能夠在PWM模式下工作的16位定時器
帶 16 位累加器的 16 x 40 乘法器
MAXQ3120還包括一個時間時鐘、一個LCD控制器和硬件,以方便與IR通信通道接口。在下面的例子中,周期計數(shù)或存儲要求將特指MAXQ3120 μC。
現(xiàn)代μC在器件內(nèi)集成了大多數(shù)必要的系統(tǒng)功能,包括模擬外設(shè)和MAC。
圖1.傳統(tǒng)的嵌入式系統(tǒng)必須公開地址和數(shù)據(jù)總線,以便連接外部I/O設(shè)備以完成系統(tǒng)。
思考問題
涉及信號處理的問題最好分三個階段解決:
你想做什么?仔細(xì)剖析問題并將其分解為盡可能小的功能單元。問題是否涉及濾波、信號辨別或特定類型信號的生成?將問題劃分為一系列更簡單的子任務(wù)后,即可進(jìn)行下一步。
你是怎么做到的?現(xiàn)在搜索文獻(xiàn)、網(wǎng)絡(luò)或其他資源,找到與每項任務(wù)相關(guān)的算法。您可能會發(fā)現(xiàn)您的大多數(shù)概念問題已經(jīng)解決。您所要做的就是最后一步。
編碼它。將算法轉(zhuǎn)換為代碼的任務(wù)是熟悉的任務(wù),可用的硬件資源使其比以往任何時候都更容易。
在下面的示例中,我們堅持三個步驟:描述問題,呈現(xiàn)算法和方法,并提供解決問題的代碼示例。
功率監(jiān)控和測量示例 模擬至μC接口的一個常見示例
是測量交流電路的電壓和電流,以確定負(fù)載消耗的功率。乍一看,這似乎相對簡單——如果電壓和電流波形是正弦的,則RMS電壓和電流僅為峰值電壓或電流的1/倍。將RMS電壓和電流相乘,結(jié)果就是以瓦特為單位的功率。還有什么比這更簡單的呢?
這種分析有兩個問題。首先,雖然電力公司提供的電壓通常非常接近正弦,但電流波形不是。燈調(diào)光器、開關(guān)電源和熒光燈都為電源線提供非正弦電流曲線。簡單地乘以常數(shù)不會得到 RMS 電流值。其次,即使電流波形是正弦的,除非電壓和電流波形精確地同相,否則簡單地乘以RMS值并不能提供以瓦特為單位的實際功率使用情況。通常,實際負(fù)載包含容性電抗,或者更常見的是感抗。因此,必須考慮無功功率。我們必須回到根本,找到更好的方法。
在每個時刻,瞬時電壓和電流的乘積就是瞬時功率。圖2顯示了這種瞬時功率如何上升和下降,甚至可能在部分周期內(nèi)降至零以下,具體取決于電流??傆泄β手皇撬矔r電壓和瞬時電流乘積的時間平均值。找到實際功率很簡單——將電壓樣本和電流樣本相乘,然后將結(jié)果添加到累加器中。累積足夠數(shù)量的樣本后,只需將總和除以樣本數(shù)即可獲得以瓦特為單位的功率。要將其轉(zhuǎn)換為以瓦特秒為單位的能量,請乘以樣本累積的時間(以秒為單位)。
圖2.雖然電壓波形(虛線)通常非常接近正弦,但電流波形(實線)可能與純正弦波形有很大差異。此外,電流波形可能會同相偏移,導(dǎo)致線路周期某些部分的瞬時功率(虛線)變?yōu)樨?fù)值。
無功功率的計算并不那么簡單。首先,請注意,對于正弦電壓和電流,無功功率定義為:
其中V是RMS電壓,I是RMS電流,
是電流和電壓波形之間的相位差。
電抗元件產(chǎn)生的功率可以隨時通過計算差值來確定:
和
其中 Vt和我t是任何時間電壓和電流的瞬時值,是任意延遲,
T是一個線路周期的周期。區(qū)別在于:
使用三角恒等式 cos(A+B) = cosAcosB - sinAsinB 和 cos(A-B) = cosAcosB + sinAsinB 將等式更改為:
請注意,余弦項取消,正弦項加強,僅保留:
但是 VI sin(
) 是 Q,這就是我們試圖找到的。因此,重新排列術(shù)語會留下:
這意味著無功功率可以通過累加最近電流樣本與先前電壓樣本以及最新電壓樣本與上一個電流樣本之差的差值來計算。如果設(shè)置為采樣周期,則上述公式中的分母是一個常數(shù),
因此可以預(yù)先計算。
一旦知道有功功率和無功功率,視在功率(如果將RMS電壓和功率相乘時將計算出的功率)可以很容易地計算為:
最后,通過將實際功率除以視在功率來求出功率因數(shù)。
假設(shè)目前需要跟蹤所有這些因素,應(yīng)用將需要跟蹤電壓通道和電流通道的乘積之和,以及前面關(guān)于無功功率的討論中描述的乘積差異的總和。累積實際權(quán)力的代碼如下所示:
void accumulateRealPower(int i_sample, int v_sample) { static long real_power; initMAC(MULTIPLY_ADD); preloadMAC(real_power); real_power = getMAC(v_sample, i_sample); }
在此示例中,該函數(shù)采用一個字節(jié),用于在 MAC 中設(shè)置操作參數(shù)。該函數(shù)在乘法運算之前將長變量加載到累加器中。
initMACpreloadMAC
為了演示如何將其轉(zhuǎn)換為實際的機器指令,請考慮以下基于上述代碼的操作集:
初始化乘法累加單元或 MAC(一個周期)
設(shè)置內(nèi)存指針以對存儲區(qū)域求和(一個周期)
將舊總和加載到累加器中(兩個周期)
將電壓樣本加載到乘法器中(一個周期)
將當(dāng)前樣本加載到乘法器中(一個周期)
等待一個周期以完成累積操作(一個周期)
將累加器保存到內(nèi)存(一個周期)
因此,需要八個周期來積累實際功率。累積無功功率類似:
請注意,本討論假設(shè)輸入樣本的直流偏移為零。如果不是這樣,則需要為電壓和電流通道本身提供額外的累加器。如果直流偏移為零,則這些總和將為零。否則,必須從累積的實際功率中減去直流失調(diào)所代表的功率。
void accumulateReactivePower(int i_sample, int v_sample) { static long reactive_power; initMAC(MULTIPLY_ADD); preloadMAC(reactive_power); reactive_power = getMAC(prev_v_sample, i_sample); initMAC(MULTIPLY_SUB); reactive_power = getMAC(prev_i_sample, v_sample); }
過濾示例
過濾是數(shù)字領(lǐng)域最常見的任務(wù)之一。原因很簡單——理想濾波器在模擬世界中無法實現(xiàn),但在數(shù)字邏輯中實現(xiàn)起來相對簡單。
本節(jié)將介紹低通濾波器和帶通濾波器。低通濾波器通常用于在采樣之前從信號中去除不需要的高頻分量,以消除混疊偽影。帶通濾波器通常用于將通信信道限制在特定的頻率范圍內(nèi)。例如,F(xiàn)SK調(diào)制解調(diào)器可以使用帶通濾波器來消除高頻和低頻噪聲分量,只留下感興趣的頻率進(jìn)行處理。
關(guān)于數(shù)字濾波器主題的文章已經(jīng)寫了很多,可能使人們認(rèn)為這個主題很難理解。實際上,基礎(chǔ)知識很簡單,無需成為DSP專家即可使用濾波功能。
通過檢查圖3中的低通濾波器圖,可以看出:
其中 Yn是當(dāng)前輸出樣本 YN-1是 以前的輸出樣本和 Xn是當(dāng)前輸入 樣本。濾波器常數(shù),b0,預(yù)先計算為:
其中 f0是所需的半幅度轉(zhuǎn)折頻率,并且
是采樣周期。因此,對于 8kHz 的采樣速率和 100Hz 的所需轉(zhuǎn)折頻率,b0等于 p x 125μs x 100Hz = 3.93 x 10-2
圖3.在發(fā)出信號之前,使用單極點低通濾波器從信號中去除不需要的高頻分量。
實現(xiàn)過濾算法非常簡單:
long lpf(int input_sample) { static long prev_out; initMAC(MULTIPLY_SUB); preloadMAC(prev_out); prev_out = getMAC(b0, prev_out); initMAC(MULTIPLY_ADD | ONE_OP); prev_out = oneopMAC(input_sample); return prev_out; }
該函數(shù)僅將一個操作數(shù)加載到乘數(shù)中,期望乘數(shù)保持第二個操作數(shù)。這樣做是為了節(jié)省執(zhí)行時間。該過濾器如果有效編譯,每個樣本只需要十個周期。時鐘為8MHz時,一階低通濾波器僅消耗MAXQ1處理帶寬的1%左右(不考慮中斷開銷)。
oneopMAC
二階帶通濾波器在概念上要復(fù)雜一些,盡管實際上很相似,只增加了算法的幾個步驟。一個簡單的二階帶通濾波器的信號流圖如圖2所示,其公式為:
圖4.二階帶通濾波器可以將通信信道限制在特定的頻率范圍內(nèi)。
與前面的示例一樣,參數(shù) b0一個1,以及2是預(yù)先計算的。該 a1參數(shù)定義濾波器的Q因子,即濾波器抑制中心頻率附近帶外頻率的效率的度量。具體說來
p 通常在 100 到 1,000 的范圍內(nèi)。p值越大,表示通帶越窄,但濾波器建立時間越長。p值越小,通帶越寬,建立時間越短。
其他參數(shù),a2和 b0,按1.首先,我們定義兩個中間變量:
現(xiàn)在我們可以定義其他兩個參數(shù):
請注意,一旦選擇了中心頻率、采樣率和濾波器Q因子,參數(shù)就是常數(shù)。必要的代碼是:
long bpf(int input_sample) { static long x[1], y[1], output; initMAC(MULTIPLY_ADD | CLEAR_ACC); output = getMAC(y[1], a2); initMAC(MULTIPLY_SUB); } output = getMAC(y[0], a1); output = getMAC(x[1], b0); initMAC(MULTIPLY_ADD | ONE_OP); output = oneopMAC(input_sample); x[1] = x[0]; x[0] = input_sample; y[1] = y[0]; y[0] = output; return output; }
如果有效編譯,此例程(不包括輸入和輸出樣本的老化)需要十四個周期。老化不包括在周期估計中,因為樣品通常存儲在循環(huán)緩沖液中,不需要老化。
音調(diào)生成和檢測示例
在通信應(yīng)用中,通常需要生成/檢測音頻通道中的音調(diào)組合。例如,在電話應(yīng)用中,想要在電話線路中合成或檢測雙音多頻音(DTMF)以在電話線上撥號的情況并不少見。在中繼卡中,標(biāo)準(zhǔn)多頻 (MF) 音通常用于帶內(nèi)信令。呼叫進(jìn)度信令(撥號音、回鈴、忙音和重新排序等)通常表示為兩個或多個音調(diào)的組合。
雙極數(shù)字諧振器(圖5)是生成音調(diào)的簡單方法。諧振器的公式為:
其中 k 是:
并且可以預(yù)先計算。請注意,該諧振器沒有輸入 - 它連續(xù)運行而無需干預(yù)。然而,要啟動諧振器,YN-1必須設(shè)置為零和 YN-2設(shè)置為 -Asink,其中 A 是所需的信號幅度。
圖5.雙極數(shù)字諧振器用于產(chǎn)生正弦波。
產(chǎn)生正弦波的算法是迄今為止提出的最簡單的算法:
long gen_tone_sample() { static long y[1]; initMAC(MULTIPLY_ADD); preloadMAC(-y[1]); y[1] = y[0]; y[0] = getMAC(y[0], k); return y[0]; }
此例程的代碼大小估計值為每個要生成的正弦波樣本大約八個機器周期。這具有類似于產(chǎn)生簡單方波的CPU強度,然后必須通過外部模擬電路對其進(jìn)行濾波,以產(chǎn)生許多應(yīng)用所需的頻譜純度。
音調(diào)檢測稍微復(fù)雜一些,盡管在削減基本要素時并不那么令人生畏。為了檢測音頻通道中的音調(diào),我們選擇 Goertzel 算法。該算法利用二階濾波器和功率測量公式來確定濾波器通帶中是否存在能量。
圖 2 中二階濾波器的公式為:
其中 k 的定義與前面描述的音調(diào)生成器中的定義相同。算法為:
long *tone_filter(int input_sample) { static long y[1], output; initMAC(MULTIPLY_ADD); preloadMAC(-y[1]); y[1] = y[0]; y[0] = getMAC(y[0], k) + input_sample; return y; }
請注意,此例程返回數(shù)組而不是標(biāo)量值。這是因為下一步需要最新結(jié)果和上一個結(jié)果。一個音調(diào)檢測器通道的周期計數(shù)估計為 12 個周期,或者在 8kHz 采樣速率下,約為 CPU 馬力的 1.5%。通常,在濾波器穩(wěn)定并提供音調(diào)存在的可靠指示之前,它需要 100 多個采樣周期。
圖6.音調(diào)檢測可以通過二階濾波器執(zhí)行。
為了測試是否存在音調(diào),有必要計算濾波信號中的功率。這可以使用以下等式完成:
由于系數(shù)與濾波器環(huán)路預(yù)先計算的系數(shù)相同,因此我們可以在此處使用它來計算功率:
power_squared = y[0] * y[0] + y[1] * y[1] - k * y[0] * y[1];
在足夠數(shù)量的采樣周期后,音調(diào)存在由平方功率指示顯示,在沒有音調(diào)的情況下,該指示將至少比測量值高一個數(shù)量級。在測試中,音調(diào)的存在可能表明輸入處的單位信號幅度大于 1,000 的平方幅度。非頻率音或非頻率音的組合通常顯示小于 50 的平方振幅。
結(jié)論
隨著數(shù)據(jù)采集硬件和類似DSP的構(gòu)建模塊在廉價μC上變得越來越普遍,固件工程師必須找到將DSP功能引入主CPU的方法,以降低成本并提高性能。然而,憑借文獻(xiàn)和網(wǎng)絡(luò)上的豐富資源,這項任務(wù)比預(yù)期的要容易得多。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7911瀏覽量
153735 -
dsp
+關(guān)注
關(guān)注
555文章
8144瀏覽量
355339 -
嵌入式
+關(guān)注
關(guān)注
5141文章
19542瀏覽量
315178
發(fā)布評論請先 登錄
低成本低功耗8位微控制器可輕松融入高能效產(chǎn)品設(shè)計
STM32微控制器
微控制器開發(fā)板Raspberry Pi Pico
微控制器MCU是什么
低成本微控制器單元中經(jīng)常使用的內(nèi)部RC振蕩器的優(yōu)點和需求
GD32E5高性能微控制器
低成本嵌入式多媒體微控制器的設(shè)計與實現(xiàn)
高性能16位XA微控制器系列
采用基于Flash的低成本8位微控制器實現(xiàn)優(yōu)化電子鎮(zhèn)流器的設(shè)計

采用高性能微控制器的三相BLDC/PMSM電機驅(qū)動器參考設(shè)計

使用集成的微控制器創(chuàng)建低成本ADC

評論