想知道在SDK 3.0.8.0中为正确和稳定的直流测量推荐ADC配置吗
根据“UM-B-004 DA14580_581 Peripheral Drivers_v1.4.pdf”和“da14580_ds_v1 .1.pdf”中提供的信息,我的配置目前是这样的:
adc_calibrate ()
adc_init(GP_ADC_SE | GP_ADC_CHOP, ADC_POLARITY_UNSIGNED, 0 /* no GP_ADC_ATTN3X*/)
adc_enable_channel (ADC_CHANNEL_P00)
adc_get_sample ()
adc_disable ()
看看adc_get_vbat_sample(),它似乎是:
1.尽管在“DA14580_DS_v3.1.pdf”中强烈推荐使用GP_ADC_CHOP,但不推荐使用GP_ADC_CHOP,而是使用两个具有相反GP_ADC_SIGN的示例
2.adc_init()之后使用20微秒的延迟,该延迟与“DA14580_DS_v3.1.pdf”中的“表293”中描述的计时特性相对应(注意:adc_calibrate()中的adc_int()之后使用了相同的20微秒延迟)。
1.adc_init()之后需要20微秒的延迟吗?
2.考虑到adc_int()设置了GP_ADC_DELAY_EN,是否/应该通过GP_ADC_DELAY_REG和GP_ADC_DELAY2_REG来控制必要的延迟?
3.是否有更多有关艺发局相关登记册内部工作的资料?
设备:
嗨,Icujba,如果你不使用衰减,没有延迟是必需的。随着衰减(在你打算测量电压> 1.2V的情况下需要),你应该增加一些延迟,以允许内部帽被充电。这个应该在4us的范围内。关于ADC内部工作的更多信息还没有公开。你有什么具体的问题吗?
最好的问候,RvA
嗨RvA,
谢谢你的回复。我将在“with衰减”场景中使用推荐的延迟。
最好的问候,Ionut
你好,
我有很简单的代码,我不从ADC获得一致的结果(至少4位最低应丢弃,所以有效的决议是6位,你也有让battery.c)和ADC看起来也相当巨大的偏移误差和校准不帮助。偏置误差是主要问题,特别是在电压较低时。
我的测试设置真的很简单:external_power- >100k欧姆电阻->输入引脚(配置为PID_ADC)。代码使用你的例子,因此adc函数没有被修改(除了在最后阶段添加了CHOP位)
uint16 u16ADC = 0U;
uint16 i = 1000U;
uint16 u16Min = 0xFFFFU;
uint16 u16Max = 0U;
DBG_PRINT("\n\rADC att 1x, calib before meas, 1000x single meas\n\r");
adc_enable_channel (ADC_CHANNEL_VDD_REF);
adc_calibrate ();
adc_init (GP_ADC_SE, 0, 0);//单端模式,1V18
adc_enable_channel (ADC_MEAS_TEMP);
虽然(我)
{
u16ADC = adc_get_sample ();
if(u16ADC < u16Min){u16Min = u16ADC;}
if(u16ADC > u16Max){u16Max = u16ADC;}
}
adc_disable ();
DBG_PRINT("ADC min: 0x%x, max: 0x%x, diff %u\r\n", u16Min, u16Max, u16Max);
50mV记录的最大值是正确的,剩余值太低:
ADC att 1x, meas前校准,1000x单meas
ADC min: 0xf, max: 0x3b, diff 44
我也尝试了平均10个样本,但结果仍然有~17%的误差在50mV, 140mV有~ 5.5%的误差和550mV 1,7%的误差,最小误差(~1,25%)达到水平~700mV后,误差看起来保持稳定…
提高电压没有帮助,最小/最大样本之间的差异保持不变(并且最高的是正确的)
ADC att 1x, meas前校准,1000x单meas
ADC min: 0x150, max: 0x17a, diff 42
ADC校准寄存器的值在校准后的范围内变化…
OFFP: 0 x204-0x208
OFFN: 0 x1f8-0x1fa
ADC的功能没有在数据表中描述,所以我想得到所有的材料,你有它。还有一些寄存器位(GP_ADC_CHOP, GP_ADC_IDYN…)可能会做一些事情,但根据你的参考设计(电池是相当稳定的直流源?)
在adc_init()中启用GP_ADC_CHOP,那么结果在最小/最大差异方面更好,但现在max不是那么接近实际值…
ADC att 1x, meas前校准,1000x单meas
ADC min: 0x158, max: 0x176, diff 30
我猜GP_ADC_CHOP肯定会被使用。GP_ADC_I20U和GP_ADC_IDYN可以同时启用吗?
很抱歉说最大值是正确的,我看了在44dec的50mV的差值作为广告转换结果是50mV假设1,18v ref.所以没有办法确定sw的“正确”值…
我猜我发现了问题的一些部分(最小和最大的差别很大),有外部电源的噪音。我在测量端增加了电容,解决了这个问题。无论如何仍然有偏移误差,这是一个特性吗?错误看起来是~5%-2%在低端是最高的…
mV打印转换使用以下公式AVG*1180/1023和ADC值现在是小数
72mV(测量)给出(CHOP_ON): ADC min: 65, max: 67, diff 2, AVG: 66 mV: 76
366mV(测量)给出(CHOP_ON): ADC min: 314, max: 316, diff 2, AVG: 314 mV: 362
692mV(测量)给出(CHOP_ON): ADC min: 588, max: 590, diff 2, AVG: 588 mV: 678
835mV(测量)给出(CHOP_ON):ADC min: 706, max: 709, diff 3, AVG: 707 mV: 815
1066mV(测量)给出(CHOP_ON):ADC min: 903, max: 906, diff 3, AVG: 905 mV: 1043
我需要以最大速度采样(大约50KHz),例如我连续得到1000个采样,我不能使用电容,所以,采样的偏移对我来说是巨大的。
有人能告诉我怎么解决吗?