试图弄清楚差异ADC结果

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.xmece.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
6个员额/ 0个新员额
最后发表
scsims
离线
最后看到:1年4个月前
加入:2017-10-17 11:07
试图弄清楚差异ADC结果

你好,

我们正在努力研究如何使用微分ADC。首先,从GP_ADC_RESULT_REG返回的值似乎比我们预期的高4倍,其次,当测量的电压差实际增加时,差分值在幅度上减少:

1)我们对数据表的读取表示在P0_0和P0_1之间配置差分ADC操作时,结果是10位2的补码二进制整数,其将允许在-1.2V的0x200(-512)的全尺度读数和0x1ff(+511)+ 1.2V。这意味着每个ADC计数大致等于测量值的2.3mV(即1.2 / 512 = 2.34E-03)。

我们试图使用DA14580 Devkit基本差分ADC来测量惠斯通电阻桥的2臂之间的电压差(连接到左手侧的P0_ 0,连接到右手侧的P0_1)。使用示波器,我们测量P0_ 0为1.54V,P0_1为1.26V。

1.26 - 1.54 = -0.28V

因此,我们期望adc_get_sample()返回的ADC计数大约在0x388(-120)左右,但实际上它返回的大约是0x235 (-459) ~= -1.07v。

我们是否误解了数据表?将ADC配置为单端似乎可以很好地工作。

2)我们的惠斯通电桥配置为测量NTC热敏电阻。当热敏电阻随着温度的变化而变化时,其电阻减小,因此P0_1测得的电压相对于P0_ 0测得的电压减小。因此,差分ADC结果应该变得更负,但由于某些原因,它实际上变得不那么负。

我们的桥梁在顶部有一个18k的左手臂(连接到P0_ 0),底部有17.7克电阻,右手臂(连接到P0_1)由顶部和名义上10k的18k组成(@ 25C)底部的热敏电阻。测量时热敏电阻的电阻约为12.5k,当我们轻轻温暖时,减少到11k。

我们的固件呼叫以下功能:

从睡眠唤醒处理程序内部
adc_calibrate()

在我们的app_easy_timer()回调处理程序内

adc_init(0, GP_ADC_SIGN | GP_ADC_CHOP, 0);//差分ADC, Sign inversion and Chop to cancel offset voltage, Don't switch in the 3.6v attenator . //差分ADC, Sign inversion and Chop to cancel offset voltage, Don't switch in the 3.6v attenator
adc_enable_channel (0);// P0_ 0和P0_1
int32_t adcCount = adc_get_sample();
... //执行计算等。
adc_disable ();

设备:
scsims
离线
最后看到:1年4个月前
加入:2017-10-17 11:07
我们发现

我们已经发现编码可能是符号+幅度,而不是2的comp(我们要求将此信息添加到数据表中)。即0x3ff为最负值(理论上为-1.2v), 0x1ff为最正值(理论上为+1.2v)。

如果我们在示波器上测量P0_ 0和P0_1之间的-0.3v,那么ADC报告0x233(-51)。如果我们将引线切换到P0_ 0和P0_1(因此差值现在是+0.3v),那么ADC返回值为0x1C4(452)。

但是,如果我们接地P0_ 0和P0_1,则某些原因ADC返回0x0FF。肯定应该返回0x000?

scsims
离线
最后看到:1年4个月前
加入:2017-10-17 11:07
差分ADC结果

差分ADC结果实际上看起来是标志和幅度的组合,2的补充。将ADC_GET_SAMPLE()结果转换为从-1024到+1023的符号整数的步骤如下:

  1. 检查位9以查看结果是否积极或负签名
  2. 如果位9是0,则比特0..8的结果是正的,但你必须采取比特0..8的二进制补充
  3. 如果位9是1,则结果为负,因此您必须屏蔽符号位并采取结果的补充

代码执行来自差异ADC的Get_Adc_sample()结果的上述调节:

/ /设置ADC结果的条件,在相同的刻度上给出一个2的comp整数*/
static int32_t normaliseDifferentialADCCount(int32_t adcCount) {
//符号和大小
if (adcCount & 0x200) {
Adccount =〜(Adccount&0x1ff);
其他}{
//由于某些原因,积极的结果是消极的
Adccount =(〜Adccount&0x1ff);

//双倍以获得ADC计数与单个最终结果相同的比例
返回Adccount * 2;

我们发现的另一件事是,数据表似乎表明微分ADC针之间的差异可以到-1180 + 1180 mV但额外的约束是单独两个针必须在任何时候都是0到1180之间的mV(至少没有衰减器启用)。

MT_dialog
离线
最后看到:6个月3周前
工作人员
加入:2015-06-08 34
嗨scsims,

嗨scsims,

很抱歉响应延迟,不幸的是没有关于微分模式ADC的额外信息,也没有在任何参考设计中使用它,所以我不得不进行一些实验,以得到以下结论。在差分模式下,当电压差为零时,ADC的输出应该接近0x1FF。当电压差为-1.2伏时,ADC的输出应接近0x0,当电压差为+1.2伏时,ADC的输出应接近0x3FF。据我所知,这是当你使用微分模式时的映射。

谢谢pm_dialog.

scsims
离线
最后看到:1年4个月前
加入:2017-10-17 11:07
嗨PM_dialog,

嗨PM_dialog,

谢谢你看这个,你的结论比我的更有意义,但这不是我们观察到的行为。正如我在我的评论中提到的,我们可能已经把引脚驱动到电压限制之外了。我看看能不能抽出点时间重现你的实验。

谢谢,

scsims

scsims
离线
最后看到:1年4个月前
加入:2017-10-17 11:07
你好PM_dialog,

你好PM_dialog,

我现在复制了你的结果,但有一个例外,我们假设P0_ 0是AIN-和P0_1是AIN+,然而他们是相反的方式。


P0_1 = 0mV, P0_ 0 = +1180mV然后get_adc_sample()返回0x3ff
P0_1 = +1180mV, P0_ 0 = 0mv然后get_adc_sample()返回0x000

我们也使用了超出其范围的ADC输入,我们假设只有P0_ 0和P0_1的ADC最大电压为- 1180mV到+1180mV,但实际上P0_ 0和P0_1的额定电压也仅在0mV到+1180mV之间。

再次感谢你的帮助。

scsims