主题中讨论的其他器件:ADS1148、
您好!
我正在使用 ADS1148 ADC、我正在读取0-16383而不是0-65536的值
有人能帮我解决这个问题吗
…
还有一个问题是、可以测量单个 AIN 引脚上的双极电压
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.
您好!
我正在使用 ADS1148 ADC、我正在读取0-16383而不是0-65536的值
有人能帮我解决这个问题吗
…
还有一个问题是、可以测量单个 AIN 引脚上的双极电压
我正在使用 ADS1148Q1 IC、并从 电位计施加0V 至+5V 的模拟输入、该电位计连接到 AN0引脚、所有其他模拟输入引脚均接地
使用的代码<>
//1)检查 DRDY 引脚上的 CRO
//2) SCK 引脚数据检查
//3)复位引脚连接到数字引脚
#include
int a = 555;
const 字节读取= 0b11111111;
#define RESET 7 //复位引脚
#define START 8 //开始条件引脚
#define DRDY 9 //数据就绪引脚
float d、e;
浮点平均值;
int cnt;
void setup()
{
Serial.begin(115200);
引脚模式(启动、输出);
引脚模式(RESET、输出);
引脚模式(DRDY、输入);
digitalWrite (RESET、HIGH);
digitalWrite (START、HIGH);//这用于 START 转换引脚以启动转换启动
SPI.begin();
digitalWrite (SS、low);
SPI.transfer (0x06);
延迟(1);
SPI.transfer (0x16);
SPI.transfer (0x40);
SPI.transfer (0x0E);
SPI.transfer (0x01);//MUX0
SPI.transfer (0x00);//VBIAS
SPI.transfer (0x30);//MUX1
SPI.transfer (0x08);//SYS0
SPI.transfer (0x00);//OFC0
SPI.transfer (0x00);//OFC1
SPI.transfer (0x00);//OFC2
SPI.transfer (0x00);//FSC0
SPI.transfer (0x00);//FSC1
SPI.transfer (0x40);//FSC2
SPI.transfer (0xA0);//IDAC0
SPI.transfer (0x00);//IDAC1
SPI.transfer (0x80);//GPIOCFG
SPI.transfer (0x00);//GPIODIR
SPI.transfer (0x80);//GPIODA
digitalWrite (SS、HIGH);
延迟(10);
digitalWrite (SS、low);
SPI.transfer (0x20);//从地址0开始读取
SPI.transfer (0x0E);//读取0xE + 1 = 15字节
uint8_t MUX_0 = SPI.transfer (0xFF);//读取多路复用器0
uint8_t VBIAS = SPI.transfer (0xFF);
uint8_t MUX_1 = SPI.transfer (0xFF);
uint8_t SYS0 = SPI.transfer (0xFF);
uint8_t OFC0 = SPI.transfer (0xFF);
uint8_t OFC1 = SPI.transfer (0xFF);
uint8_t OFC2 = SPI.transfer (0xFF);
uint8_t FSC0 = SPI.transfer (0xFF);
uint8_t FSC1 = SPI.transfer (0xFF);
uint8_t FSC2 = SPI.transfer (0xFF);
uint8_t IDAC0 = SPI.transfer (0xFF);
uint8_t IDAC1 = SPI.transfer (0xFF);
uint8_t GPIOCFG = SPI.transfer (0xFF);
uint8_t GPIODIR = SPI.transfer (0xFF);
uint8_t GPIODAT = SPI.transfer (0xFF);
digitalWrite (SS、HIGH);
延迟(5);
digitalWrite (SS、low);
SPI.transfer (0x04);
延迟(1);//sync 命令
digitalWrite (SS、HIGH);
}
void loop(){
if (digitalRead (DRDY)= low){
digitalWrite (SS、low);
延迟(7);
SPI.transfer (0x12);
延迟(1);
unsigned int high_byte = spi.transfer (0xFF);
延迟(1);
unsigned int low_byte = SPI.transfer (0xFF);
延迟(20);
digitalWrite (SS、HIGH);
unsigned int adc_data =(((uint16_t) high_byte)<< 8)|((uint16_t) low_byte);
serial.println ((adc_data * 4)& 0xFF00);
延迟(500);
}
}
您好、Vivek、
感谢您提供更多信息。
ADS1148-Q1不支持采用单极电源的接地基准输入。 如需更多信息、请参阅 ADS1148-Q1数据表中的公式3。 因此、您的配置无效、您应该在电阻分压器(POT)的高侧进行测量、而不是在低侧进行测量。
此外、请记住、ADS1148-Q1具有双极编码方案。 因此、ADC 输出代码的范围为-FS 至+FS、或-VREF/增益至+VREF/增益。 当您设置 MUX1 = 0x30h 时、即0011 0000b、用于选择 ADC 的内部2.048V 基准电压。 SYS0为0000 1000b、选择增益为1、数据速率为1000SPS。 这将建立一个-2.048V 至+2.048V 的 ADC 输出代码范围。 但是、您输入的是0-5V 电压、因此您可以看到如何无法实现 ADC 的整个满量程范围(位数)。 请纠正这些问题、您应该会看到更好的结果。
我还将指出、您使用的外部基准(MCP1541)是4.096V 基准。 但是、您可以施加到 ADS1148-Q1的最大差分基准电压为 AVDD - AVSS - 1V、在您的情况下仅为4V。 尽管 ADC 接近、但在使用4.096V 基准电压时、您仍会在其建议的条件之外操作 ADC。 如果您打算使用外部基准、请记住这一点。
布莱恩
您好、Bryan、
我在7通道双极 ADC 输入电压范围-2.5V 至+2.5V 的范围内执行了该电路。
我无法从渠道读取数据、请帮我解决任何其他解决方案、我无法在代码中识别此电路中的任何问题。
给定的电源
AVDD +2.5V、AVSS -2.5V
DVDD +3.3
//从通道读取数据的代码
//Arduino UNO 板
#include
uint8_t HIGH_BYTE[16];
uint8_t low_bytes[16];
uint16_t ADC_DATA;
uint8_t DATA_READY;
uint8_t received_val = 0;
#define RESET 7 //复位引脚
#define START 8 //开始条件引脚
#define DRDY 9 //数据就绪引脚
void setup(){
Serial.begin(9600);
引脚模式(RESET、输出);
引脚模式(启动、输出);
引脚模式(DRDY、输入);
digitalWrite (复位、低电平);
延迟(10);
digitalWrite (RESET、HIGH);
延迟(16);
SPI.begin();
digitalWrite (SS、low);
延迟(16);
SPI.transfer (0x06);
延迟(1);
SPI.transfer (0x14);//选择的连续数据读取模式7个通道
SPI.transfer (0x40);
SPI.transfer (0x0E);
SPI.transfer (0x00);//MUX0
SPI.transfer (0x00);//VBIAS
SPI.transfer (0x30);//MUX1
SPI.transfer (0x52);//SYS0
SPI.transfer (0x00);//OFC0
SPI.transfer (0x00);//OFC1
SPI.transfer (0x00);//OFC2
SPI.transfer (0x00);//FSC0
SPI.transfer (0x00);//FSC1
SPI.transfer (0x40);//FSC2
SPI.transfer (0x06);//IDAC0
SPI.transfer (0x89);//IDAC1
SPI.transfer (0x80);//GPIOCFG
SPI.transfer (0x00);//GPIODIR
SPI.transfer (0x80);//GPIODAT
digitalWrite (SS、HIGH);
延迟(10);
digitalWrite (SS、low);
SPI.transfer (0x20);//从地址0开始读取
SPI.transfer (0x0E);//读取0xE + 1 = 15字节
uint8_t MUX_0 = SPI.transfer (0xFF);//读取多路复用器0
uint8_t VBIAS = SPI.transfer (0xFF);
uint8_t MUX_1 = SPI.transfer (0xFF);
uint8_t SYS0 = SPI.transfer (0xFF);
uint8_t OFC0 = SPI.transfer (0xFF);
uint8_t OFC1 = SPI.transfer (0xFF);
uint8_t OFC2 = SPI.transfer (0xFF);
uint8_t FSC0 = SPI.transfer (0xFF);
uint8_t FSC1 = SPI.transfer (0xFF);
uint8_t FSC2 = SPI.transfer (0xFF);
uint8_t IDAC0 = SPI.transfer (0xFF);
uint8_t IDAC1 = SPI.transfer (0xFF);
uint8_t GPIOCFG = SPI.transfer (0xFF);
uint8_t GPIODIR = SPI.transfer (0xFF);
uint8_t GPIODAT = SPI.transfer (0xFF);
digitalWrite (SS、HIGH);
digitalWrite (SS、low);
SPI.transfer (0x04);
延迟(10);
}
void loop(){
digitalWrite (开始、高电平);
延迟(10);
digitalWrite (start、low);
DATA_READY = 1;
延迟(1);
while (data_ready = 1)
{
DATA_READY = digitalRead (DRDY);
}
for (int i=0;i<15;i++)//读取7个通道的14个字节数据
{
digitalWrite (SS、低电平);//low slave select 引脚
延迟(7);
// spi.transfer (0x12);
HIGH_BYTE[i]= SPI.transfer (0xFF);
low_byte[i]= SPI.transfer (0xFF);
延迟(20);
digitalWrite (SS、HIGH);
ADC_DATA[i]=(((uint16_t) high_byte[i])<< 8)|((uint16_t) low_byte[i]);//数据存储在数组中
serial.print (adc_data[i]);//adc 数据打印
}
}