基于MAXQ構建增強型智能4-20mA變送器
簡單的環(huán)路工作
在電流環(huán)路中,傳感器的輸出電壓首先按比例轉換成電流,一般4ma表示傳感器的零電平輸出,20ma表示滿量程輸出。遠端接收器將4-20ma電流又轉換為電壓,利用計算機或顯示模塊做進一步處理。
典型的4-20ma電流環(huán)電路包括四個部分:傳感器/變送器、電壓-電流轉換器、環(huán)路電源和接收器/監(jiān)視器。在環(huán)路供電的應用中,傳感器驅動電壓-電流轉換器,其他三個部分串聯連接,構成閉環(huán)回路(圖1)。
智能型4-20ma變送器
傳統上,4-20ma變送器包括一個安裝在現場的器件,該器件感測物理參數并產生4-20ma標準范圍內的比例電流。為適應工業(yè)需求,出現了稱作“智能型變送器”的第二代4-20ma變送器,這種變送器采用微控制器(μc)和數據轉換器調理遠端信號。
智能型變送器可以對增益和失調進行校準,通過將傳感器模擬信號數字化(如rtd傳感器和熱電偶)實現線性化處理,用駐留在μc內部的數學算法處理信號,再將數字信號轉換回模擬信號,結果以標準電流的形式沿環(huán)路傳輸。
最新的第三代4-20ma變送器(圖2)被認為是“增強型智能”變送器。它們增加了與4-20ma信號共享雙絞線的數字通信功能。所提供的通信通道在傳輸傳感器數據的同時,還可傳輸控制和診斷信號。
智能型變送器所使用的通信標準是hart協議,該協議基于bell 202電話通信標準,采用頻移鍵控(fsk)方式。其數字信號1和0分別由1200hz和2200hz頻率表示。這些頻率的正弦波疊加在傳感器的直流模擬信號上,同時提供模擬和數字通信(圖3)。
因為fsk信號的平均值始終為零,4-20ma模擬信號在此過程中不受影響。數字狀態(tài)每秒鐘可以轉換兩到三次,而不會妨礙模擬信號。允許的最小環(huán)路阻抗為23。
4-20ma增強型智能變送器對μc的基本要求
要實現這種4-20ma電流環(huán)路應用,μc必須具備三種特定性能:
串行接口,連接用于數據采集的adc和用于設置環(huán)路電流的dac。
因為電流預算為4ma,所以要求低功耗。
乘法-累加單元(mac),既完成輸入信號的數字濾波,又同時編碼和解碼hart協議中的兩種頻率。
選擇μc
maxq系列risc μc具備上述所有必需的功能(圖4)。
模擬功能
maxq μc包含若干模擬功能。采用的時鐘管理方案只對當前使用的模塊提供時鐘。例如,如果一條指令用到數據指針(dp)和算術邏輯單元(alu),那么只給這兩個模塊提供時鐘。這一技術降低了功耗和開關噪聲。
低功耗
maxq μc具有先進的電源管理功能,通過動態(tài)地將μc處理速度與需要的性能水平相匹配,可使功耗降至最低。例如,工作量減少的情況下,功耗較低。要投入更多的處理能力時,μc就需要提高工作頻率。
軟件可選的時鐘分頻操作,允許靈活地選擇1、2、4或8個振蕩器周期作為一個系統時鐘周期。通過軟件實現這一功能,因此μc在不需要增加額外硬件成本的情況下即可進入低功耗狀態(tài)。
還可為那些對功耗極其敏感的應用提供另外三種低功耗模式:
pmm1: 256分頻電源管理模式
pmm2: 32khz電源管理模式(pmme = 1,其中pmme是系統時鐘控制寄存器的第2位)
停止模式(stop = 1)
在pmm1模式下,一個系統時鐘周期等于256個振蕩器周期,μc降速工作,從而大大降低了功耗。在pmm2模式下,器件以32khz振蕩器作為時鐘源,工作速度更低。使能的中斷源發(fā)生中斷時,可選的時鐘返回功能可使器件快速退出電源管理模式,并返回到更快的內部時鐘頻率上。這些使能的中斷源可以是外部中斷、uart和spi模塊。所有這些功能使maxq
μc的處理能力達到3mips/ma,性能遠遠超出最接近的其它處理器(圖5)。
信號濾波處理
maxq μc內部的mac完成4-20ma應用所需的信號處理功能。模擬信號輸入到adc,在數字域濾波采樣流。用以下等式可實現通用濾波功能:
y[n] = bix[n-i] + aiy[n-i]
式中,bi和ai分別表征系統的前饋和反饋響應特性。根據ai和bi的不同取值,數字濾波器可分為有限長沖激響應型(fir)或無限長沖激響應型(iir)。當系統不包含反饋(所有ai = 0)時,濾波器為fir型:
y[n] = bix[n-i]
然而,如果ai和bi都不為零,則濾波器是iir型。
從上面的fir濾波器方程可以看出,主要的數學運算是將各輸入采樣乘以一個常數,然后將n個乘積累加。下面這段c程序可說明該運算:
y[n]=0;
for(i=0; i
maxq μc的mac需要4 + 5n個周期完成此運算,代碼空間只有9個字(而傳統μc和mac需要12個字)。
move dp[0], #x ; dp[0] -> x[0]
move dp[1], #b ; dp[1] -> b[0]
move lc[0], #loop_cnt ; lc[0] -> number of samples
move mcnt, #init_mac ; initialize mac unit
mac_loop:
move dp[0], dp[0] ; activate dp[0]
move ma, @dp[0]++ ; get sample into mac
move dp[1], dp[1] ; activate dp[1]
move mb, @dp[1]++ ; get coeff into mac and multiply
djnz lc[0], mac_loop.
(maxq架構的數據存儲器訪問細節(jié)參見附錄)。
注意:在maxq的mac中,裝入第二個操作數時,自動執(zhí)行被請求的操作,運算結果存入mc寄存器。還須注意:溢出前,mc寄存器寬度(40位)可以累加大量的32位乘法結果。該功能是對傳統方法的改進,傳統方法在每次基本操作后都要驗證是否溢出。
maxq2000 μc的獨特性能
低功耗、16位risc微控制器maxq2000是maxim maxq家族的第一個成員。它具有液晶顯示器(lcd)接口,可驅動多達100
(-rbx)或132 (-rax)段。maxq2000極為適合血糖監(jiān)測應用,并且適合任何需要高性能、低功耗工作的應用。工作頻率最大為14mhz
(vdd > 1.8v)或20mhz (vdd > 2.25v)。
maxq2000含有32k字的閃存(適合原型設計和小批量生產)、1k字ram、3個14位定時器,以及1或2個通用同步/異步收發(fā)器(uart)。為了靈活起見,微控制器內核電源(1.8v)與i/o子系統電源獨立。超低功耗的休眠模式使maxq2000成為便攜式和電池供電設備的理想選擇。
maxq2000評估板
功能強大的maxq2000 μc可以利用其評估板(ev)進行評估,該評估板提供了完整的maxq2000硬件開發(fā)環(huán)境(圖6)。
maxq2000評估板具有下列特點:
板上maxq2000內核電源和vddio電源。
可調電源(1.8v至3.6v),可用作vddio或vlcd電源。
對應maxq2000所有信號和電源的插頭引腳。
獨立的lcd子板連接器。
lcd子板,裝有3v、3.5位靜態(tài)lcd顯示器。
連接串行uart (端口0)的rs-232電平驅動器,包括流量控制線。
外部中斷按鈕和微控制器系統復位按鈕。
max1407多功能adc/dac芯片,連接到maxq2000的spi總線接口。
1-wire接口和1-wire eeprom芯片。
條型led顯示,指示端口引腳p0.7至p0.0的電平狀態(tài)。
jtag接口,用于應用程序下載和在系統調試。
因此,maxq2000評估板具備了構建智能型4-20ma變送器需要的所有功能:具有真正乘法-累加單元(用于濾波和頻率編碼/解碼)的低功耗μc;轉換傳感器信號的adc;產生模擬輸出信號的dac
(圖7)。加上一個低功耗codec,如max1102,就可以實現一個hart調制解調器。
hart調制解調器的實現
如果系統包含1200hz和2200hz (分別代表1和0)頻率編碼器,同時要對這些頻率進行檢測,可以采用mac實現hart調制解調器要求的這些功能。
要產生所需的正弦波形,可以利用下述差分方程描述的兩極點濾波器形式實現遞歸數字式諧振器:
xn = k * xn-1 - xn-2,
式中,常數k等于2 cos(2*頻率/采樣率)??梢灶A先計算k的兩個值,并存在rom中。例如,要用8khz采樣率產生1200hz頻率,該值為k = 2 cos(2*1200/8000)。
必須計算能使振蕩器開始振蕩的初始激勵。如果 xn-1和 xn-2都為0,接下來的每個xn也都將為0。要啟動振蕩器,將 xn-1設為0, xn-2采用如下設置:
xn-2 = -a*sin[2(頻率/采樣率)]
在本例中,假設采用單位幅度的正弦波,該式簡化為 xn-2 = -1sin[(2(1200/8000)]。為進一步簡化編碼,首先,初始化兩個中間變量(x1, x2)。x1初始化為0,x2為初始激勵值(上面的計算結果),以啟動振蕩器。這樣,要產生一個正弦波的采樣,可進行下列運算:
x0 = kx1 - x2
x2 = x1
x1 = x0
每個新的正弦值都需要一次乘法運算和一次減法運算。利用maxq μc的單周期硬件mac,可以采用如下操作產生正弦波:
move dp[0], #x1 ; dp[0] -> x1
move mcnt, #init_mac ; initialize mac unit
move ma, #k ; ma = k
move mb, @dp[0]++ ; mb = x1, mc=k*x1, point to x2
move ma, #-1 ; ma = -1
move mb, @dp[0]-- ; mb = x2, mc=k*x1-x2, point to x1
nop ; wait for result
move @--dp[0], mc ; store result at x0.
因為我們只需要檢測兩種頻率,所以采用改進的goertzel算法,這種算法可以用簡單的二階濾波器實現(圖8)。
要使用goertzel算法檢測特定頻率,編譯時要首先使用下式計算出常數:
k = tone frequency/sampling rate
a1 = 2cos(2k)
隨后,將中間變量d0、d1和d2初始化為0,并對每個收到的采樣x進行下列計算:
d0 = x + a1*d1 - d2
d2 = d1
d1 = d0
得到足夠多的采樣值以后(采用8khz采樣率時,通常為205個采樣),用最新計算出的d1和d2值進行下列計算:
p = d12 + d22 - a1 * d1 * d2.
這時,p包含了輸入信號中測試頻率的平方。
要對兩種頻率解碼,我們用兩個濾波器處理每個采樣。每個濾波器都有自己的k值和自己的一組中間變量,每個變量都是16位長,所以,整個算法需要48字節(jié)的中間存儲器空間。
附錄. 訪問maxq系列的數據存儲器
可以通過數據指針寄存器dp[0]和dp[1],或者通過幀指針bp(偏移量)訪問數據存儲器。當其中一個寄存器被設置為數據存儲器的某個位置后,可以使用助記符@dp[0]、@dp[1]或@bp[offs]作為源或目標,來讀寫訪問該存儲器位置。
move dp[0], #0000h ; set pointer to location 0000h
move a[0], @dp[0] ; read from data memory
move @dp[0], #55h ; write to data memory
進行一次讀操作后,兩個數據指針中的任何一個都可以在操作完成后自動遞增或遞減。此外,任何一個數據指針都可以在寫操作之前預先遞增或遞減。使用下列語法規(guī)則:
move a[0], @dp[0]++ ; increment dp[0] after read
move @++dp[0], a[1] ; increment dp[0] before write
move a[5], @dp[1]-- ; decrement dp[1] after read
move @--dp[1], #00h ; decrement dp[1] before write
因為三個指針共享一個數據存儲器讀/寫口,所以用戶要使用特定指針進行數據存儲器讀操作前,必須有意識地激活該指針。如下所示,這可以通過使用數據指針選擇位(sdps1:0;dpc.1:0)直接實現,或者通過寫dp[n]、bp或offs寄存器間接實現。
使用數據指針進行間接存儲器寫操作時會設置sdps位,這隨后將激活寫指針,作為活動源指針。
move dpc, #2 ; (explicit) selection of fp as the pointer
move dp[1], dp[1] ; (implicit) selection of dp[1]; set sdps1:0=01b
move offs, src ; (implicit) selection of fp; set sdps1=1
move @dp[0], src ; (implicit) selection of dp[0]; set sdps1:0=00b
一旦指針選定后,在發(fā)生下列事件之前該指針一直有效:
源數據指針選擇位通過上述直接或間接方法改變(即選用另一個數據指針),或者
活動源數據指針所尋址的存儲器被使能用于提取代碼,這是使用指令指針實現的,或者
使用一個當前活動源指針之外的另一個數據指針進行存儲器寫操作。
move dp[1], dp[1] ; select dp[1] as the active pointer
move dst, @dp[1] ; read from pointer
move @dp[1], src ; write using a data pointer
; dp[0] is needed
move dp[0], dp[0] ; select dp[0] as the active pointer
為簡化數據指針的遞增/遞減操作,同時不影響寄存器數據,將系統模塊6內的7號寄存器指定為虛擬的nul目標,用作位存儲桶。數據指針遞增/遞減操作可以通過如下操作完成,而不會改變任何其它寄存器的內容:
move nul, @dp[0]++ ; increment dp[0]
move nul, @dp[0]-- ; decrement dp[0]
評論