我遇到了个问题,使用CS5532-bsz 选择了单极性模式 参考电压VERF+为5V ,VERF-为0 把AD的输入端AIN+和AIN-都接到地上,即此时输入端的信号为0,按照数据手册说明此时对应的输出值应该为0x000000 ,为什么我得到的数值却报溢出了 输出值一直是0x00000004 ,模拟输入短路位置后 输出值是0x00000004 还是溢出 我把AD的输入端悬空后,增益选择64倍 时 输出为0XFFFFFF04 ,增益为1倍时 输出0x00000004.选择双极性模式则不会溢出 ,输入端短路接地后 读出的值为0XFFBE2600 悬空时 增益选择64倍读出的值为0XFFFFFF04
请问这是什么原因造成的 ?
我画PCB板时 DGND没有接在模拟地上 接在了数字地上 。
我很着急,项目时间很紧,谢谢了!!!
(附有原理图文件和PCB图文件,用的软件是AD10)
程序代码:
#include "67k22.h"
#define CS5532_CS LATDbits.LATD3 //定义CS5532的片选位
volatile u32 CS5532_RV;
volatile u32 temp;
volatile u32 temp1;
/*----------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------
*函数名称:CS5532_init
*函数功能:CS5532进行初始化
*输入参数:无
*输出参数:无
-------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------*/
u8 SPI_SendData(u8 SendData);
void delayms(unsigned int m);
void CS5532_init(void)
{
u8 i;
u32 High1_Byte;
u32 Mid1_Byte;
u32 Low1_Byte;
u32 AddLow1_Byte;
CS5532_CS=0;
delayms(100);
for(i=0;i<15;i++)
{
CS5532_CS=0;
SPI_SendData(0XFF);//发送复位命令:15个字节0XFF,1个字节0XFE;
CS5532_CS=1;
}
CS5532_CS=0;
SPI_SendData(0XFE);
CS5532_CS=1;
delayms(500);
CS5532_CS=0;
SPI_SendData(0X03); //写复位命令,将RS置1
SPI_SendData(0X20);
SPI_SendData(0X00);
SPI_SendData(0X00);
SPI_SendData(0X00);
CS5532_CS=1;
delayms(100);
CS5532_CS=0;
SPI_SendData(0X0b); //读配置寄存器命令
CS5532_CS=1;
Nop();
Nop();
CS5532_CS=0;
High1_Byte=SPI_SendData(0X00); //读配置寄存器中的值
Mid1_Byte=SPI_SendData(0X00);
Low1_Byte=SPI_SendData(0X00);
AddLow1_Byte=SPI_SendData(0X00);
CS5532_CS=1;
CS5532_RV=High1_Byte<<24|Mid1_Byte<<16|Low1_Byte<<8|AddLow1_Byte;
while(CS5532_RV!=0X10000000);
delayms(1);
CS5532_CS=0;
SPI_SendData(0X03); //写配置位命令
SPI_SendData(0X00);
SPI_SendData(0X08);
SPI_SendData(0X00);
SPI_SendData(0X00);
CS5532_CS=1;
delayms(1);
CS5532_CS=0;
SPI_SendData(0X05); //写通道设置寄存器命令
SPI_SendData(0X02); //增益为64,采样速率为25sps
SPI_SendData(0X40); //单极性
SPI_SendData(0X02);
SPI_SendData(0X40);
CS5532_CS=1;
delayms(1);
// CS5532_CS=0;
// SPI_SendData(0X15); //写通道设置寄存器命令
// SPI_SendData(0X02); //增益为64,采样速率为25sps
// SPI_SendData(0X41); //单极性
// SPI_SendData(0X72);
// SPI_SendData(0X41);
CS5532_CS=1;
delayms(1);
CS5532_CS=0;
SPI_SendData(0XC0); //单次转换80,连续转换C0,写转换命令
CS5532_CS=1;
}
/*----------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------
*函数名称:CS5532_Sampling
*函数功能:CS5532进行采样
*输入参数:无
*输出参数:temp
-------------------------------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------------------------*/
u32 CS5532_Sampling()
{
u8 i,k;
volatile u32 High_Byte,Mid_Byte,Low_Byte,AddLow_Byte;
volatile u32 High_Byte2,Mid_Byte2,Low_Byte2,AddLow_Byte2;
// delayms(500);
// CS5532_CS=0;
// SPI_SendData(0X80); //单次转换80,连续转换C0,写转换命令
// LATF=0x00;
// CS5532_CS=1;
//delayms(4000);
while(PORTEbits.RE2!=0); //AD转换完成后,SDO输出0
for(i=0;i<1;i++)
{
CS5532_CS=0;
SPI_SendData(0X00); //用于清SDO标志位
CS5532_CS=1;
}
CS5532_CS=0; //读AD转换的值 31-8位
High_Byte=SPI_SendData(0X00);
Mid_Byte=SPI_SendData(0X00);
Low_Byte=SPI_SendData(0X00);
AddLow_Byte=SPI_SendData(0X00);
CS5532_CS=1;
temp=High_Byte<<24|Mid_Byte<<16|Low_Byte<<8|AddLow_Byte;
return temp;
} |