|
楼主 |
发表于 2010-10-3 01:39:01
|
显示全部楼层
试过了,回来报告:
我将AD-A端到+12V之间的电阻撤掉,测得此点(输出电流=0时)电压为-5.48mV(这就是直接使用春风0924版固件电流显示0000的罪魁祸首)。
电阻=1M, 此点电压=49.37mV (有点大了)。
后调整到电阻=8M,此点电压=1.71mV (危险边缘,再增大电阻,又要成负值了)。
然后直接烧春风0924版的固件,测试发现100mA以内显示值始终比实测电流约小2mA;电流增大到1A以上时,这个差值也增大。
看来电流显示的“软件分段补偿”还是有必要再加上。
注:AD-A点的电阻阻值改过之后,重新校正过;程序里面的3个补偿参数也要改一下。
与“软件分段补偿”有关的程序段(这次测到试过0-3A,精度满意):
/**********************分段补偿法来提高电流显示精度,开始************************/
aa = (4.000 - 0.100) / (float)(ADIcal4 - ADIcal01);//计算AD值的每个LSB对应的实际电流值(步长)
j = (ADIcal01 - (u16)(0.100 / aa)); //计算AD的0v电压时的底数
//电流0.1A(100mA)以上(由AD采样值与0.1V校准数据对比)
if(I >= ADIcal01)
{
if(I > j) { I = I - j;} //如果AD返回值大于0V输出是的AD数据值(底数),则减掉底数
else {I = 0;} //如果AD返回值小于或等于0v底数,就算是0电流输出
aa = ((float)(I* aa))*1.005 ; //乘以【1.005】补偿系数
}
//电流1mA到100mA之间以下(由AD采样值估计)
else
{
if(I>=(j+((u16)(ADIcal01-j)/100)))//电流介于1mA-100mA(0v底数+0.1v时AD净值的1%)
{
if(I > j) { I = I - j;} //如果AD返回值大于0V输出是的AD数据值(底数),则减掉底数
else {I = 0;} //如果AD返回值小于或等于0v底数,就算是0电流输出
aa = ((float)(I* aa))+0.002 ;//加上【2mA】补偿值
}
else // 电流小于1mA(由AD采样值估计)
{
if(I > j) { I = I - j;} //如果AD返回值大于0V输出是的AD数据值(底数),则减掉底数
else {I = 0;} //如果AD返回值小于或等于0v底数,就算是0电流输出
aa = ((float)(I* aa))+0.0009 ;//加上【0.9mA】补偿值
if(aa<=0.0009){aa=0;} //加了补偿后小于1mA,就当0处理
}
}
/********************分段补偿法来提高电流显示精度,结束************************/ |
|