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.

[参考译文] ADS7038:自动序列模式代码

Guru**** 667810 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/data-converters-group/data-converters/f/data-converters-forum/1282755/ads7038-auto-sequence-mode-code

器件型号: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);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Jana、

    欢迎来到我们的 e2e 论坛!  感谢您提供代码片段、但您是否可以通过范围跟踪发送说明您如何提供命令数据的内容?  请至少包含/CS、SCLK 和 SDI。