请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:ADS7038 你好试图建立一个代码自动定序通过8个通道(传感器)和协调的 Anaolg 数字信号(恢复与 Arduino Mega )。 数据显然没有意义。 我用示波器进行了检查、表明发送和接收正常。 因此、我假设是由代码引起的。 请帮帮我。 在这方面、示例代码对我没有帮助。
#包含
//芯片选择
uint8_t cspins []={53};//adc cspins to Arduino、指定 Arduino 引脚
//模式 时钟极性(CPOL) 时钟相位(CPHA) 输出边沿 数据捕获
// SPI_MODE0 0 下降 上升
// SPI_MODE1 0 1 上升 下降
// SPI_MODE2 1 0 上升 下降
// SPI_MODE3 1 1 下降 上升
静态常量 SPISettings SPI_SETTINGS{1000000、MSBFIRST、SPI_MODE0};
//寄存器地址
静态 const uint8_t ADDR_SYSTEM_STATUS {0x00};
静态 const uint8_t ADDR_GENERAL_CFG {0x01};
静态 const uint8_t ADDR_DATA_CFG {0x02};
静态常量 uint8_t ADDR_OSR_CFG {0x03};
静态常量 uint8_t ADDR_PIN_CFG {0x05};
静态 const uint8_t ADDR_serial_CFG {0x10};
静态 const uint8_t ADDR_CHANNEL_SEL {0x11};
静态 const uint8_t ADDR_AUTO_SEQ_CH_SEL{0x12};
静态 const uint8_t opcode_no_OP {0x00};
静态 const uint8_t opcode_WR_REG {0x08};
静态 const uint8_t opcode_RD_REG {0x10};
静态 const uint8_t opcode_set_bit{0x18};
静态 const uint8_t opcode_CLR_bit{0x20};
int8_t selected_adc_idx{-1};
void selectADC (uint8_t idx = 0){
digitalWrite (csPins[idx]、LOW);
selected_adc_idx = idx;
}
void deselectADC(){
digitalWrite (csPins[selected_adc_idx]、高电平);
selected_adc_idx =-1;
}
uint8_t readRegister (uint8_t adc_idx、uint8_t reg)
{
//发送24位命令:Rd_REG、addr、no_OP
uint8_t cmd[3]{opcode_RD_REG、reg、opcode_no_OP};
uint8_t 响应[3];
selectADC (adc_idx);
SPI.beginTransaction(SPI_SETTINGS);
for (int I = 0;I < 3;I++)
{
spi.transfer (cmd[i]);
}
// CS 需要拉高以处理命令
脱电模转换器();
delayMicroseconds(100);
selectADC (adc_idx);
for (int I = 0;I < 3;I++)
{
Response [i]= spi.transfer (0);
}
spi.endTransaction ();
脱电模转换器();
返回响应[0];
}
void writeRegister (uint8_t adc_idx、uint8_t addr、uint8_t val)
{
//发送24位命令:WR_REG、addr、data
uint8_t cmd[3]{opcode_WR_REG、addr、val};
selectADC (adc_idx);
SPI.beginTransaction(SPI_SETTINGS);
for (int I = 0;I < 3;I++)
{
spi.transfer (cmd[i]);
}
spi.endTransaction ();
脱电模转换器();
}
void calibrateADC (uint8_t adc_idx)
{
Bool calibrated = false;
//设置校准位
uint8_t cfg = readRegister (ADC_idx、ADDR_GENERAL_CFG);
CFG |= 0x02;
writeRegister (ADC_idx、ADDR_GENERAL_CFG、cfg);
//等待校准位恢复为0
while (!calibrated)
{
delayMicroseconds(100);
CFG = readRegister (ADC_idx、ADDR_GENERAL_CFG);
//Serial.print (cfg);
如果((cfg && 0x02)=0)
{
已校准= true;
}
}
serial.print("完成校准");
}
void initADC (uint8_t adc_idx)
{
//将通道 ID 添加到 ADC 数据
uint8_t data_cfg = readRegister (ADC_idx、ADDR_DATA_CFG);
DATA_cfg |= 0x10;
writeRegister (ADC_idx、ADDR_GENERAL_CFG、DATA_cfg);
//启用所有通道的顺序
writeRegister (ADC_IDx、ADDR_AUTO_SEQ_CH_SEL、0xFF);
//选择自动序列模式
uint8_t SEQ_cfg = readRegister (ADC_idx、ADDR_sequence_CFG);
SEQ_cfg |= 0x11;
writeRegister (adc_idx、ADDR_GENERAL_CFG、SEQ_cfg);
}
void readADC (uint8_t adc_idx、float* outputData)
{
uint8_t data[2];
uint8_t 通道;
uint16_t adcValue;
selectADC (adc_idx);
SPI.beginTransaction(SPI_SETTINGS);
for (int I = 0;I < 2;I++)
{
data[i]= spi.transfer (0);
//Serial.println (数据[I]);
}
spi.endTransaction ();
脱电模转换器();
Channel = DATA[1]& 0x0F;
adcValue =((((uint16_t) data[0])<< 4)& 0x0FF0)|((((uint16_t) data[1])>> 4)& 0x000F);
serial.println (adcValue);
//缩放:AVDD/4096
*(outputData + channel)=(((float) adcValue)*(5.0f/4096.0f);
}
空 setup()
{
//设置 CS 引脚
对于(int I = 0;I < sizeof (cspins);I++)
{
pinMode (cspins [ i ]、输出);
digitalWrite (csPins[i]、HIGH);
}
//设置 SPI
SPI.begin();
//设置序列
Serial.begin(115200);
//设置 ADC
对于(int I = 0;I < sizeof (cspins);I++)
{
calibrateADC (0);
initADC (0);
}
延迟(1);
}
void loop()
{
浮点 adcValues [8];
char buffer [50];
for (int I = 0;I < 8;I++)
{
serial.print ("通道");serial.println (i);
readADC (0、adcValues);
delayMicroseconds(10);
}
// sprintf (buffer,"ADC 值:\t CH0:%.2f \t CH1:%.2f \t CH2:%.2f \t CH3:%.2f \t CH4:%.2f \t CH5:%.2f \t CH6:%.2f \t CH7:%.2f \n"Values, Values",[2][3] adcValues[4],adcValues[5],adcValues[6],adcValues[7];
// Serial.print (缓冲);
延迟(1000);
}