【问题标题】:ADC raw data formingADC原始数据形成
【发布时间】:2019-09-10 09:20:48
【问题描述】:

我想请您解释一下我的这部分代码。我不确定它到底做了什么。这是示例代码,我想理解它。原始代码的目的应该是在流模式下从 ADC 获取数据。这应该是关于形成原始数据。谢谢。

#define CH_DATA_SIZE 6
uint8_t read_buf[CH_DATA_SIZE];
uint32_t adc_data;

TI_ADS1293_SPIStreamReadReg(read_buf, count);                            

adc_data = ((uint32_t) read_buf[0] << 16) | ((uint16_t) read_buf[1] << 8) 
| read_buf[2];

【问题讨论】:

    标签: c msp430 adc


    【解决方案1】:

    我将跳过变量声明,因为我将在其余的描述中引用它。

    代码从这一行开始:

    TI_ADS1293_SPIStreamReadReg(read_buf, count);
    

    通过 Google 搜索,我假设您从 this file 获得了此功能。如果是这个函数,它会从这个模块中读取三个寄存器(参见8.6 Register Maps,数据寄存器DATA_CHx_ECG是三个字节长,这应该是count变量中的内容) .

    执行此函数后,read_buf 变量的前三个字节中有 ECG 数据,但您需要 24 位值,因为量化值是 24 位值。

    由于我们在 C 中没有 uint24_t(而且我不知道其他语言),因此我们采用下一个可能的大小,即 uint32_t 来声明 adc_data 变量。

    现在下面的代码确实从我们从 ADC 读取的 3 个字节重建了一个 24 位值:

    adc_data = ((uint32_t) read_buf[0] << 16) | ((uint16_t) read_buf[1] << 8) 
    | read_buf[2];
    

    从数据表和TI_ADS1293_SPIStreamReadReg,我们知道该函数确实按照地址的顺序读取值,在这种情况下,高字节、中字节和低字节按此顺序(分别在@987654333 @、read_buf[1]read_buf[2])。

    为了重建 24 位值,代码用适当的偏移量移动该值:read_buf[0] 从第 23 位到第 16 位,因此移动了 16 位,read_buf[1] 从第 15 位到第 8 位,因此移动了 8 位,@987654338 @ 从 7 到 0 因此移位了 0 位(未表示此移位)。我们将这样表示它们(0xAA0xBB0xCC 是显示发生情况的示例值):

    read_buf[0] = 0xAA => read_buf[0] << 16 = 0xAA0000
    read_buf[1] = 0xBB => read_buf[0] << 8  = 0x00BB00
    read_buf[2] = 0xCC => read_buf[0] << 0  = 0x0000CC
    

    要组合三个移位的值,代码使用按位或|,结果如下:

    0xAA0000 | 0x00BB00 | 0x0000CC = 0xAABBCC
    

    您现在有了 ADC 读数的 24 位值。

    【讨论】:

    • 首先,感谢您非常好的解释。实际上,代码来自链接 [1]。特别是来自演示 3,main.c。所以现在我可以在数据就绪中断到达时获得一组样本。我想连续或使用任何循环缓冲区读取这些数据。你对如何进行有什么建议吗? [1]ti.com/general/docs/lit/…
    • @DanielVolný 您使用的代码不同,但执行的功能与我描述的相同,所以我的解释仍然有效。使用演示 3 中的代码,数据一可用就被读取(请参阅here 为什么 SPI 不应出现在中断例程中)。我们需要更多关于您想要做什么的信息,但我认为这会引起另一个关于如何将数据存储在循环缓冲区中的问题。