1

我从很久以前离开的人那里接手了这个项目。

我现在正在查看 ADC 模块,但我不明白代码的含义。

MCU: LM3S9B96
ADC: AD7609 ( 18bit/8 channel)
Instrumentation Amp : INA114

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

这是代码:

  1. 完成转换后存储的 8 个通道data[9]
  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 datasheet 说The FSR for the AD7609 is 40 V for the ±10 V range and 20 V for the ±5 V range,所以我猜他选择20v了上面描述的,它不知何故变成了2000???

有没有人有任何线索?

谢谢

-------------------从这里更新的问题----------

在 ADC 传递函数之后,我不知道数据 [0] 的 18 位连接值 + 数据 [1] 的 16 位连接值如何变成微伏。

数据[9] +---+---+--- +---+---+---+---+---+---++---+---+---++---+---+---++
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/bit我只是举一个例子1.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 需要移位和<<>>并加起来两个 data[]??

谢谢,

4

1 回答 1

1

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

对于 [2],他/她似乎将 18 位字连接值拆分为长整型,以便通过步骤 [3] 进行操作。

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

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

如果您希望 20V 变为微伏,则需要将其乘以 1e6。但是为了避免 long s/he 的溢出,他将乘法分成两部分(*2000 和 *10000)。由于中间除法,这个数字变得足够小,可以在最后乘以 10000 而不会溢出,代价是可能会丢失结果的一些最低有效位。

PS(由于多年使用某些汇编语言的习惯,我使用 $ 相当于 0x)

于 2014-10-03T07:21:41.087 回答