wandy2010 发表于 2010-10-2 18:27:33

软硬兼施解决100mA以下的电流显示问题(春风及时出手,提供电路改动方案)

【硬件:】

100m以下电流显示解决方案:在电流AD采样端加一个1M的电阻,上拉到+12V电源

(具体原理春风已作详细分析,可参考这里的15楼 http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4299438&bbs_page_no=1&bbs_id=3071)

借春风兄的图加个文字标注说明:


http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587165PYLSCA.jpg
(原文件名:背面加的3个电阻位置与阻值.jpg)

注:----网友 page555 说在他的电源上上图中两个靠在一起的电阻,加大到4.7M 才行,

wandy2010 发表于 2010-10-2 18:32:05

【软件】:

测试发现电流显示比实测电流值要小,100mA之内小1.6mA左右;电流越大这个差值越大,于是在春风的0924版的源代码中加入了“分段补偿”,经测试,精度基本满意,修改后的源程序(10-02 23:42修正电流显示没有小数点的问题):




前面传的程序电流显示没有小数点,这个是修正的ourdev_587228RJKHCZ.rar(文件大小:586K) (原文件名:20100924版程序研究修改电流显示分段补偿.rar)

wandy2010 发表于 2010-10-2 18:36:44

软硬兼施之后的测试结果:
(为了拍照,临时找了一块半透明蓝色胶带贴在数码管上,因陋就简,呵呵)


http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587169WHVCSC.jpg
3mA (原文件名:3mA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587170BNVH2E.jpg
8mA (原文件名:8MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587171N5K6MK.jpg
14mA (原文件名:14MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587172QSZX5Y.jpg
51mA (原文件名:51MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587173NKENCB.jpg
77mA (原文件名:77MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587174ZNR5HO.jpg
129mA (原文件名:129MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587175HI9DLP.jpg
160mA (原文件名:160MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587176GKKK7A.jpg
181mA (原文件名:181MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587177NZ9L0D.jpg
228mA (原文件名:228MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587178P2E804.jpg
277mA (原文件名:277MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587179OC8FLV.jpg
340mA (原文件名:340MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587180GQ6DRK.jpg
350mA (原文件名:350MA.jpg)

wandy2010 发表于 2010-10-2 18:38:20

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587181C48YE9.jpg
701mA (原文件名:701MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587182E83T9L.jpg
849mA (原文件名:849MA.jpg)

http://cache.amobbs.com/bbs_upload782111/files_34/ourdev_587183QETVXA.jpg
880mA (原文件名:880MA.jpg)

wandy2010 发表于 2010-10-2 18:43:36

只测过1A以下的电流显示,大于1A的没有测试过,但是如果大家发现大电流时显示偏离实测值太大,可在源代码中把电流值再分几段,分别补偿。

yxzt 发表于 2010-10-2 19:22:38

赞!从这个电源里学到好多东西,每个电源都有个体差异,所以一个程序也许并不能适合所有的硬件,根据自己的实际参数适当的修改程序,这也是DIY的乐趣所在


另外,请问LZ是用KEIL4编译的吗?

wandy2010 发表于 2010-10-2 19:41:54

春风的这个电源确实好玩!

编译用这个: KEIL4 (MDK412)

还是春风帮我找的,迅雷下载:http://big.cr173.com/Kei_MDK.zip

yxzt 发表于 2010-10-2 20:02:53

谢谢,正在下,有204M,

awfi 发表于 2010-10-2 20:15:50

串个可调电阻把失调电压调到最小再换上固定阻值,会不会好点?

wandy2010 发表于 2010-10-2 20:52:50

回复【8楼】awfi
串个可调电阻把失调电压调到最小再换上固定阻值,会不会好点?

-----------------------------------------------------------------------

这个想法好像很有道理!

yxzt 发表于 2010-10-2 22:37:23

回复【9楼】wandy2010
-----------------------------------------------------------------------

每个084的失调电压都不一样的,根据我的板子,实测是,没加电阻的时候是-19.6毫伏,加1兆电阻时就变成正的48点几毫伏,显然电阻还是小了点,然后把那个电阻加到2兆时,失调电压就是15毫伏左右了,这时候的显示电流和实测电流也是很接近了,相信,用一个2兆的电阻和一个2兆左右的电位器串联调节,应该能把失调电压降到接近于0,

wandy2010 发表于 2010-10-3 00:00:07

终于开窍了,这样理解的:

当电源输出端开路(不接负载)时,输出电流当然是等于 0的;此时测量AD-A点,电压一般都是偏离0v的(也有可能是负值),将这个AD-A采样点与+12V之间连接一个可调电阻,将这个电压调到大于0(正值)并且接于0,则输出电流的AD采样就从0开始了,AD采样值=0时,输出电流I也=0.

wandy2010 发表于 2010-10-3 00:00:28

此时电源输出电流从0开始起调,AD采样值也从0开始,二者形成了简单的比例关系 AD= k*I
这样理论上输出电流显示值与实际值就会非常接近了,而且不用管电流值在哪一个区段内。
值得一试!如果这样搞定,程序就应该不用“分段补偿”了

wandy2010 发表于 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处理
                  }
                }

/********************分段补偿法来提高电流显示精度,结束************************/

yxzt 发表于 2010-10-3 09:58:01

嗯,如果这个误差是线性的,倒是比较容易补偿的,看了你的补偿算法,我想基本上每个人都能根据自己的实际误差修改补偿系数了,嘿嘿,连我这个对C,7窍通了6窍的也能自己试试了

xpxp 发表于 2010-10-3 10:21:58

从软件上去补偿,那是非正规的做法啊。

kdtcf 发表于 2010-10-3 11:45:57

回复【15楼】xpxp
从软件上去补偿,那是非正规的做法啊。
-----------------------------------------------------------------------

那什么叫正规的做法呢?你具体说说哪里不正规,有什么缺陷,不要轻描淡写的几句就了事,因为这坛子里的大多是没那么厉害的,说详细点大家才能理解透彻。

回复楼主:
另外我测试加电阻只是把电位抬高或拉低,并不影响线性,也不需要分段补偿的。
我原来分段处理是因为0点附近有偏移,现在偏移都是正向的了,把底数去掉就可以了,并不需要分段处理了。

wandy2010 发表于 2010-10-3 12:46:44

回复【16楼】kdtcf 春风

回复【15楼】xpxp
从软件上去补偿,那是非正规的做法啊。
-----------------------------------------------------------------------
那什么叫正规的做法呢?你具体说说哪里不正规,有什么缺陷,不要轻描淡写的几句就了事,因为这坛子里的大多是没那么厉害的,说详细点大家才能理解透彻。
回复楼主:
另外我测试加电阻只是把电位抬高或拉低,并不影响线性,也不需要分段补偿的。
我原来分段处理是因为0点附近有偏移,现在偏移都是正向的了,把底数去掉就可以了,并不需要分段处理了。
-----------------------------------------------------------------------

我用这样的办法做的电流显示偏差测试:
1、电流AD值处理中的这一行:
//拆分各个位送显示电流
                aa = (4.000 - 0.100) / (float)(ADIcal4 - ADIcal01);//计算AD值的每个LSB对应的实际电流值
                j = (ADIcal01 - (u16)(0.100 / aa));//计算AD的0电压时的底数

里面的0.100/aa,改成0.1000/aa,获得多了一位精度的数据,

2、在aa值分位显示时,aa=aa*1000 改为aa=aa*10000

这样小点电流显示时,最末位就是十分之一毫安了,比如13.2毫安显示:0132,然后以这个显示值与实测值比较,结论是:

【输出电流在1mA-100mA之间时,显示值比实测值少2mA左右,差值比较固定;超过100mA后,这个差值逐渐加大,1A左右时会相差4mA】

所以还是采用了分段补偿的做法。

现在对以上现象没有分析到原因(感觉理论上显示电流与实测电流之间应该是线性关系,差值应该不变),春风有时间的时候,再帮忙研究一下吧!

yqjyy 发表于 2010-10-3 16:58:31

我按图加3个电阻,刷修改版程序(20100924版程序研究修改电流显示分段补偿.rar),重新校准后,设定恒流1.000A,但实际工作时候电源显示1.004A,外接万用表显示1.000A,现在该采取什么措施?

yqjyy 发表于 2010-10-3 17:15:21

刷回春风9.24版,显示值和设定值一致,比实际测量值从1mA开始到4A范围内小2到3mA的样子

xpxp 发表于 2010-10-3 17:34:31

回复【16楼】kdtcf 春风

回复【15楼】xpxp
从软件上去补偿,那是非正规的做法啊。
-----------------------------------------------------------------------
那什么叫正规的做法呢?你具体说说哪里不正规,有什么缺陷,不要轻描淡写的几句就了事,因为这坛子里的大多是没那么厉害的,说详细点大家才能理解透彻。
回复楼主:
另外我测试加电阻只是把电位抬高或拉低,并不影响线性,也不需要分段补偿的。
我原来分段处理是因为0点附近有偏移,现在偏移都是正向的了,把底数去掉就可以了,并不需要分段处理了。
-----------------------------------------------------------------------

    运放的失调电压并不一成不变的吧?拿个电吹风吹一吹电路板,观察看看是不是会发生变化?如果改变了,软件上又该如何补偿?

kdtcf 发表于 2010-10-3 17:44:08

回复【20楼】xpxp

运放的失调电压并不一成不变的吧?拿个电吹风吹一吹电路板,观察看看是不是会发生变化?如果改变了,软件上又该如何补偿? -----------------------------------------------------------------------
好家伙,又给给我提出3个问题,你倒是说说具体怎么做呀,就会说风凉话。

cock 发表于 2010-10-3 18:40:41

春风,别理他们,你设计的是电源,不是万用表,小电流误差在低成本下难以解决。
当然,采用开机时,先关输出,测量零漂,再通电,计算时扣除零漂,但如果出现负零漂,也没有办法。

awfi 发表于 2010-10-3 18:53:24

换抵失调运放会不会好点.
另,可以换成4个OP07吗?

kdtcf 发表于 2010-10-3 18:58:30

回复【22楼】cock
春风,别理他们,你设计的是电源,不是万用表,小电流误差在低成本下难以解决。
当然,采用开机时,先关输出,测量零漂,再通电,计算时扣除零漂,但如果出现负零漂,也没有办法。
-----------------------------------------------------------------------

我们加的电阻就是把电压拉到正偏移,如果是负的偏移,AD采集不到没办法补偿的。




回复【23楼】awfi
换抵失调运放会不会好点.
另,可以换成4个op07吗?

-----------------------------------------------------------------------

换运放是个简单的办法,我赶紧去找找看。
OP07是单运放,没办法直接代换,得转接,最好是pin to pin 的。

cock 发表于 2010-10-3 19:16:17

估计很难解决,我建议用一小块PCB,放上四个OP07,SO8封装,加上调零电位器,作成一块厚膜电路,代替原来的TL084。
以前我看到你用TL084,就隐隐不安。但一想是台电源,应该能对付。没想到大家的口味这么刁。

awfi 发表于 2010-10-3 19:31:24

回复【25楼】cock
估计很难解决,我建议用一小块pcb,放上四个op07,so8封装,加上调零电位器,作成一块厚膜电路,代替原来的tl084。
以前我看到你用tl084,就隐隐不安。但一想是台电源,应该能对付。没想到大家的口味这么刁。
-----------------------------------------------------------------------
这方法可能比较省钱.

kdtcf 发表于 2010-10-3 19:32:54

回复【25楼】cock
估计很难解决,我建议用一小块pcb,放上四个op07,so8封装,加上调零电位器,作成一块厚膜电路,代替原来的tl084。
以前我看到你用tl084,就隐隐不安。但一想是台电源,应该能对付。没想到大家的口味这么刁。
-----------------------------------------------------------------------

TL084的失调是有些大,不过补偿下是够用的,阿莫买的安捷伦电源里面也是用的TL084,我就也用了TL084。

awfi 发表于 2010-10-3 19:33:12

OP07速度慢,不知能否应付?

kdtcf 发表于 2010-10-3 19:39:52

20楼说的运放失调有些吹毛求疵了,TL084的输入失调温漂是10uV/℃,就算变化范围30℃,那么10uV * 30℃ = 300uV,只有不到初始失调的十分之一,跟本就不用考虑这个问题。

yxzt 发表于 2010-10-3 20:33:15

25楼的办法可以考虑,春风有条件的话可以试试,我等拭目以待
另:也不是说口味刁,这个本来就是DIY的乐趣之一,没有最好,只有更好

yqjyy 发表于 2010-10-3 20:50:20

回复【26楼】awfi
回复【25楼】cock   
估计很难解决,我建议用一小块pcb,放上四个op07,so8封装,加上调零电位器,作成一块厚膜电路,代替原来的tl084。
以前我看到你用tl084,就隐隐不安。但一想是台电源,应该能对付。没想到大家的口味这么刁。
-----------------------------------------------------------------------
这方法可能比较省钱.

-----------------------------------------------------------------------

出来了我也要订一块

wandy2010 发表于 2010-10-3 22:05:12

个人感觉小电流显示零点几mA的误差,1A有1mA的误差,可以接受了,其实比一般的3位破数字表都准了。

不论是控制,还是检测,软件补偿都是正常有效的手段。

wandy2010 发表于 2010-10-5 08:45:26

回复【18楼】yqjyy
我按图加3个电阻,刷修改版程序(20100924版程序研究修改电流显示分段补偿.rar),重新校准后,设定恒流1.000a,但实际工作时候电源显示1.004a,外接万用表显示1.000a,现在该采取什么措施?
-----------------------------------------------------------------------

13楼的方法可以吗?

yqjyy 发表于 2010-10-5 09:21:51

回复【33楼】wandy2010
回复【18楼】yqjyy
我按图加3个电阻,刷修改版程序(20100924版程序研究修改电流显示分段补偿.rar),重新校准后,设定恒流1.000a,但实际工作时候电源显示1.004a,外接万用表显示1.000a,现在该采取什么措施?
-----------------------------------------------------------------------
13楼的方法可以吗?
-----------------------------------------------------------------------

这两天到湖北出差了,回去再试试,谢谢!
页: [1]
查看完整版本: 软硬兼施解决100mA以下的电流显示问题(春风及时出手,提供电路改动方案)