时间:2009-04-23 10:15
人气:
作者:admin
典型的4-20mA电流环电路包括四个部分:传感器/变送器、电压-电流转换器、环路电源和接收器/监视器。在环路供电的应用中,传感器驱动电压-电流转换器,其他三个部分串联连接,构成闭环回路(图1)。

图1. 4-20mA环路供电电路框图
智能型变送器可以对增益和失调进行校准,通过将传感器模拟信号数字化(如RTD传感器和热电偶)实现线性化处理,用驻留在µC内部的数学算法处理信号,再将数字信号转换回模拟信号,结果以标准电流的形式沿环路传输。
最新的第三代4-20mA变送器(图2)被认为是“增强型智能”变送器。它们增加了与4-20mA信号共享双绞线的数字通信功能。所提供的通信通道在传输传感器数据的同时,还可传输控制和诊断信号。

图2. 4-20mA增强型智能变送器框图
智能型变送器所使用的通信标准是Hart协议,该协议基于Bell 202电话通信标准,采用频移键控(FSK)方式。其数字信号1和0分别由1200Hz和2200Hz频率表示。这些频率的正弦波叠加在传感器的直流模拟信号上,同时提供模拟和数字通信(图3)。

图3. 模拟和数字信号同时通信
因为FSK信号的平均值始终为零,4-20mA模拟信号在此过程中不受影响。数字状态每秒钟可以转换两到三次,而不会妨碍模拟信号。允许的最小环路阻抗为23。
图4. MAXQ µC架构框图
软件可选的时钟分频操作,允许灵活地选择1、2、4或8个振荡器周期作为一个系统时钟周期。通过软件实现这一功能,因此µC在不需要增加额外硬件成本的情况下即可进入低功耗状态。
还可为那些对功耗极其敏感的应用提供另外三种低功耗模式:
在PMM1模式下,一个系统时钟周期等于256个振荡器周期,µC降速工作,从而大大降低了功耗。在PMM2模式下,器件以32kHz振荡器作为时钟源,工作速度更低。使能的中断源发生中断时,可选的时钟返回功能可使器件快速退出电源管理模式,并返回到更快的内部时钟频率上。这些使能的中断源可以是外部中断、UART和SPI模块。所有这些功能使MAXQ µC的处理能力达到3MIPS/mA,性能远远超出最接近的其它处理器(图5)。

图5. MAXQ与其他竞争产品的MIPS/mA性能比较。
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; iMAXQ µ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架构的数据存储器访问细节参见附录)。注意:在MAXQ的MAC中,装入第二个操作数时,自动执行被请求的操作,运算结果存入MC寄存器。还须注意:溢出前,MC寄存器宽度(40位)可以累加大量的32位乘法结果。该功能是对传统方法的改进,传统方法在每次基本操作后都要验证是否溢出。
MAXQ2000含有32k字的闪存(适合原型设计和小批量生产)、1k字RAM、3个16位定时器,以及1或2个通用同步/异步收发器(UART)。为了灵活起见,微控制器内核电源(1.8V)与I/O子系统电源独立。超低功耗的休眠模式使MAXQ2000成为便携式和电池供电设备的理想选择。
MAXQ2000评估板
功能强大的MAXQ2000 µC可以利用其评估板(EV)进行评估,该评估板提供了完整的MAXQ2000硬件开发环境(图6)。

图6. MAXQ2000评估板方框图
MAXQ2000评估板具有下列特点:

图7. 基于MAXQ2000 µC的4-20mA变送器
要产生所需的正弦波形,可以利用下述差分方程描述的两极点滤波器形式实现递归数字式谐振器:
Xn = k * Xn-1 - Xn-2,
式中,常数k等于2 cos(2
*频率/采样率)。可以预先计算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)。

图8. 利用简单的二阶滤波器实现Goertzel算法
要使用Goertzel算法检测特定频率,编译时要首先使用下式计算出常数:
k = tone frequency/sampling rate a1 = 2cos(2随后,将中间变量D0、D1和D2初始化为0,并对每个收到的采样X进行下列计算:k)
D0 = X + a1*D1 - D2 D2 = D1 D1 = D0得到足够多的采样值以后(采用8kHz采样率时,通常为205个采样),用最新计算出的D1和D2值进行下列计算:
P = D12 + D22 - a1 * D1 * D2.这时,P包含了输入信号中测试频率的平方。
要对两种频率解码,我们用两个滤波器处理每个采样。每个滤波器都有自己的k值和自己的一组中间变量,每个变量都是16位长,所以,整个算法需要48字节的中间存储器空间。
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进行一次读操作后,两个数据指针中的任何一个都可以在操作完成后自动递增或递减。此外,任何一个数据指针都可以在写操作之前预先递增或递减。使用下列语法规则:
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一旦指针选定后,在发生下列事件之前该指针一直有效:
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]
上一篇:自动重试控制器套装在电信中应用