ADC传输功能

时间:2014-10-02 20:56:15

标签: microcontroller adc transfer-function

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

我现在正在研究ADC模块,但我没有得到代码的含义。

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

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

以下是代码:

  1. 完成转换存储在data[9]
  2. 中的8个频道后
  3. 将数据转换为微伏?

    //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);

  4. 我不知道这些代码在做什么......?我知道它会改变,但它们如何成为微数据格式?

    1. 转移功能
    2. //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???

      有没有人有任何线索?

      由于

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

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

      数据[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/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]

      正如您所注意到的,它们与表中的模拟值完全不同。

      我不明白为什么数据需要进行位移和<<>>并加上两个数据[] ??

      谢谢,

1 个答案:

答案 0 :(得分:1)

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

对于[2],似乎s / he将18位字连接值拆分为long,以便于通过步骤[3]进行操作。

[3]:关于adstor [i] =(签名长)(((temp [i] * 2000)/ 131072)* 10000);

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

如果你想要20V成为微伏,你需要乘以1e6。但为了避免长s /溢出,将乘法分成两部分(* 2000和* 10000)。由于中间划分,数字变得足够小,最终乘以10000而不会溢出,代价是可能会丢失结果的一些最低有效位。

P.S。 (由于在某些汇编语言中习惯了多年,我使用$等价于0x)