《开放性实验报告基于F330的差分电容检测系统.doc》由会员分享,可在线阅读,更多相关《开放性实验报告基于F330的差分电容检测系统.doc(28页珍藏版)》请在三一办公上搜索。
1、西安邮电学院开放性实验报告-基于F330的差分电容检测系统班级:微电子0803姓名: 温长珍一 前言 电容传感器广泛的应用于多种检测系统中,用以测量诸如液位、压力、位移、加速度等物理量,但目前大部分电容测量方法集成化水平低、精度低,因而对电容特别是对微小电容的精确测量始终是一个很重要的课题。在某些场合,传感电容的变化量往往仅有几个皮法大小,这就对电容测量电路提出了更高的要求。 目前用于解决测量微小电容的方法主要有电荷转移法和交流法,这两种电路的基本测量原理是通过激励信号连续对电容充放电,形成与被测电容成比例的电流或电压信号,从而测量出被测电容值。它们的共同缺点是脉动噪声大,需使用滤波器及考虑相
2、位补偿,电路结构相对复杂,成本也较高。本次试验将利用AD7745 C-digital芯片设计微小电容检测电路,将电容信号转换成数字信号上传到F330单片机,然后输出示波器上。从而实现对微小电容或微小电容差的检测。二 设计目标 利用电容电压转换芯片和单片机实现数字式电容电压转换电路的功能,实现对微小电容或微小电容差的检测。三 设计内容 利用AD7745 C-digital芯片设计微小电容检测电路,其中AD7745与单片机C8051F330进行连接,F330做主机,AD7745做从机,AD7745与F330之间通过I2C总线协议进行连接,将AD7745的输出信号送至F330,并利用单片机内部自带的
3、数模转换功能将数字信号转换为模拟电压信号进行最后的输出,从而实现对微小电容或微小电容差的检测。 系统主要包括电源模块、电容转换模块、信号放大模块。其中电源模块主要是将15V的直流电压转换为3.3V来给F330和AD7745供电,电容转换模块是将电容信号转换成相应的数字信号,F330从AD7745中读出此数字信号之后经过相应的处理再输出。而信号放大模块是将F330的输出信号加以放大,从而能够更好的在示波器上显示出来。主要芯片介绍(只介绍本次试验使用到的部分) 1、F330 1.1存储系统C8051F330/1 器件是完全集成的混合信号片上系统型 MCU。CIP-51 有标准 8051 的程序和数
4、据地址配置。它包括 256 字节的数据 RAM,其中高 128字节为双映射。用间接寻址访问通用 RAM 的高128 字节,用直接寻址访问 128 字节的 SFR地址空间。数据 RAM 的低 128 字节可用直接或间接寻址方式访问。前 32 个字节为 4 个通用寄存器区,接下来的 16 字节既可以按字节寻址也可以按位寻址。程序存储器包含 8KB 的FLASH。该存储器以 512 字节为一个扇区,可以在系统编程,且不需特别的编程电压。 1.2指令系统CIP-51 采用流水线结构,与标准的 8051 结构相比指令执行速度有很大的提高。在一个标准的 8051 中,除 MUL和 DIV以外所有指令都需要
5、 12 或 24 个系统时钟周期,最大系统时钟频率为 12-24MHz。而对于 CIP-51 内核,70%的指令的执行时间为 1 或2个系统时钟周期,只有 4 条指令的执行时间大于 4 个系统时钟周期。CIP-51 工作在最大系统时钟频率 25MHz 时,它的峰值速度达到 25MIPS。 1.3片内调试电路C8051F330/1器件具有片内Silicon Labs 2线(C2)接口调试电路,支持使用安装在最终应用系统中的产品器件进行非侵入式、全速的在系统调试。 Silicon Labs的调试系统支持观察和修改存储器和寄存器,支持断点和单步执行。不需要额外的目标RAM、程序存储器、定时器或通信通
6、道。在调试时所有的模拟和数字外设都正常工作。当MCU单步执行或遇到断点而停止运行时,所有的外设(ADC和SMBus除外)都停止运行,以保持与指令执行同步。 1.4 I/O接口C8051F330有17个I/O引脚(两个8位口和一个1位口) 。C8051F330/1端口的工作情况与标准8051相似,但有一些改进。每个端口引脚都可以被配置为模拟输入或数字I/O。被选择作为数字I/O的引脚还可以被配置为推挽或漏极开路输出。在标准8051中固定的“弱上拉”可以被总体禁止,这为低功耗应用提供了进一步节电的能力。 数字交叉开关允许将内部数字系统资源映射到端口I/O引脚。可通过设置交叉开关控制寄存器将片内的计
7、数器/定时器、串行总线、硬件中断、比较器输出以及微控制器内部的其它数字信号配置为出现在端口I/O引脚。这一特性允许用户根据自己的特定应用选择通用端口I/O和所需数字资源的组合。 1.5 串行端口C8051F330/1系列MCU内部有一个SMBus/I2C接口、一个具有增强型波特率配置的全双工UART和一个增强型SPI接口。每种串行总线都完全用硬件实现,都能向CIP-51产生中断,因此需要很少的CPU干预。 1.6 10位电流输出DACC8051F330内部有一个10位电流方式数/模转换器(IDA0) 。IDA0的最大输出电流可以有三种不同的设置:0.5mA、1mA和2mA。IDA0具有灵活的输
8、出更新机制,允许无缝满度变化,支持无抖动波形更新。IDA0有三种更新方式:写IDA0H、定时器溢出或外部引脚边沿。 芯片信息 相关寄存器配置 2、AD7745 2.1 工作原理 AD7745的核心是一个高精度的转换器,由 1个二阶调制器和1 个三阶数字滤波器构成。AD7745可以配置成一个电容数字转换器(CDC),也可以配置成一个经典的模数转换器(ADC)。除了转换器外,AD7745集成了一个多路复用器、一个激励源和电容数模转换器(CAP-DAC)作为电容的输入、一个温度传感器、一个时钟发生器、一个控制校正逻辑、I2C接口。AD7745的功能框图如图 1 所示。下面对图中的主要部分进行功能说明
9、。(1)-调制器 -调制器是 AD7745的核心,它是将模拟信号转换成数字信号的器件,其工作原理是:被测的电容Cx被连接在CDC激励输出(EXCA或者EXCB)与-调制器输入(VIN(+)之间,在 1 个转换周期,一个方波激励信号(从 EXCA 或者EXCB 输出)被加到 CX,-调制器连续采样经过 CX 的电荷。数字滤波器处理-调制器的输出,数据经过数字滤波器输出,经过校正,由 I2C 串行接口将数据读出。 (2)电容数模转换器(CAPDAC) 电容数模转换器(CAPDAC)可以被理解成一个负电容直接内部连接到 CIN 引脚。在AD77415中有 2个 CAPDAC,一个连接到 CIN1(+
10、),另一个连接到 CIN1(一),如图 2所示。输入电容 CX,CY(差分模式下)与输出数据(DATA)之间的关系如下:电容数模转换器可以用来编程被测电容的输入范围,通过设置 CAPDAC(+)和CAPDAC(一)的值,可以改变被测电容的范围,比如在单端模式下,将 CAP-DAC设置成温度传感器4 pF,被测电容的变化范围成了 08 pF。 (3)I2C 串行接口 AC7745支持 I2C 兼容2线串行接口,I2C 总线上的 2 根线是 SCL(时钟)和 SDA(数据),所有的地址、控制和数据信息都通过这 2根线进行传输。2.2 引脚功能 AD7745的引脚分布如图 3 所示可知。各引脚功能描
11、述如下: SCL:I2C 串行时钟输入; RDY:逻辑输出。当该引脚信号的下降沿到来时,表示在已经使能的通道转换已经完成,同时新的数据已经到达该通道; EXCA,EXCB:CDC 激励输出。被测电容接在 EXC 引脚和CIN 引脚之间; REFIN(+),REFIN(-):差分参考电压输入; CIN1(-):在差分模式下,CDC 的负电容输入;在单端模式下,该引脚内部断开; CIN1(+):在差分模式下,CDC 的正电容输入;在单端模式下,CDC 的电容输入; NC:空管脚; VIN(+),VIN(-):ADC 的差分电压输入。此引脚同时连接外部温度探测二极管;GND:接地端; VDD:电源端
12、;2.75.25 V 单电源供电; SDA:双向I2C 串行数据线。2.3 AD7745的工作模式 (1) 差分模式 当被测电容传感器是差分式电容传感器,其连接方法如图 2所示,差分电容探测器的正电容输入连接到CIN1(+),负电容输入连接到CIN1(-)。通过I2C接口将AD7745中的电容设置寄存器(Cap Setup register)中的CAPDIF位设置成 1。 (2) 单端模式 当被测电容传感器是是单端电容传感器,其连接方法如图 4所示。可以通过设定CAPDAC(+)的值调整被测的电容传感器的输出范围。四 软件设计4.1、I2C协议规则4.1.1、I2C工作原理:I2C总线是由数据
13、线SDA和时钟线SCL构成的串行总线,可发送和接收数据。在主机和从机之间、从机与从机之间进行双向数据传输,串行的8位双向数据传输位速率在标准模式下可达100kb/s,快速模式下可达400kb/s,高速模式下可达3.4Mb/s。每个连接到总线上的器件都是并联在总线上的,即可以作为发送器也可以作为接收器,并且它们都有唯一的地址。I2C总线在传送数据过程中共有三种类型信号: 开始信号:SCL为高电平时,SDL由高电平向低电平跳变,开始传送数据; 结束信号:SCL为高电平时,SDL由低电平向高电平跳变,结束传送数据; 应答信号:接收数据的从机在接收到8bit数据后,向发送数据的主机发出特定的低电平脉冲
14、,表示已收到数据;主机向从机发出一个信号后,等待从控制器发出一个确认信号,主机接到确认信号后根据实际情况判断是否继续传递信号。4.1.2、AD7745应用I2C总线的读写过程:AD7745/6有一个固定地址,二进制数为1001000X,最低位为方向位,因此主机读操作时发送地址0x91,写操作时发送地址0x90。读操作过程:主机发送起始标志主机发送地址0x90从机回复确认标志主机发送寄存器地址值从机回复确认标志主机发起始标志主机发送地址0x91从机回复确认标志从机回复数据首字节主机发送确认标志从机回复最末字节主机不确认主机发送停止位写操作过程:主机发送起始标志主机发送地址0x90从机回复确认标志
15、主机发送寄存器地址值从机回复确认标志主机发送数据首字节从机回复确认标志主机发送最末数据字节从机发送确认标志主机发送停止位。主机连续读或写从机寄存器时,从机寄存器地址自动加1。4.2、流程图主程序流程图: F330初始化振荡器初始化:OSCICN=0xc3关闭看门狗:PCA0MD &= 0xBF开总中断:EA = 1端口初始化:XB0=0x04,XB1=0x40,P0SKIP = 0x0F定时器1初始化:产生总线时钟定时器3初始化:总线时钟超时检测SMbus初始化:SMB0CF = 0xDD,EIE1 |= 0x01内部DA初始化:IDA0CN |= 0xF2ad7745初始化CAP SET-U
16、P 0x07:0xA0EXC SET-UP 0x09:0x0BCONFIGURATION 0x0A:0x01读ad7745的状态寄存器电容转换是否完成,即读RDY位是否为0RDY = 1RDY = 0读CAP DATA REGISTER中24位数据把10位的数据写入IDA0RDY = 1中断处理程序流程图:启动中断处理程序判断状态向量SMB0CN & 0xF0发送从机地址主发送器模式0xC0主接收器模式0x80起始条件已发送0xE0停止传输再发送起始条件否ACK是否为1清除中断标志位SI=0是否否从机地址是否发送了寄存器地址是否发送是是停止传输释放总线发送数据写判断是读ad7745状态还是写状
17、态发送寄存器地址读发送起始条件更改LSB=1主接收器模式0x80保存RDY位读转换数据保存读出的数据读RDY位判断是读RDY位,还是读转换数据ACK=0发终止条件释放总线清除中断标志位SI=04.3、AD7745关键寄存器的配置1、 CAP DATA REGISISTER:这是一个24位的只读寄存器,它由三个8位的寄存器组成,这三个寄存器用来存储和不断的更新测得的电容信息寄存器地址指针位7位0Cap Data H0x010x00(高8位)Cap Data M0x020x00(中8位)Cap Data L0x030x00(低8位)2、CAP SET-UP REGISTER(电容频道设置): 地址
18、指针 0x07位位7位6位5位4位3位2位1位0助记符CAPENCIN2CAPDIFF-CAPCHOP默认值00000000本次实验值10100000说明:位7:CAPEN = 1使电容渠道单一的转换,连续的转换,和(或)校准位6:CIN2 = 1开关的内部信号到第二个电容式输入的AD7746位5:DIFF = 1设置差分模式为选定的电容输入位4 1:无效位,全部置0位0:CAPCHOP = 0表示特定的电容频道性能 CAPCHOP = 1加倍电容频道转化时间并且提高电容信道噪音性能为最长的转换时间3、EXC SET-UP REGISTER(电容频道激励设置): 地址指针 0x09位位7位6位
19、5位4位3位2位1位0助记符CLKCTRRLEXCONEXCBEXCAEXCLVL1EXCLVL0默认值00000011本次实验值00000011说明:位7:CLKCTRRL = 0 选择AD7745CLKCTRRL = 1 选择AD7746位6:EXCON = 0 只有在电容频道转换时激励信号呈现在输出端 EXCON = 1 在电容和电压/温度转换时激励信号都呈现在输出端位5:EXCB = 1使EXCB针为激励输出位4:EXCB = 1使EXCB针为反激励输出位3:EXCA = 1使EXCA针为激励输出位2:EXCA = 1使EXCA针为反激励输出位1位0:激励电压水平(都置1是灵敏度最高)
20、4、CONFIGURATION REGISTER(转换器更新速率和经营方式设置):地址指针 0x0A位位7位6位5位4位3位2位1位0助记符VTF1VTF0CAPF2CAPF1CAPF0MD2MD1MD0默认值10100011本次实验值00000001说明:位7位6:和本次实验无关位5位3:这三个位是用来设置电容频道数字滤波器和转换时间/更新速率的,三个位全置1时转换时间最长、更新速率最长,但数字滤波器的带宽最小,使得噪声最低位2位0:这三个位用来设置转换器的运作模式的MD2MD1MD0模式000空闲001连续010单一011挂起101校准5、CAP DAC A REGISTER(电容的DAC
21、设置):地址指针0x0B位位7位6位5位4位3位2位1位0标识符DACAENA DACA默认值0 0x00本次实验值 1 0x80说明:位7:DACAENA = 1连接电容的DACA到正的电容输入端位6位1:DACA的值,0x0、0 = 0 pf,0x7F = 满量程6、CAP DAC B REGISTER(电容的DAC设置):地址指针 0x0C位位7位6位5位4位3位2位1位0标识符DACAENB DACA默认值0 0x00本次实验值 1 0x80说明:位7:DACAENB = 1连接电容的DACB到负的电容输入端位6位1:DACB的值,0x00代表0 pf,0x7F代表满量程4.4、F33
22、0相关寄存器的配置1、 时钟设置 TR0=0; /关闭定时器0 TMOD=0x20; /设置定时器1的工作方式 CKCON=0x01; /定时器使用系统4分频 TL1=0xef; /给定时器1 TH1=0xef; / 装初值 TR1=1; /允许定时器12、IDA0设置IDA0CN=0xf2; /IDA0使能,写IDA0H触发DAC输出更 新,2.0mA满度输出电流。3、交叉开关设置 P0MDIN=0xff; /P0.n引脚不被配置为模拟输入 P0MDOUT=0xCD; P0SKIP=0x0f; /交叉开关跳过P0.00.3 XBR0=0x04; /SMBUS连到端口引脚 SMB0CF=0xc
23、d; / 配置SUM配置寄存器,使能 XBR1=0xc0; / 交叉开关使能 4、 中断 EIE1=0x81; /允许SMBUS中断 EIP1=0x01; /设SMBUS中断优先级为高 IE=0x80; /开总中断 SI = 0; / SM_BUSY中断标志位清0 4.5、程序data unsigned char a0,a1,a2;data float c;unsigned char data i,j,k,l;#include #include bit SMB_BUSY;bit flag;bit SEND_START;bit add_shujv;bit w_r; /主接收模式,主发送模式标志b
24、it flag1; /等待标志位bit flag2; /*系统初始化*/ / 忙碌标志位 void system_initial (void) k=0; PCA0MD &= 0x40; /关闭看们狗/*设置定时器1,功能:用来提供总线的时钟源 将总线的频率设置为208kHz* TR0=0; /关闭定时器0 TMOD=0x20; /设置定时器1的工作方式/ CKCON=0x01; /定时器使用系统4分频 TL1=0xef; /给定时器1 TH1=0xef; / 装初值 TR1=1; /允许定时器1/*IDA0设置* IDA0CN=0xf2; /IDA0使能,写IDA0H触发DAC输出更新,2.0
25、mA满度输出电流。 /*交叉开关和SUMBUS设置* P0MDIN=0xff; P0MDOUT=0xCD; P0SKIP=0x0f; /交叉开关跳过P0.00.3 XBR0=0x04; /SMBUS连到端口引脚 SMB0CF=0xcd; / 配置SUM配置寄存器,使能 XBR1=0xc0; / 交叉开关使能 /*中断使能* EIE1=0x81; /允许定时器3和SMBUS中断 EIP1=0x01; /设定定时器3中断为低优先级,SMBUS中断为高 IE=0x80; /开总中断 SI = 0; / SM_BUSY中断标志位清0 /*初始化Ad7745*void ad_chushi(void) w
26、_r=0; SEND_START=0; i=0; /全局变量置初值0, add_shujv=0; flag=0; STA=1; /产生起始条件 while(!flag); /等待配置ad7745寄存器/*读数据*void read(void) flag1=0; flag2=0; j=0; STA=1; / 产生起始条件 while(!flag1); /*数据转换* datachange (a0,a1,a2) IDA0H=a0; IDA0L=a1;/*主程序*void main() system_initial(); ad_chushi(); while(1) read(); datachang
27、e(a0,a1,a2); /*中断程序*void SMBus_ISR (void) interrupt 7 k=SMB0CN; l=k&0xE0; if(!flag2)switch (l) case 0xE0: SEND_START=1; SI = 0; STA = 0; STO=0; SMB_BUSY=1; /发送了起始条件 if(!w_r) SMB0DAT = 0x90; if(i5) w_r=1; / 发送从机地址和写 else SMB0DAT=0x91;STO=0;w_r=0;flag2=1; break; case 0xC0: if (ACK) / 地址或者数字字节已经发出 if (
28、SEND_START) / 已经发送过起始条件和从机地址? if(!w_r) while(i5) /将从机寄存器地址装入 if(!add_shujv) switch(i) case 0: add_shujv=1;SMB0DAT=0x07;break; case 1: add_shujv=1;SMB0DAT=0x09;break; case 2: add_shujv=1;SMB0DAT=0x0A;break; case 3: add_shujv=1;SMB0DAT=0x0B;break; case 4: add_shujv=1;SMB0DAT=0x0C;break; else switch(i)
29、 case 0: SMB0DAT=0xA0;add_shujv=0;i+;break; case 1: SMB0DAT=0x0B;add_shujv=0;i+;break; case 2: SMB0DAT=0x01;add_shujv=0;i+;break; case 3: SMB0DAT=0x80;add_shujv=0;i+;break; case 4: SMB0DAT=0x80;add_shujv=0;i+;break; SI=0;break; if(i=5) STO=1;SI=0;flag=1;i+; /产生结束条件 else SMB0DAT=0x01; SI=0; w_r=1; SE
30、ND_START=0; else STA=1;STO=0;SI=0; else STA=1;STO=0;SI=0; break; case 0x80: if(j=0) a0=SMB0DAT;ACK=1;SI=0;j+; else if(j=1) a1=SMB0DAT;ACK=1;SI=0; j+; else if(j=2) a2=SMB0DAT;ACK=0;SI=0;STA=0;STO=1;flag1=1; break; else SI=0;flag2=0; 五 实验测试结果5.1 单电容的测试(08P)单端模式:CAPDIFF=0 CAPDACA(+) = 8p CAPDACB(-) = 0
31、p1、测试结果电容2.02.23.04.75.06.27.08.29.010电压0.6930.6980.3700.7880.8101.101.321.531.762.052、 数据分析为了画出输出电压V关于电容差C的曲线将以上数据用MATLAB软件进行分析,结果如图51: 图51 图51中的曲线近似于图52中的直线: 图52经过近似计算输出电压V和电容C的函数关系为:Y=-1/3+(7/30)*X5.2 差分电容的测试(C1,C2均为0到4P之间)(CAPDIFF=1 CAPDACA(+) = 0p CAPDACB(-) = 0p)1、反复测量取平均值,舍去明显不合理的数据,得到以下数据列表:
32、电容差-3.4 -2.9-2.8-2.7-2.6-2.5-2.4-2.3-2.1-2输出电流0.2080.3300.2780.3400.3220.3700.3290.40.4140.504电容差-1.8 -1.6-1.5-1.3-1.2-1-0.8-0.6-0.5-0.4输出电流0.5790.5920.6420.6320.7010.710.7280.8280.8580.952电容差-0.3 -0.200.20.50.60.70.811.2输出电流0.9180.9720.9850.9921.111.141.121.241.231.27电容差1.31.5 1.61.8 1.922.12.32.42
33、.5输出电流1.341.351.391.441.341.471.471.591.651.6电容差2.62.7 2.9 3.13.4输出电流1.671.661.611.791.722、 数据分析 为了画出输出电压V关于电容差C的曲线将以上数据用MATLAB软件进行分析,绘制出的输出电压V关于电容差C的曲线图如下53: 图53 从以上曲线图可以看出输出电压与差分电容的大小呈现线性关系。在图上作出以下近似直线。 图54 经过计算可以得到输出电压V关于电容差C的函数关系为: V=-0.24*C+0.99六、 误差分析 (1)电容不太标准, (2)AD7745是一个24位分辨率的模数转换器,而F330内部的DA是一个10位分辨率的数模转换器,在进行数据转换时存在一定的误差 (3)手工焊接的电路板,可能有些地方焊接得不好,接触不良七、 实验心得(遇到的问题及解决方案)这次开放性试验让我对单片机有了一个更深刻的认识,熟悉了I2C总线规则,从读单片机资料开始到画流程图、编写程序、调试程序,一步步走来虽然遇到了很多挑战但也确实收获颇多。开始的时候我们设想,把从AD7745中读出的24位的数据经过等比例取舍成10位的数,然后再输出,因为这样精度更高。但是调试中发现,如果对24位的数据进行乘除法计算会非常耗时。所以只取读出来24位数据的高10位。