阻抗转换器AD5933使用总结及分析(1)

电路小白

微信公众号:实在太懒于是不想取名


前言:    

    2023年6月,在我们学校电子设计竞赛校赛中我们设计一个RCL测量仪,使用AD9833进行扫频后,利用异或门得到前后信号的相位差,以及使用峰值检波获得有效值。

图1.1  我们制作的实际电路

老师也评价我们的作品像是重庆立交

但是在实际使用后测量精度感人,但是这种扫频的思想确实大有可说。


AD5933模块的制作

    AD5933是ADI公司发布的一款集12位/1Mbs ADC、12位信号发生器、内部硬件1024个DFT、标准I2C通讯协议的阻抗转换器。

     于是我们决定使用AD5933进行网络分析,AD5933的芯片价格在49+左右,但其模块在TB上一块的价格可以高达498元,综合考虑(我的钱包替我考虑)我们觉得采购一块芯片自己制版。

图2.1 PCB的3D效果图

       经过某一次教训,这次的制板上在电源部分考量极深,将数字地与模拟地,数字电源与模拟电源均进行了隔离并进行了0欧姆电阻分离(因为芯片的引脚上数模分开了)但是在实际使用过程中发现,数字地与模拟地的合并对芯片功能影响不大。于是焊接过程中改用磁珠连接。

图2.2 底层铺铜处理


  AD5933使用

如果可以,我不想再经历这几天调模块的过程了!!!

在使用过程中,参考芯片手册进行I2C对芯片进行启动

图3.1 I2C时序图

参照芯片手册的寄存器部分对0x80寄存器写入0x20启动频率扫描,设置寄存器DDS输出电压为2Vp-p

    图3.2 控制寄存器部分

但是这BYD死活不输出,经过了大半天的折磨,感谢我的好队友买的逻辑分析仪(事实证明这玩意,一万年不用,一用就是省一万年!)我发现在I2C时序上,通讯地址、命令、数据均正确,但是Stop停止信号并不能正常触发。于是我翻看商家(其他组有买498的模块)给的例程中发现竟是其I2C时序出现了问题,于是在修改I2C时序后,芯片可以正常的输出电压。证明芯片调试正确。

             图3.3 逻辑分析仪演示


  AD5933数据处理

在AD5933的芯片手册中提到,芯片返回了阻抗测量结果的实部、虚部我们通过对实部虚部进行处理获得了导纳,取倒数得到阻抗,但是这个得到的阻抗需要进行校准,官方提供了如下的校准过程以及二点法校准过程。

 图4.1 校准过程

我们在校准过程中发现,阻抗的输出结果与实际的阻抗结果成线性关系,于是研究了其原理后,我们使用了matlab测量纯阻性数据后进行了拟合,获得了阻抗数据以及对阻抗结果和频率的关系进行了数据修正

 图4.2 阻抗与频率的数据修正

在实际使用中测量阻抗过程,纯阻性器件的测量结果与实际结果误差小于5%。并且我们也发现了测量不同种类的器件的时候扫频结果具有很大差异!!

 图4.3 电感测量中虚部与频率变化图

图4.4 电容测量中虚部与频率变化图

图4.5 电阻测量中虚部与频率变化图

通过对扫频结果的分析,加上数据处理,可以成功的判断出器件的类型以及精确的测量出器件的标值,精度在1%左右!

### 回答1AD5933是一款高精度阻抗测量芯片,可以测量复阻抗值的实部和虚部。下面是一个基于STC12C5A60S2的AD5933测量程序的框架,你可以根据自己的需求进行修改: ```c #include <reg52.h> #include <intrins.h> #define AD5933_ADDRESS 0x0D // AD5933地址 #define CONTROL_REG_ADDRESS 0x80 // 控制寄存器地址 #define START_FREQ_ADDRESS 0x82 // 起始频率地址 #define FREQ_INCR_ADDRESS 0x85 // 频率步进地址 #define NUM_INCR_ADDRESS 0x88 // 步进数目地址 #define SETTLING_CYCLES_ADDRESS 0x8B // 稳定周期地址 #define TEMP_ADDRESS 0x92 // 温度地址 #define REAL_DATA_ADDRESS 0x94 // 实部数据地址 #define IMAG_DATA_ADDRESS 0x96 // 虚部数据地址 #define SCL P1_5 #define SDA P1_6 unsigned char i; // 循环计数器 // 向I2C总线发送一个字节 void i2c_send_byte(unsigned char dat) { unsigned char i; for(i = 0; i < 8; i++) { SDA = (dat & 0x80) >> 7; dat <<= 1; _nop_(); SCL = 1; _nop_(); SCL = 0; } _nop_(); SDA = 1; _nop_(); SCL = 1; _nop_(); while(SCL == 0); } // 从I2C总线读取一个字节 unsigned char i2c_read_byte() { unsigned char i, dat = 0; for(i = 0; i < 8; i++) { dat <<= 1; _nop_(); SCL = 1; _nop_(); dat |= SDA; SCL = 0; } return dat; } // 向AD5933写入一个字节的数据 void write_ad5933(unsigned char reg_address, unsigned char dat) { i2c_start(); i2c_send_byte(AD5933_ADDRESS << 1); i2c_send_byte(reg_address); i2c_send_byte(dat); i2c_stop(); } // 从AD5933读取一个字节的数据 unsigned char read_ad5933(unsigned char reg_address) { unsigned char dat; i2c_start(); i2c_send_byte(AD5933_ADDRESS << 1); i2c_send_byte(reg_address); i2c_start(); i2c_send_byte((AD5933_ADDRESS << 1) | 0x01); dat = i2c_read_byte(); i2c_stop(); return dat; } // 初始化AD5933 void init_ad5933() { unsigned char i; // 设置控制寄存器 write_ad5933(CONTROL_REG_ADDRESS, 0x00); // 设置起始频率 write_ad5933(START_FREQ_ADDRESS, 0x00); write_ad5933(START_FREQ_ADDRESS + 1, 0x80); write_ad5933(START_FREQ_ADDRESS + 2, 0x00); // 设置频率步进 write_ad5933(FREQ_INCR_ADDRESS, 0x00); write_ad5933(FREQ_INCR_ADDRESS + 1, 0x00); write_ad5933(FREQ_INCR_ADDRESS + 2, 0x00); // 设置步进数目 write_ad5933(NUM_INCR_ADDRESS, 0x00); write_ad5933(NUM_INCR_ADDRESS + 1, 0x01); // 设置稳定周期 write_ad5933(SETTLING_CYCLES_ADDRESS, 0x00); write_ad5933(SETTLING_CYCLES_ADDRESS + 1, 0x01); // 开启外部系统时钟 write_ad5933(CONTROL_REG_ADDRESS, 0x10); } // 读取AD5933的实部和虚部数据 void read_ad5933_data(unsigned char *real_data, unsigned char *imag_data) { unsigned char temp; // 等待数据就绪 while((read_ad5933(CONTROL_REG_ADDRESS) & 0x04) == 0); // 读取实部数据 write_ad5933(REAL_DATA_ADDRESS, 0x00); *real_data = read_ad5933(REAL_DATA_ADDRESS + 1); // 读取虚部数据 write_ad5933(IMAG_DATA_ADDRESS, 0x00); *imag_data = read_ad5933(IMAG_DATA_ADDRESS + 1); } // 主程序 void main() { unsigned char real_data, imag_data; // 初始化AD5933 init_ad5933(); while(1) { // 读取阻抗测量数据 read_ad5933_data(&real_data, &imag_data); // 在这里处理数据 // ... } } ``` 在程序中,我们首先定义了AD5933的I2C地址以及各个寄存器的地址。然后我们通过定义SCL和SDA引脚的宏来操作I2C总线。在i2c_send_byte函数和i2c_read_byte函数中,我们实现了I2C总线的发送和接收操作。通过write_ad5933和read_ad5933函数,我们可以向AD5933芯片写入数据或者从AD5933芯片读取数据。在init_ad5933函数中,我们设置了AD5933的各项参数,包括起始频率、频率步进、步进数目等。在read_ad5933_data函数中,我们读取了AD5933的实部和虚部数据,并返回给主程序进行处理。 在主程序中,我们首先初始化AD5933,然后进入一个无限循环,在循环中不断读取阻抗测量数据,并进行相应的处理。你只需要在程序中加入你自己的处理代码,就可以实现测量不同阻抗值的功能了。 ### 回答2: STC12c5a60s2是一款单片机,P1.6引脚与SDA引脚相连,P1.5引脚与SCL引脚相连。AD5933是一款测量电阻的芯片,我们需要使用STC12c5a60s2与AD5933进行通信,并编写程序以不断测量不同阻抗的值。 首先,我们需要在Keil中创建一个新的工程。然后,我们需要配置STC12c5a60s2的GPIO引脚,将P1.6设置为SDA引脚,将P1.5设置为SCL引脚。 接下来,我们需要加载AD5933的驱动程序,并初始化AD5933芯片。在初始化期间,我们需要设置AD5933的工作模式和其他参数,例如反馈电阻为10k欧姆。 然后,我们需要编写一个循环,以便不断测量不同阻抗的值。在每次循环中,我们需要发送一个开始命令给AD5933,然后等待AD5933完成测量。之后,我们需要读取AD5933的测量结果,并处理该结果。 在处理AD5933的测量结果时,我们可以将其显示在屏幕上或存储在一个数组中。我们还可以与其他设备进行通信,将结果发送给其他设备进行进一步处理或显示。 需要注意的是,AD5933的具体使用方法和命令可以在其数据手册中找到。我们需要根据实际需求和硬件连接来编写程序,并进行适当的调试和测试,以确保测量结果的准确性和可靠性。 总之,通过使用Keil编写程序,我们可以控制STC12c5a60s2与AD5933进行通信,并不断测量不同阻抗的值。这将使我们能够进行电阻的测量和分析,从而满足各种应用需求。 ### 回答3: STC12c5a60s2是一款单片机,其中的P1.6引脚与SDA引脚相连,P1.5引脚与SCL引脚相连。反馈电阻选择10k欧姆,用keil编写程序来实现AD5933的不断测量不同阻抗值的功能。 首先,在keil中创建一个新的工程,并选择STC12C5A60S2作为目标芯片。然后,引入AD5933的库文件,该库文件包含了AD5933的相关函数和定义。 接下来,需要初始化AD5933芯片。首先,通过I2C总线与AD5933进行通信,将P1.5引脚配置为SCL引脚,P1.6引脚配置为SDA引脚。之后,使用AD5933库函数进行初始化设置,包括设置参考电压、增益和输出频率等。 在测量过程中,可以根据需求来设置不同的阻抗值。通过AD5933库函数设置起始频率、终止频率和步长等参数,然后使用AD5933的频率扫描功能,按照步长逐渐改变频率值,并将测量结果存储在指定的变量中。可以通过AD5933的库函数将测量结果输出到串口或者显示设备上。 为了实现连续测量不同阻抗值的功能,可以使用循环结构进行控制。在循环中不断改变AD5933的频率参数,然后进行测量,最后延时一段时间后继续下一次的测量。可以根据需要设置延时的时间间隔,以控制测量的频率。 最后,可以根据实际的需求来处理测量结果。例如,可以通过串口将结果输出到上位机进行进一步分析和处理,或者将结果保存至存储设备中进行备份和记录。 总之,通过使用keil编写程序,结合STC12c5a60s2单片机AD5933芯片的功能,可以实现不断测量不同阻抗值的功能。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值