Init_Data[0] =0x90; // 地址 + 写命令(写地址0x90,读地址0X91)
Init_Data[1] =0x01; // 指向配置寄存器
Init_Data[2] =0x54; // 配置字高字节,采用-2.048到+2.048,选择AINp1输入,AINPn为GND
Init_Data[3] =0x83; // 配置字低字节,选择转换速率即通信速率
这是对1115的配置 为什么实际当中只能采到0.6多一点的电压 再大就不行了
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
Init_Data[0] =0x90; // 地址 + 写命令(写地址0x90,读地址0X91)
Init_Data[1] =0x01; // 指向配置寄存器
Init_Data[2] =0x54; // 配置字高字节,采用-2.048到+2.048,选择AINp1输入,AINPn为GND
Init_Data[3] =0x83; // 配置字低字节,选择转换速率即通信速率
这是对1115的配置 为什么实际当中只能采到0.6多一点的电压 再大就不行了
adcx=adc_get_agin();
LCD12864_DATA3(4,0,adcx);
temp=(float)adcx*((float)2048*2/65535);
LCD12864_DATA3(3,3,(uint)((temp)));
这应该没有错吧
你这temp=(float)adcx*((float)2048*2/65535);是什么意思?输入大于0.6以后的输出一直是饱和的7FFFh吗
uint ReadData_ADS1115(void) {
uchar ResultL,ResultH;
uint Result;
SCL_H;
I2CforADS1115_Start();
I2CforADS1115_WriteByte(0x91);
ResultH=I2CforADS1115_ReadByte();
I2CforADS1115_NOACK();//非应答一定要,表示我还要数据
ResultL=I2CforADS1115_ReadByte();
I2CforADS1115_NOACK();
I2CforADS1115_Stop();
Result=ResultH*256+ResultL;
return Result;
}
我的adcx就是这里的result 超过0.6也不是固定的 都比0.6小 我都没有涉及到补码啊 我那个temp是用来显示的数据 参考电压2.048*2 16位就被分成65535份 这样对吗
你这个读取段应该没问题,但是temp=(float)adcx*((float)2048*2/65535)明显是错了,建议你先看一下datasheet上数据输出格式,这个数据是有正负的,用的是二进制补码表示形式
如果你输入的都是正电压,可以这样:temp=(float)adcx*((float)2048/32767),另外看一下你的编译器能不能支持这样的计算。另外,建议你直接输出内码到屏幕,即直接显示出result的值,然后用笔算一下看看电压对不对,再增加电压看看内码是否增加
能不能麻烦你看看具体的转换公式是怎样的 英语不好 芯片手册找了半天没有看到 正的 怎么处理 负的怎么处理
uint ReadData_ADS1115(void) {
uint ResultL,ResultH;
uint Result; SCL_H;
I2CforADS1115_Start();
I2CforADS1115_WriteByte(0x91);
delay_us(10);
ResultH=I2CforADS1115_ReadByte();
I2CforADS1115_NOACK();//非应答一定要,表示我还要数据
delay_us(10); ResultL=I2CforADS1115_ReadByte();
I2CforADS1115_NOACK(); I2CforADS1115_Stop();
Result=(ResultH<<8)|ResultL;
if(Result>0x7fff)
Result=~Result+1;//用于测量负电压,负电压从8000~ffff,负电压与正关于0有类似对称关系,按位取反后+1相同
return Result;
}
我的配置完善了下 你看看 可是还是只能采到0.6多