c - ADC原始数据形成
问题描述
我想请您解释一下我的这部分代码。我不确定它到底做了什么。这是示例代码,我想理解它。原始代码的目的应该是在流模式下从 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);
从谷歌搜索,我假设你有这个文件的这个功能。如果是这个函数,它会从这个模块中读取三个寄存器(见8.6 寄存器映射,数据寄存器DATA_CHx_ECG
是三个字节长,应该在count
变量中)。
执行此函数后,变量的前三个字节中有 ECG 数据read_buf
,但您需要 24 位值,因为量化值是 24 位值。
由于我们uint24_t
在 C 中没有(而且我不知道其他语言),我们采用下一个可能的大小,即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
你现在有一个 24 位的 ADC 读数值。
推荐阅读
- sql - Presto TIMESTAMP 从 2 天前获取数据而不输入年月日期?
- scala - 将长准引用匹配器存储在变量中
- java - 我不明白为什么 array[0] 和 [1] 变为 null
- r - 在R中按行检查条件和赋值
- node.js - 如何在节点中成功启动子进程而不等待它完成?
- android - 如何在android + viewModel中进行回调
- ios - 如何在没有 App Store 的情况下将 IOS 应用程序安装到某人的手机上进行测试?
- regex - libreoffice 使用 INDIRECT 引用替换长文本中的引用
- javascript - 在颤动中处理表单字段的变化
- python - 如何使用 pandas.Panel 获取数据框列表的平均值?