AD5933阻抗转换器、网络分析仪初步实验 您所在的位置:网站首页 芯片阻抗测试方法 AD5933阻抗转换器、网络分析仪初步实验

AD5933阻抗转换器、网络分析仪初步实验

2024-03-17 13:16| 来源: 网络整理| 查看: 265

 

■ 简介

AD5933阻抗变换模块 是基于AD(ANALOG DEVICES)公司 的 AD5933 芯片的阻抗转换器、网络分析仪。此外,AD公司还提供了一款小型的 AD5934 。

▲ AD5933阻抗转换器

▲ AD5933阻抗转换器

该模块在TMALL上的零售价格为¥188。

D5933是一款高精度的阻抗转换器系统解决方案,片上集成频率发生器与12位、1 MSPS的模数转换器(ADC)。用频率发生器产生的信号来激励外部复阻抗,外部阻抗的响应信号由片上ADC进行采样,然后由片上DSP进行离散傅里叶变换(DFT)处理。DFT算法在每个频率上返回一个实部®数据字和一个虚部(I)数据字。然后根据实部数据字与虚部数据字可计算出待测器件的阻抗值与相位值。

模块特性 可编程输出峰峰值激励电压,输出频率高可达100 kHz可编程频率扫描功能和串行I2C®接口频率分辨率:27位( sscanf(SDA(1), "%x", &nNumber); AD5933ReadBlock((unsigned char)nNumber, ucDim); for(i = 0; i AD5933WriteByte(0x80, 0x90); WaitTime(10); AD5933SetPointer(0x92); AD5933ReadBlock(2, ucDim); nNumber = ucDim[0]; nNumber = nNumber * 256 + ucDim[1]; printf("%d\r\n", nNumber); } else IFARG0("reada") { AD5933SetPointer(0x80); for(i = 0; i sscanf(SDA(1), "%x", &nNumber); ucAdd = (unsigned char)nNumber; sscanf(SDA(2), "%x", &nNumber); i = (unsigned char)nNumber; AD5933WriteByte(ucAdd, i); } else IFARG0("writei") { sscanf(SDA(1), "%x", &nNumber); ucAdd = (unsigned char)nNumber; sscanf(SDA(2), "%x", &nNumber); AD5933SetPointer(ucAdd); AD5933WriteBlock(2,(unsigned char *)&nNumber); } else IFARG0("writel") { sscanf(SDA(1), "%x", &nNumber); sscanf(SDA(2), "%lx", &lnNumber); AD5933SetPointer((unsigned char)nNumber); AD5933WriteBlock(3, ((unsigned char *)&lnNumber) + 1); } else IFARG0("readd") { AD5933SetPointer(0x94); AD5933ReadBlock(4, ucDim); printf("%0bx %0bx %0bx %0bx", ucDim[0], ucDim[1], ucDim[2], ucDim[3]); if(STD_NUM == 1) printf("\r\n"); } else IFARG0("reads") { AD5933SetPointer(0x8f); printf("%0bx", AD5933ReadByte()); if(STD_NUM == 1) printf("\r\n"); }

 

04PYTHON程序测试

建立 ad5933.py,利用MCU的接口命令,完成对AD5933的操作。

1.读取温度 ad5933temperature Control registger(0x80) = 0x90 读取:0x92,0x93: 数值处理:将读取的数值乘以 0.03125.

▲ 温度数值与转换结果之间的关系 0.8

▲ 温度数值与转换结果之间的关系

下面的曲线是从AD5933内部读取的数值,在此过程中,使用手指触摸芯片,可以引起芯片的温度上下波动。所以芯片内的温度传感器对于环境温度还是非常敏感的。 ▲ 从AD5933内部读取的温度曲线

▲ 从AD5933内部读取的温度曲线

▲ 处于静止状态下,读取的AD5933内部温度传感器的曲线。

▲ 处于静止状态下,读取的AD5933内部温度传感器的曲线。

2.设置输出激励信号 setsweep(startf, incf, num, oscf)

如下是设置输出频率为30kHz, 幅值为2Vp-p的波形。 实际测量的参数:频率:29.608; 电压RSM= 0.695V。

设置输出激励电压

设置输出激励电压

频率的偏差 设置100kHz, 实际使用DM3068输出的频率为98.695kHz。原来假定的频率 f 0 o s c = 16.776    M H z f_{0osc} = 16.776\,\,MHz f0osc​=16.776MHz。经过修规:

经过上述修正之后, 实际输出聘用:99.993MHz。

3. 使用模块的AD8606缓冲

将模块的运放缓冲连接上。可以增加模块对于低电阻的测量能力。相关的实验在下一次的时候继续验证。

 

※ 结论

通过制作基于STC8G1(SOP8)的I2C接口板,可以使用上位机通过WiFi-UART来控制和读取AD5933的内部寄存器。完成信号的输出和测量结果。

更加详细的测量和应用。需要按照使用手册的要求进行标定和测量。相关的应用在后面的实验中陆续给出。

相关的交叉引用文档 //============================================================================== // PROCESS THE DEBUG BUFFER //------------------------------------------------------------------------------ void SerialDebugProcessBuffer(void) { unsigned int nNumber; unsigned char ucDim[8], i, ucAdd; unsigned long lnNumber; SerialDebugBuffer2Argument(); if(g_ucSDANumber == 0) return; if(strcmp("hello", (char *)STD_ARG[0]) == 0) printf("%s is ready !\r\n", VERSION_STRING); else IFARG0("setp") { sscanf(SDA(1), "%x", &nNumber); AD5933SetPointer((unsigned char)nNumber); printf("Set Pointer:%d\r\n",nNumber); } else IFARG0("readb") { sscanf(SDA(1), "%x", &nNumber); AD5933ReadBlock((unsigned char)nNumber, ucDim); for(i = 0; i AD5933WriteByte(0x80, 0x90); WaitTime(10); AD5933SetPointer(0x92); AD5933ReadBlock(2, ucDim); nNumber = ucDim[0]; nNumber = nNumber * 256 + ucDim[1]; printf("%d\r\n", nNumber); } else IFARG0("reada") { AD5933SetPointer(0x80); for(i = 0; i sscanf(SDA(1), "%x", &nNumber); ucAdd = (unsigned char)nNumber; sscanf(SDA(2), "%x", &nNumber); i = (unsigned char)nNumber; AD5933WriteByte(ucAdd, i); g_ucTime0MS = 0; g_ucTime0MS100 = 0; if(STD_NUM > 3) { for(;;) { AD5933SetPointer(0x8F); // Set the pointer to status register address:0x8F ucAdd = AD5933ReadByte(); if(ucAdd & 0x2) break; } i = g_ucTime0MS; ucAdd = g_ucTime0MS100; AD5933SetPointer(0x94); AD5933ReadBlock(4, ucDim); nNumber = ucDim[0]; nNumber = (nNumber sscanf(SDA(1), "%x", &nNumber); sscanf(SDA(2), "%lx", &lnNumber); AD5933SetPointer((unsigned char)nNumber); AD5933WriteBlock(3, ((unsigned char *)&lnNumber) + 1); } else IFARG0("readd") { AD5933SetPointer(0x94); AD5933ReadBlock(4, ucDim); nNumber = ucDim[0]; nNumber = (nNumber i = 0x1; if(STD_NUM > 1) { sscanf(SDA(1), "%x", &nNumber); i = (unsigned char)nNumber; } for(nNumber = 0; nNumber AD5933SetPointer(0x8F); // Set the pointer to status register address:0x8F ucAdd = AD5933ReadByte(); if(ucAdd & 0x2) break; } if((ucAdd & 0x4)) continue; } AD5933SetPointer(0x94); AD5933ReadBlock(4, ucDim); nNumber = ucDim[0]; nNumber = (nNumber AD5933SetPointer(0x8F); // Set the pointer to status register address:0x8F ucAdd = AD5933ReadByte(); if(ucAdd & 0x2) break; } AD5933SetPointer(0x94); AD5933ReadBlock(4, ucDim); nNumber = ucDim[0]; nNumber = (nNumber 0: stm32cmd('writeb 80 31 1') else: stm32cmd('writeb 80 31') def repeatf(resultflag = 0): if resultflag > 0: stm32cmd('writeb 80 41 1') else: stm32cmd('writeb 80 41') def readdata(): return stm32cmdata('readd', wait=100) def sweep(code=0x1): stm32cmd('CLEAR') time.sleep(.02) stm32cmd('sweep %x'%code) #------------------------------------------------------------ if __name__ == '__main__': tdim = [] for i in range(10): data = temperature() tdim.append(data) time.sleep(.1) printf(tdim) #------------------------------------------------------------ # END OF FILE : AD5933.PY #============================================================

实验电路板AD工程文件:AD\Test\2020\AD5933\AD59338G1K.PcbDoc * ↩︎

下位机软件工程:C51\STC\Test\2020\AD5933\AD59338G1K\AD59338G1K.uvproj ↩︎



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有