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

你好,

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

1)我们对数据表的读取表明,当配置为P0_ 0和P0_1之间的差分ADC操作时,结果是一个10位2的补码二进制整数,在-1.2v时允许满刻度读数0x200(-512),在+1.2v时允许0x1ff(+511)。这意味着每个ADC计数在测量上大致等于2.3mV(即1.2 / 512 = 2.34e-03)。

我们正在尝试使用DA14580 devkit-basic差分ADC来测量惠斯通电阻桥的两个臂之间的电压差(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.7k的电阻,右臂(连接到P0_1)由顶部的18k和底部名义上的10k (@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年3个月前
加入: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年3个月前
加入:2017-10-17 11:07
微分ADC结果

微分ADC结果实际上看起来是符号、幅度和2的补码的组合。将adc_get_sample()结果转换为范围为-1024到+1023的有符号整数的步骤如下:

  1. 检查第9位,看看结果是正号还是负号
  2. 如果第9位是0,那么在第0..8是正的,但是你必须取二进制补码0.
  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计数
返回adcccount * 2;

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

MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨scsims,

嗨scsims,

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

由于PM_dialog

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

嗨PM_dialog,

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

谢谢,

scsims

scsims
离线
最后看到:1年3个月前
加入: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