前言
本设计中采用AD5522进行参数测量,通过控制字控制芯片内部寄存器来完成测量,可完成FVMI,FIMV等不同测量模式。通过MCU对芯片进行逻辑控制,主要设计了参数控制、模式切换程序和外部扩展量程的继电器控制逻辑。通过网口/串口完成数据上传,最终通过上位机显示测量数据曲线。
一、四通道参数测量单元
(1)四通道参数测量单元PMU
电压驱动(FV)
电流驱动(FI)
测量电压(MV)功能
测量电流(MI)功能
(2)四个可编程电流范围(内部RSENSE)
±5μA、 ±20μA、 ±200μA、 ±2mA、可扩展量程
(3)一个可编程电流范围、最高达±80mA(外部RSENSE)
(4) 集成16位可编程DAC
(5)支持片增益和偏置校正
(6)支持FI电压箝位和FV电流箝位
二、功能框图
三、具体设计
设计采用qt+STM32方式,上位机可以选择测量单元单通道进行测量,测量分为进行手动和自动测量方式。测量模式可选择FIMV或者FVMI模式进行测量。
通讯部分上位机和MCU通讯,设计了简单通讯协议用于握手和控制PMU单元进行测量。
1.上位机部分代码
if (m_Send_charBuff[3] == 1&& m_MeansOut_Guard==10)
{
AD5522_CMD_WriteProgramSYS = 0x3C0000;
ProgramPUMCode = 0xF200000;
ProgramX1Code = 0xFC00000;
}
else if (m_Send_charBuff[3] == 2 && m_MeansOut_Guard == 10)
{
AD5522_CMD_WriteProgramSYS = 0x3C0000;
ProgramPUMCode = 0xF200000;
ProgramX1Code = 0xFC00000;
}
else if (m_Send_charBuff[3] == 3 && m_MeansOut_Guard == 10)
{
AD5522_CMD_WriteProgramSYS = 0x3C0000;
ProgramPUMCode = 0xF200000;
ProgramX1Code = 0xFC00000;
}
else if (m_Send_charBuff[3] == 4 && m_MeansOut_Guard == 10)
{
AD5522_CMD_WriteProgramSYS = 0x3C0000;
ProgramPUMCode = 0xF200000;
ProgramX1Code = 0xFC00000;
}
if (m_Send_charBuff[3] == 1 && m_MeansOut_Guard == 5)
{
AD5522_CMD_WriteProgramSYS = 0x3C0040;
ProgramPUMCode = 0xF200000;
ProgramX1Code = 0xFC00000;
}
else if (m_Send_charBuff[3] == 2 && m_MeansOut_Guard == 5)
{
AD5522_CMD_WriteProgramSYS = 0x3C0040;
ProgramPUMCode = 0xF200000;
ProgramX1Code = 0xFC00000;
}
else if (m_Send_charBuff[3] == 3 && m_MeansOut_Guard == 5)
{
AD5522_CMD_WriteProgramSYS = 0x3C0040;
ProgramPUMCode = 0xF200000;
ProgramX1Code = 0xFC00000;
}
else if (m_Send_charBuff[3] == 4 && m_MeansOut_Guard == 5)
{
AD5522_CMD_WriteProgramSYS = 0x3C0040;
ProgramPUMCode = 0xF200000;
ProgramX1Code = 0xFC00000;
}
if (m_Send_charBuff[2]==0x01)
{
ProgramPUMCode= 0x001000;
if (m_Send_charBuff[4] ==0X01)
{
ProgramPUMCode = 0x1200;
ProgramX1Code = 0xD0000;
//ProgramX1Code = 0x80000;
}
else if (m_Send_charBuff[4] ==0X02)
{
ProgramPUMCode = 0x9200;
ProgramX1Code = 0xD0000;
//ProgramX1Code = 0x90000;
//AD5522_CMD_WriteProgramDACOffset = 0xF89A492;
}
else if (m_Send_charBuff[4] ==0X03)
{
ProgramPUMCode = 0x11200;
ProgramX1Code = 0xD0000;
//ProgramX1Code = 0xA0000;
}
else if (m_Send_charBuff[4] ==0X04)
{
ProgramPUMCode = 0x19200; //19200
ProgramX1Code = 0xD0000;
//ProgramX1Code = 0xB0000;
//AD5522_CMD_WriteProgramDACOffset = 0xF8BA492;
}
else if (m_Send_charBuff[4] == 0X05)
{
ProgramPUMCode = 0x21200;
ProgramX1Code = 0xD0000;
}
}
else
{
if (m_Send_charBuff[4] == 0X01)
{
Rsense = 200000;
ProgramPUMCode = 0x83200;
ProgramX1Code = 0x80000;
}
else if (m_Send_charBuff[4] == 0X02)
{
Rsense = 50000;
ProgramPUMCode = 0x8b200;
ProgramX1Code = 0x90000;
}
else if (m_Send_charBuff[4] == 0X03)
{
Rsense = 5000;
ProgramPUMCode = 0x93200;
ProgramX1Code = 0xA0000;
}
else if (m_Send_charBuff[4] == 0X04)
{
Rsense = 500;
ProgramPUMCode = 0x9b200;
ProgramX1Code = 0xB0000;
}
else if (m_Send_charBuff[4] == 0X05)
{
Rsense = 100;
ProgramPUMCode = 0xA3200;
ProgramX1Code = 0xC0000;
}
}
//发送数据
m_Message_charBuff[0] = 0x7E;//帧头
m_Message_charBuff[1] = 0x7E;
m_Message_charBuff[2] = AD5522_CMD_WriteProgramSYS;//系统控制器
m_Message_charBuff[3] = AD5522_CMD_WriteProgramSYS>>8;
m_Message_charBuff[4] = AD5522_CMD_WriteProgramSYS>>16;
m_Message_charBuff[5] = AD5522_CMD_WriteProgramSYS>>24;
m_Message_charBuff[6] = AD5522_CMD_WriteProgramPUM;//PUM控制器
m_Message_charBuff[7] = AD5522_CMD_WriteProgramPUM>>8;
m_Message_charBuff[8] = AD5522_CMD_WriteProgramPUM>>16;
m_Message_charBuff[9] = AD5522_CMD_WriteProgramPUM>>24;
m_Message_charBuff[10] = AD5522_CMD_WriteProgramX1;//DAC控制器
m_Message_charBuff[11] = AD5522_CMD_WriteProgramX1>>8;
m_Message_charBuff[12] = AD5522_CMD_WriteProgramX1>>16;
m_Message_charBuff[13] = AD5522_CMD_WriteProgramX1>>24;
m_Message_charBuff[14] = AD5522_CMD_WriteProgramM;//M增益控制器
m_Message_charBuff[15] = AD5522_CMD_WriteProgramM>>8;
m_Message_charBuff[16] = AD5522_CMD_WriteProgramM>>16;
m_Message_charBuff[17] = AD5522_CMD_WriteProgramM>>24;
m_Message_charBuff[18] = AD5522_CMD_WriteProgramC;//C偏置控制器
m_Message_charBuff[19] = AD5522_CMD_WriteProgramC>>8;
m_Message_charBuff[20] = AD5522_CMD_WriteProgramC>>16;
m_Message_charBuff[21] = AD5522_CMD_WriteProgramC>>24;
m_Message_charBuff[22] = AD5522_CMD_WriteProgramDACOffset;//DAC偏置控制器
m_Message_charBuff[23] = AD5522_CMD_WriteProgramDACOffset >> 8;
m_Message_charBuff[24] = AD5522_CMD_WriteProgramDACOffset >> 16;
m_Message_charBuff[25] = AD5522_CMD_WriteProgramDACOffset >> 24;
m_Message_charBuff[26] = 1; //m_Send_charBuff[6]; //更新寄存器
m_Message_charBuff[27] = m_Send_charBuff[3]; //通道号
m_Message_charBuff[28] = 0xFF;//帧尾
2.MCU部分代码
{
AD5522_Write_Data(AD5522_CMD_WriteProgramSYS);//写AD5522寄存器 //0x80080
}
if((GPIOD->IDR& GPIO_IDR_IDR_15)) //当BUSY信号为高时
{
AD5522_Write_Data(AD5522_CMD_WriteProgramDACOffset);//写AD5522寄存器 //0x80080
}
if((GPIOD->IDR& GPIO_IDR_IDR_15)) //当BUSY信号为高时
{
AD5522_Write_Data(AD5522_CMD_WriteProgramX1);//写AD5522寄存器 //AD5522_CMD_WriteProgramX1
}
if((GPIOD->IDR& GPIO_IDR_IDR_15)) //当BUSY信号为高时
{
AD5522_Write_Data(AD5522_CMD_WriteProgramPUM);
}
3.具体测试
具体测试量晶体二极管特性和电阻特性曲线,测试结果如图所示。
(1) 晶体二极管IV特性测定
(2) 电阻IV特性测定
四、总结
此次设计在应用中也碰到一些问题,通过实战应用中都得到了解决,在此也简单的记录下。当然开发不易珍惜每一分原创和劳动成果,同时注意平时开发过程中的经验积累总结。该工程已经在现有的工程项目中得到了应用和验证,如有需要了解详细的设计可以联系 QQ:309967512