1、用AD5933做的阻抗测量仪设计-带完整程序精品资料 基于AD5933的阻抗测量仪摘要:设计采用阻抗测量芯片AD5933,以低功耗高性能处理器LUMINARY615作为控制器,利用比例测量,DFT数字解调,软件校准和补偿等技术实现了对阻抗的高精度测量。通过外接模拟开关并通过软件设计实现了量程自动转换,并能在不同频率下进行测量,能通过良好的人机界面来实时控制与显示。测试结果表明,在一定范围内测量阻抗的幅值相对误差小于1%,实现了较高精度的阻抗测量。关键词: 阻抗测量 ; AD5933 ;自动量程转换 ;Luminay615目 录1. 系统设计 1.1 设计要求 1.2 方案比较与论证 1.2.1
2、 系统方案比较与论证 1.2.2 系统方案2. 系统硬件电路设计 2.1 处理器电路设计 2.2 阻抗测量电路设计 2.2.1 AD5933 简介2.2.2 AD5933工作原理2.2.4 测量电路3.软件设计 3.1 开发环境简介3.2 I2C通行协议简介3.2 软件设计 4.系统测试 4.1 测试仪器 4.2 测试方法及结果 4.3 误差分析5.总结6.参考文献附录1. 系统设计1.1设计要求要求设计一个较高精度的阻抗测量系统,并实现对阻抗的自动测量。1.2方案论证与比较1.2.1系统方案比较与论证方案一:电桥法电桥法是指在桥式电路的某部分施加一电压,通过调节电桥内部标准,一直到接于电桥电
3、路中的平衡指示器获得平衡指示。这时,位于电路未知端的器件和电桥电路的其它元件之间存在确定关系。一般来说,电桥法是传统阻抗测量中准确度最高方法,特别适于中值阻抗的测量。测量原理如图1.1所示。图1.1 电桥电路原理图 图1.1中Z1,Z2,Z3,Z4为电桥的四臂的阻抗,E为电桥的信号源,G为电桥的平衡指示器。当电桥桥路平衡时,Uab=0,桥路平衡指示器上无电流流过,根据基尔霍夫定律,I1=I2,I3=I4,Uca=Ucb,Uad=Ubd。 故I1Z1=I3Z3;I2Z2=I4Z4;以上两式相比得:Z1/Z2=Z3/Z4。这就是四臂电桥平衡的条件,当桥路中有3个桥臂为已知时,则未知量才可求得。因为
4、阻抗包含电阻分量和电抗分量,在调节已知阻抗使电桥达到平衡时,至少需要调节两个。在直流电桥中,因为各臂皆由纯电阻组成,故不需要考虑相位问题。对于交流电桥,各臂阻抗都等效为电阻分量和电抗分量。为了使电桥的平衡调节简单化,这两个调节阻抗元件的选择是非常重要的。最理想的调节参数是能够分别平衡被测阻抗中的电阻分量和电抗分量。因为阻抗电桥平衡的调节和相应的计算极为复杂,所以测量操作繁琐、费时,且测量范围受限,这给测量带来极大不便。方案二:谐振法谐振法是用电感和电容组成的串联或并联谐振电路,通过电压表或电流表来确定谐振点,而进行阻抗测量的一种方法。这种方法常用于测量电抗成分与电阻成分之比很大,并组成串联或并
5、联电路的阻抗。图1.2为一谐振电路,当被测元件Cx未连接时,电路谐振频率为: ( C0 为谐振时可调电容值)图1.2 谐振法测量阻抗当Cx接入后,保持f值不变,调节电容C的值使电路重新谐振,设此时C的值为C2,则Cx=C0-C2谐振法通常是测定回路的参量,而不是单个元件的参量。如果要用谐振法测定单个元件参量,只有在其它回路元件为已知或者它们对于回路的作用可以不予考虑的情况下才能实现,所以,谐振法不能用作高准确度阻抗测量,但谐振法具有宽频带 (1kHz至1000MHz),操作简单,适合于高Q元器件测量。方案三:矢量电压电流法矢量电压电流法是将测试信号电压加到被测件,测量信号电流流过被测件,然后由
6、电压和电流之比计算测试端的阻抗。这种方法可用多端测量结构,在电路中消除残余阻抗的影响同时测量电路比较简单、量程宽。电桥电路不需要使用通常的平衡控制,所以便于高速测量且操作容易。其工作原理如图1.3所示:图1.3 矢量电压电流法由精确的电阻R值便可实现阻抗的测量,容易得到下式:以上三种方案各有优缺,通过比较,结合设计要求,采用基于矢量电压电流法的阻抗测量芯片AD5933来实现阻抗测量,能达到高精度,高稳定度的要求,且容易实现。1.3 系统方案系统通过Luminary615作为控制器,对AD5933内部寄存器读写从而控制阻抗测量,外接模拟开关以实现不同量程范围内阻抗的测量。AD5933芯片内部集成
7、了内置温度传感器,数模转换器和模数转换器,频率发生器.扫描激励信号通过被测物后,再经过放大、滤波、模数转换,使其变为数字信号后经过DFT变换得到阻抗实部值与虚部值,通过与Luminary615进行I2C通信便可实现数据处理最终实现阻抗测量。系统设计框图如图1.4所示。图1.4 系统框图2. 硬件电路设计2.1 处理器电路设计Luminary Micro Stellaris系列微控制器是首款基于ARM CortexTM-M3 的控制器,它将高性能的32 位计算引入到对价格敏感的嵌入式微控制器应用中。这些堪称先锋的器件,价格与8 位和16 位器件相同,却能为用户提供32 位器件的性能,并且所有器件
8、都是以小型封装的形式提供。Stellaris 系列的LM3S615微控制器拥有ARM 微控制器所具有的众多优点,如拥有广泛使用的开发工具,片上系统(SoC)的底层结构IP 的应用,以及众多的用户群体。此外,控制器还采用了ARM 可兼容Thumb的Thumb-2 指令集来降低内存的需求量,进而降低成本。Luminary615最小系统电路图见附录图1.1。2.2 阻抗测量电路设计2.2.1 AD5933 芯片简介AD5933是一种高精度阻抗数字直接变换系统,主要由一个12位、1MSPS的片上频率发生器和一个片上模拟数字转换器(ADC)组成。频率发生器可以产生特定频率的信号激励外部复阻抗。复阻抗的响
9、应信号由片上模数转换器ADC采样后,再通过片上上数字信号处理器进行离散傅立叶变换(DFT)。在每个输出频率,DFT运算处理后都会返回一个实值(R)和虚值(I)。校正后,扫频轨迹上的每个频点的阻抗幅值和阻抗相对相位很容易计算。图2.1给出了AD5933的封装图,表2.1给出了AD5933的引脚定义。图2.2为AD5933内部框图。建议在使用时把所有的电源脚9、10、11都连到一起,统一连接到电源上,同样所有的地引脚12、13、14也都连接到一起,统一连接到系统地上。图2.1 AD5933引脚排列表2.1 AD5933引脚定义引脚标号引脚名称引脚描述1,2,3,7NC空引脚,没有定义4RFB外部反
10、馈电阻,连接在4和5之间来设置接受端电流电压转换放大器的增益5VIN输入到接受阻抗转换放大器,存在VDD/2的参考地6VOUT激励电压输出脚8MCLK芯片外部时钟输入,由用户提供9DVDD数字电源10AVDD1模拟电源111AVDD2模拟电源212DGND数字地13AGND1模拟地114AGND2模拟地215SDAI2C数据输入口,需要10k的上拉电阻连接到VDD16SCLI2C时钟输入口,需要10k的上拉电阻连接到VDD图2.2 AD5933内部框图2.2.2 AD5933工作原理用AD5933来实现阻抗测量,这种测量方法实质上是一种软测量方法,即在待测变量难于直接测量的情况下,进行与之相关
11、的易测变量的测量,并依据易测变量与待测变量之间的数学关系,建立数学模型,运用各种数学计算和估计方法,实现待测变量的测量10。AD5933有一个电压输出引脚Vout (图2.2)。它能发出一定频率的正弦扫描信号对外部阻抗 Z() 进行激励。信号通过被测样品后,再经放大、滤波后被模数转换器取样,并进行离散傅立叶变换,最终计算出待测阻抗值。AD5933是通过芯片内部的DDS(直接数字合成器)来产生正弦扫描信号,该信号具有小于1Hz的分辨率。为DDS提供时钟频率的,既可以是外部时钟,也可以是内置的振荡器,可通过软件进行设置。DDS合成的信号经过数模转换和放大后,即可变为测试需要的扫描激励信号。该正弦激
12、励信号有四个幅值可供选择,其值分别为2v,1v,400mv,200mv。而这些信号的起始频率,频率的增加量,和增加的次数,必须预先确定,它们都可通过软件进行设定。扫描激励信号通过被测物后,再经过放大、滤波、模数(AD)转换,使其变为数字信号。在这个过程中,反馈电阻RFB的选取至关重要,必须保证输入到AD转换器的电压,即Vout(Rf / Z)PGA(放大倍数),既不能超过模数转换器的最大电压,也不能太小(见图1)。这是因为电压太大AD转换器则会饱和,从而使信号失真。太小信号所含信息又不能够被充分利用。这两种情况都会使AD转换器不能工作在线性区域。我们必需通过选取合适的反馈电阻Rf,使Vout(
13、Rf / Z)PGA的数值处在一个适当的范围内以避免上述情况发生。AD转换器输出的数字信号,直接进入数字信号处理器进行离散傅立叶变换(DFT),傅立叶变换在每个扫描频率点上进行,其公式如下: 其中f是扫描点的频率,x(n)是AD转换器输出值,而cos(n)和sin(n)是在频率f下由DDS计算产生。计算的结果一般是一个复数。它的实部用R,虚部用I来表示。 这些就是我们建立被测阻抗数学模型所需的易测变量值。以下是详细计算过程。 (1) 幅值计算 阻抗测量的第一步是在每个扫频点,计算傅里叶变换的幅值,计算公式如下: 幅值= 上式中R为存储在地址为0x94和0x95寄存器中的实数;I为存储在地址为0
14、x96和0x97寄存器中的虚数(注)。例如:实数寄存器中的十进制数值为907,虚数寄存器寄存器中的十进制数值为516,则幅值= =1043.506。 (2) 增益系数计算增益系数的计算是在VOUT引脚和VIN引脚之间连接一个未知阻抗,进行系统校准计算完成的。该系数被确定后便可以测量计算任何阻抗值。下面是一个计算增益系数的例子:假设输出激励电压为2V(峰峰值),校正阻抗值为200K,PGA放大倍数是1倍,电流电压转换放大器增益电阻为200K,校正频率为30KHz。该频点经DFT转换后实数和虚数寄存器中的内容为: 实数寄存器=0xF064=-3996;虚数寄存器=0x227E=8830 ; 幅值=
15、 =9692.106 增益系数= = (1/200K)/9692.106=515.81910-12下面再给出一个已知增益系数、被测电阻的实部和虚部值计算被测电阻阻值的例子。假设被测电阻为510k,激励频率为30kHz,测量得到的实部和虚部值分别为1473和3507,则计算得到的模值为3802.863。 阻抗值= =1/(515.819E-123802.863) =509.791k。对于不同的测量频率点增益系数是不同的,所以在不同的频率点上要分别计算增益系数。在测量过程中可以通过限制电阻的测量范围来优化测量性能。 (3)相角计算及校准在阻抗测量过程中不仅仅要关注电阻的模值,还要知道相角的大小,相
16、角值=arctanI/R。和模值一样相角也要进行校准。首先对标定电阻进行测量,得到标定电阻的相角,测量电阻的实际相角等于测量计算得到的值减去标定电阻的相角值。值得注意的是测量时通过arctanI/R得到的相角是在-90到+90之间的,所以要根据R和I所决定的象限来把相角变换到所在象限内。如果R0则说明在第二象限,所以计算时要把相角加上180;如果R0,I0;n-) for(i=0;i10;i+); /-/ 函数原形:InitAD5933(void)/ 功能描述:AD5933初始化函数。/ 参数说明:无。/ 返回值:无/-void InitAD5933(void) ISend(AD5933_ad
17、dr,0x82,0x00); /start frequency delays(5); ISend(AD5933_addr,0x83,0xFA); /1kHz delays(5); ISend(AD5933_addr,0x84,0x05); delays(5); ISend(AD5933_addr,0x85,0x00); /increment frequency delays(5); ISend(AD5933_addr,0x86,0x31); /500Hz delays(5); ISend(AD5933_addr,0x87,0x81); delays(5); ISend(AD5933_addr,
18、0x88,0x01); /测量点数 delays(5); ISend(AD5933_addr,0x89,0xFF); delays(5); ISend(AD5933_addr,0x80,0xB1); /标准模式 delays(5); ISend(AD5933_addr,0x81,0x00); /选着内部时钟 delays(5); ISend(AD5933_addr,0x81,0x10); /复位AD5933 delays(5); ISend(AD5933_addr,0x81,0x00); delays(5); ISend(AD5933_addr,0x80,0x11); /初始化频率 delay
19、s(5); ISend(AD5933_addr,0x8A,0x03); /等待建立周期数 delays(5); ISend(AD5933_addr,0x8B,0xFF); delays(5); ISend(AD5933_addr,0x80,0x21); /启动频率扫描 delays(5); /-/ 函数原形:void display(unsigned int re,unsigned int im)/ 功能描述:显示函数。/ 参数说明:unsigned int re,unsigned int im ,实部和虚部/ 返回值:无/-void display(signed int re,signed
20、int im) unsigned char a11,y=0,x=0,i=0; signed int revalu=0,imvalu=0; float valu=0; double xishu=0,regist; long int ll; revalu=re; imvalu=im; if(revalu&0x8000) /把带符号的换算成无符号整数 revalu=(revalu-0x10000)*(-1); x=1; if(imvalu&0x8000) /把带符号的换算成无符号整数 imvalu=(imvalu-0x10000)*(-1); y=1; valu=sqrt(imvalu*imvalu
21、+revalu*revalu); /计算幅值 switch(j) case 0: if(valu8000) xishu=(1/(96.86810); /计算系数 xishu=(1/(xishu*valu)*100000+0.5; /计算阻值 ll=xishu-250; i=1; break; case 1: if(valu1350) xishu=(1/(13.33726); /计算系数 xishu=(1/(xishu*valu)*1000000+0.5; /计算阻值 ll=xishu-100; i=1; break; case 3: if(valu1050) xishu=(1/(10.3989
22、94); /计算系数 xishu=(1/(xishu*valu)*10000000+0.5; /计算阻值 ll=xishu; i=1; break; case 4: if(valu1000) xishu=(1/(96.736596); /计算系数 xishu=(1/(xishu*valu)*10000000+0.5; /计算阻值 ll=xishu; i=1; break; case 5: if(valu1060) xishu=(1/(21.006); /计算系数 xishu=(1/(xishu*valu)*100000000+0.5; /计算阻值 ll=xishu; i=1; break; case 6: if(valu800) xishu=(1/(96.527914); /计算系数 xishu=(1/(xishu*valu)*100000000+0.5; /计算阻值 ll=xishu;