你好,
我们正在努力研究如何使用微分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 ();
我们已经发现编码可能是符号+幅度,而不是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?
微分ADC结果实际上看起来是符号、幅度和2的补码的组合。将adc_get_sample()结果转换为范围为-1024到+1023的有符号整数的步骤如下:
对微分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(至少没有衰减器启用)。
嗨scsims,
很抱歉响应延迟,不幸的是没有关于微分模式ADC的额外信息,也没有在任何参考设计中使用它,所以我不得不进行一些实验,以得到以下结论。在差分模式下,当电压差为零时,ADC的输出应该接近0x1FF。当电压差为-1.2伏时,ADC的输出应接近0x0,当电压差为+1.2伏时,ADC的输出应接近0x3FF。据我所知,这是当你使用微分模式时的映射。
由于PM_dialog
嗨PM_dialog,
谢谢你看这个,你的结论比我的更有意义,但这不是我们观察到的行为。正如我在我的评论中提到的,我们可能已经把引脚驱动到电压限制之外了。我看看能不能抽出点时间重现你的实验。
谢谢,
scsims
你好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