你好,
我们正在努力研究如何使用微分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 ();
我们已经发现编码可能是符号+幅度,而不是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计数与单个最终结果相同的比例
返回Adccount * 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