首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADC原始数据形成

ADC原始数据形成
EN

Stack Overflow用户
提问于 2019-04-20 11:32:30
回答 1查看 331关注 0票数 2

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

代码语言:javascript
复制
#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];
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-20 12:10:01

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

代码从这一行开始:

代码语言:javascript
复制
TI_ADS1293_SPIStreamReadReg(read_buf, count);

通过Google搜索,我假设您有来自这个文件的这个函数。如果是这个函数,它将从这个模块读取三个寄存器(参见8.6RegisterMaps,数据寄存器DATA_CHx_ECG有三个字节长,这是count变量中应该有的)。

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

因为我们没有C语言中的uint24_t (以及我所知道的其他语言),所以我们采用下一个可能的大小,即uint32_t来声明adc_data变量。

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

代码语言:javascript
复制
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位,read_buf[1]从15位移到8位,read_buf[2]从7位移到0位(这个移位没有表示)。我们将它们表示为这样( 0xAA0xBB0xCC是示例值,以显示所发生的情况):

代码语言:javascript
复制
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

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

代码语言:javascript
复制
0xAA0000 | 0x00BB00 | 0x0000CC = 0xAABBCC

你现在有了24位的ADC读数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55773106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档