首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ADC传递函数

ADC传递函数
EN

Stack Overflow用户
提问于 2014-10-02 20:56:14
回答 1查看 687关注 0票数 1

我从一个很久以前就去过的人那里接手了这个项目。

我现在看的是模数转换器模块,但我不明白代码的意思。

代码语言:javascript
复制
MCU: LM3S9B96
ADC: AD7609 ( 18bit/8 channel)
Instrumentation Amp : INA114

Process: Reading volts(0 ~ +10v) --> Amplifier(INA114) --> AD7609.

以下是这方面的代码:

  1. 对存储在data[9]中的8个通道完成转换后
  2. 将数据转换为微伏特?? //convert to microvolts and store the readings // unsigned long temp[], data[] temp[0] = ((data[0]<<2)& 0x3FFFC) + ((data[1]>>14)& 0x0003); temp[1] = ((data[1]<<4)& 0x3FFF0) + ((data[2]>>12)& 0x000F); temp[2] = ((data[2]<<6)& 0x3FFC0) + ((data[3]>>10)& 0x003F); temp[3] = ((data[3]<<8)& 0x3FF00) + ((data[4]>>8)& 0x00FF); temp[4] = ((data[4]<<10)& 0x3FC00) + ((data[5]>>6)& 0x03FF); temp[5] = ((data[5]<<12) & 0x3F000) + ((data[6]>>4)& 0x0FFF); temp[6] = ((data[6]<<14)& 0x3FFF0) + ((data[7]>>2)& 0x3FFF); temp[7] = ((data[7]<<16)& 0x3FFFC) + (data[8]& 0xFFFF);

我不明白这些密码是干什么的.?我知道它会发生变化,但它们是如何变成微数据格式的?

  1. 传递函数

//store the final value in the raw data array adstor[] adstor[i] = (signed long)(((temp[i]*2000)/131072)*10000);

131072 = 2^(18-1)但是我不知道其他值来自于

AD7609数据表上写着The FSR for the AD7609 is 40 V for the ±10 V range and 20 V for the ±5 V range,所以我猜到他选择了上面描述的20v,不知何故变成了2000???

有人有线索吗??

谢谢

我不知道数据的18位级联值+ data1的16位级联值如何在模数转换函数后变为微伏。

data9 +---+---+--- +---+---+---+---+---+---++---+---+---++---+---+---++

analog volts | 1.902v | 1.921v | 1.887v | 1.934v | +-----------++-----------+------------+------------+------------+

digital value| 12,464 | 12,589 | 12,366 | 12,674 | +---+---+---++---+---+---++---+---+---++---+---+---++---+---+---+

我只是用data[3:0] 1 resolution = 20v/2^17-1 = 152.59 uV/bit1.902v/152.59uv = 12,464做了一个例子

现在通过连接:

temp[0] = ((data[0]<<2)& 0x3FFFC) + ((data[1]>>14)& 0x0003) = C2C0

temp[1] = ((data[1]<<4)& 0x3FFF0) + ((data[2]>>12)& 0x000F) = 312D3

temp[2] = ((data[1]<<6)& 0x3FFC0) + ((data[3]>>10)& 0x003F) = 138C

然后将它们放入传递函数,得到微伏。

adstor[i] = (signed long)(((temp[i]*2000)/131072)*10000);

adstor[0]= 7,607,421 with temp[0] !=1.902*e6

adstor[1]= 30,735,321 with temp[1] != 1.921*e6

adstor[2]= 763,549 with temp[2]

正如您注意到的,它们与表中的模拟值有很大的不同。

我不明白为什么数据需要比特移动和<<**,**>> ,并加上两个data[]??。

谢谢,

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-03 07:21:41

请注意,最大18位值为2^18-1 =$3 3FFFF= 262143。

对于2,似乎s/he将18位字串联的值拆分为渴望通过步骤3进行更容易的操作。

3:关于adstori =(签名长)(tempi*2000)/131072)*10000);

若要将原始A/D读数转换为volts /he与预期伏特相乘,并被最大可能的A/D值除以(在本例中为$3 3FFFF),则代码中似乎出现了错误,因为s/他除以2^17-1,而不是2^18-1。另一种可能性是使用A/D范围的一半,并以这种方式进行补偿。

如果你想要20V变成微伏,你需要把它乘以1e6。但是为了避免长s/he的溢出,乘法被分成两部分(*2000和*10000)。由于中间除法,数字变得足够小,可以在结束时乘以10000,而不会溢出,而代价是可能损失一些最小的结果比特。

(由于多年来在某些汇编语言中的习惯,我使用$作为0x的等价物)

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

https://stackoverflow.com/questions/26169525

复制
相关文章

相似问题

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