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