ADC原始数据形成
ADC raw data forming
我想请您解释一下我的这部分代码。我不确定它到底做了什么。这是示例代码,我想了解它。原代码的目的应该是在流模式下从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];
我将跳过变量声明,因为我将在其余描述中引用它。
代码从这一行开始:
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
,我们知道该函数确实按照地址的顺序读取值,在本例中为高字节、中字节和低字节的顺序(分别在 read_but[0]
、read_buf[1]
和 read_buf[2]
).
为了重建 24 位值,代码将值移动到适当的偏移量:read_buf[0]
从第 23 位移动到第 16 位,因此移动了 16 位,read_buf[1]
从第 15 位移动到第 8 位将 8 位和 read_buf[2]
从 7 移到 0,从而将 0 位移出(此移位未表示)。我们将这样表示它们(0xAA
、0xBB
和 0xCC
是显示所发生情况的示例值):
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 位值。
我想请您解释一下我的这部分代码。我不确定它到底做了什么。这是示例代码,我想了解它。原代码的目的应该是在流模式下从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];
我将跳过变量声明,因为我将在其余描述中引用它。
代码从这一行开始:
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
,我们知道该函数确实按照地址的顺序读取值,在本例中为高字节、中字节和低字节的顺序(分别在 read_but[0]
、read_buf[1]
和 read_buf[2]
).
为了重建 24 位值,代码将值移动到适当的偏移量:read_buf[0]
从第 23 位移动到第 16 位,因此移动了 16 位,read_buf[1]
从第 15 位移动到第 8 位将 8 位和 read_buf[2]
从 7 移到 0,从而将 0 位移出(此移位未表示)。我们将这样表示它们(0xAA
、0xBB
和 0xCC
是显示所发生情况的示例值):
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 位值。