工具/软件:
您好、
我无法 在固定通道模式下、读取 ADC 通道中的数据、数据不正确。
我向通道 o 的输入通道施加 0.5V 电压、该值不对应于 0.5V。
请指导我 出现任何配置问题或此处的阅读方法错误。
为了快速陈述和我觉得通道选择和指定读取的通道是错误的好处,但我不确定,你可以把一些光照.
如果我在这里找到解决方案,这将是很大的帮助。提前感谢。
相匹配
PWDN 和 RESET — 在 3.3V、100k 的电压下上拉引脚
AVDD -+5V
VREFP — 在软件中配置为内部基准
VREFN - DGND_/如果我使用内部基准、是否需要连接?
AVSS、VREFN、 AINCOM - GND
CLKSEL — 未连接
XTAL1- XTAL2 - ADS1258EVM 板中的 32.768kHz 晶体连接//默认连接
DRDY — 控制器通用输入//用于监控数据就绪时的引脚就绪
SPI 连接 — 与微控制器的标准连接
//软件配置
SPI — 模式 0、1Mhz
//Registry Configuration
#define DAQ_DRV_REG_ADDR_CONFIG0 ((uint8_t) 0x00)
#define DAQ_DRV_REG_ADDR_CONFIG1 ((uint8_t) 0x01)
#define DAQ_DRV_REG_ADDR_MUXSCH ((uint8_t) 0x02)
#define DAQ_DRV_REG_ADDR_MUXDIF ((uint8_t) 0x03)
#define DAQ_DRV_REG_ADDR_MUXSG0 ((uint8_t) 0x04)
#define DAQ_DRV_REG_ADDR_MUXSG1 ((uint8_t) 0x05)
#define DAQ_DRV_REG_ADDR_SYSRED ((uint8_t) 0x06)
#define DAQ_DRV_OPCODE_READ_DIRECT ((uint8_t) 0x00)
#define DAQ_DRV_OPCODE_READ_COMMAND ((uint8_t) 0x30) // Includes MUL bit
#define DAQ_DRV_OPCODE_RREG ((uint8_t) 0x40)
#define DAQ_DRV_OPCODE_WREG ((uint8_t) 0x60)
#define DAQ_DRV_OPCODE_PULSE_CONVERT ((uint8_t) 0x80)
#define DAQ_DRV_OPCODE_RESET ((uint8_t) 0xC0)
/* Commands byte masks */
#define DAQ_DRV_OPCODE_C_MASK ((uint8_t) 0xE0)
#define DAQ_DRV_OPCODE_MUL_MASK ((uint8_t) 0x10)
#define DAQ_DRV_OPCODE_A_MASK ((uint8_t) 0x0F)
static void daq_drv_ADS1158Init()
{
// Want to configure the Internal Reference for the Voltage, Single ended ADC, want to read all 16 channels one after the other once ADC read command triggered and Ready pin goes low and High,indicating Ready tor ead the Data
uint8_t l_ucRegDataArray[10];
l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG0] = 0b00100000;//Fixed Channel Mode,Rest all Disabled(SPIRST,
l_ucRegDataArray[DAQ_DRV_REG_ADDR_CONFIG1] = 0;
l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSCH] = 0xFF;//Not sure , this should be enabled, no proper description in the datasheet
l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXDIF] = 0;//Since its not diffrention ADC to be read
l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG0] = 0;//Initially diasbled
l_ucRegDataArray[DAQ_DRV_REG_ADDR_MUXSG1] = 0;//Initially diasbled
l_ucRegDataArray[DAQ_DRV_REG_ADDR_SYSRED] = 0b00100000;//Internal Reference for the ADC is Enabled
// SInce GPIO's are not used Not configured for any pins
daq_drv_WriteMultipleRegisters(0, 7,l_ucRegDataArray);// For to Write Multiple registry
}
static void daq_drv_WriteMultipleRegisters(uint8_t startAddress, uint8_t count, const uint8_t *regData)
{
s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | DAQ_DRV_OPCODE_MUL_MASK | (startAddress & DAQ_DRV_OPCODE_A_MASK);
memcpy(&s_ucDataTx[1],regData,count);//Copy the dat for Writing Multiple registries
daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,(1 + count));//Transmit through SPI
}
static int32_t daq_drv_AdcRead(uint8_t l_ucAdcChId, uint8_t l_ucTimeoutVal)
{
uint8_t l_ucRdyStatus;
unsigned long runningms;
static uint8_t s_ucRegistrySwitched;
//Select Channel
if(l_ucAdcChId < 8)
{
if( s_ucRegistrySwitched )
{
// Clear the DAQ_DRV_REG_ADDR_MUXSG1
s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG1 & DAQ_DRV_OPCODE_A_MASK);
s_ucDataTx[1] = 0;//Clear the Previous Selection of Registry
/* Initiate transfer */
daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
s_ucRegistrySwitched = 0;
}
s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG0 & DAQ_DRV_OPCODE_A_MASK);
s_ucDataTx[1] = (1 << l_ucAdcChId);
/* Initiate transfer */
daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
}
else
{
if( s_ucRegistrySwitched == 0 )
{
// Clear the DAQ_DRV_REG_ADDR_MUXSG0
s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG0 & DAQ_DRV_OPCODE_A_MASK);
s_ucDataTx[1] = 0;//Clear the Previous Selection of Registry
/* Initiate transfer */
daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
s_ucRegistrySwitched = 1;
}
s_ucDataTx[0] = DAQ_DRV_OPCODE_WREG | (DAQ_DRV_REG_ADDR_MUXSG1 & DAQ_DRV_OPCODE_A_MASK);
s_ucDataTx[1] = (1 << (l_ucAdcChId % 8) );
/* Initiate transfer */
daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
}
s_ucDataTx[0] = DAQ_DRV_OPCODE_PULSE_CONVERT| DAQ_DRV_OPCODE_MUL_MASK;
daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataTx,1);
runningms = xTaskGetTickCount();
l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);//Check ADC_DRDY_PIN
while( l_ucRdyStatus )
{
l_ucRdyStatus=daq_drv_GPIOGet(s_stGPIOMappings,0);
if( (runningms + l_ucTimeoutVal) < xTaskGetTickCount() )
{
return ADC_ERROR;//Error state
}
}
// Dummy bytes for reading the Data
s_ucDataTx[0] = 0;
s_ucDataTx[1] = 0;
daq_drv_SpiTxRx(DAQ_DRV_SPI_ADS1158_DEVICE_IDX,s_ucDataTx,s_ucDataRx,2);
//printf("\nD:%d",((s_ucSpiDataRx[0] << 8) | s_ucSpiDataRx[1]));
return ((s_ucDataRx[0] << 8) | s_ucDataRx[1]);
}
void main()
{
unsigned char l_ucChannel = 0;
InitDevice();
InitSpi();//SPI - MODE 0,1Mhz
daq_drv_ADS1158Init();
while(1)
{
printf("\n ADC: %d",daq_drv_AdcRead(l_ucChannel, 100));
l_ucChannel ++;
if(l_ucChannel>15)
l_ucChannel = 0;
}
}







