矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: xisogou

请教几个仿制数控直流电源出现的问题

[复制链接]
     
发表于 2019-2-20 11:07:34 | 显示全部楼层
本帖最后由 bg1trk 于 2019-2-20 11:16 编辑
xisogou 发表于 2019-2-20 10:55
不是的,我买的模块,用的自带的程序



您的模块,程序里应该没有校正环节。不做校正,难免误差大一点。
因为ADC、DAC的离散性,校正用的参数每块板子都不一样。手工确定校正用的参数比较费时,程序写成自校正也可以。不过从您贴出的曲线来看,厂家是把校正环节给省了。


您没有源程序,校正这个环节做不了,只能这样了。

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-20 14:46:47 | 显示全部楼层
bg1trk 发表于 2019-2-20 11:07
您的模块,程序里应该没有校正环节。不做校正,难免误差大一点。
因为ADC、DAC的离散性,校正用的参 ...

您好!所谓校正是不是这样:假设根据现在单片机读出的数据,可以做一条斜率为0.9的直线,比如是函数y=0.9x,而用万用表测的数据据,做的出的直线斜率为0.95,函数为y=0.95x。然后我把单片机读出的数据乘以0.95/0.9的值就可以了。
回复 支持 反对

使用道具 举报

     
发表于 2019-2-20 16:28:16 | 显示全部楼层
xisogou 发表于 2019-2-20 14:46
您好!所谓校正是不是这样:假设根据现在单片机读出的数据,可以做一条斜率为0.9的直线,比如是函数y=0.9 ...


原理上大概是您说的意思,就是把AD后的值经修正后使其等于表测值,再把经修正的值送显,这样屏显值就与表测值一致了,DA同理。
因AD、DA的误差不是线性的,您说的招数不能用。我的数控电源在此处用的是最小二乘法做分段拟合。

回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-21 10:11:33 | 显示全部楼层
bg1trk 发表于 2019-2-20 16:28
原理上大概是您说的意思,就是把AD后的值经修正后使其等于表测值,再把经修正的值送显,这样屏显值就与 ...

您好!请问您用最小二乘法分了几段?根据什么分段?最后误差减小到多少合适?

补充内容 (2019-2-21 14:10):
我试了试,感觉误差不小。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-21 15:44:11 | 显示全部楼层
我是每隔1V取样,取样点少吗?
回复 支持 反对

使用道具 举报

     
发表于 2019-2-21 20:40:12 | 显示全部楼层
本帖最后由 bg1trk 于 2019-2-22 19:58 编辑
xisogou 发表于 2019-2-21 10:11
您好!请问您用最小二乘法分了几段?根据什么分段?最后误差减小到多少合适?

补充内容 (2019-2-21 14:1 ...



AD、DA共4个校正函数,分段数不太一样,大概分5-7段吧。
ADC、DAC都是12位的,屏显最小设在百分之一伏(0.00V)。校正后,显示基本与"标准"表相同,正负2-3个字。
回复 支持 反对

使用道具 举报

     
发表于 2019-2-21 20:49:18 | 显示全部楼层
本帖最后由 bg1trk 于 2019-2-21 20:58 编辑
xisogou 发表于 2019-2-21 15:44
我是每隔1V取样,取样点少吗?



您手上有源程序吗?

如果有源程序,给您一个我现用的校正函数供参考:

/*********************************************************************************
*   函 数 名  : ProcessVoltage_ADC_V()
*   功能说明: 输出电压DA值转换并分段矫正为与实际输出相等,用于显示
*   形       参:Temp
*   返 回 值 : 输出电压值
*   日      期: 2018-5-26
*********************************************************************************/
float ProcessVoltage_ADC_V(float Temp)
{
    Temp = Temp* 3267 / 4095;    //单位:mV   3267是3V3的实际值

/*******************************以下为最小二乘法校正*****************************************/   
    if(Temp<=50) Temp = 1.027777778 * Temp + 1.305555556;   
     else
       if(Temp>50 && Temp<1000) Temp = 1 * Temp + 2;
         else
           if(Temp<1500) Temp = 0.99915493 * Temp + 3.932957746;
             else
               if(Temp<2100) Temp =1.0025 * Temp - 1.05;
                 else
                    if(Temp<2500) Temp = 1 * Temp - 1;
                      else
                        if(Temp<3000) Temp = 1 * Temp - 1;
                          else  Temp = 1 * Temp - 1;
     Temp=Temp+0.5;
     return (Temp);    //返回mV时Temp*1000
}


其中诸如“Temp =1.0025 * Temp - 1.05”是校正公式,公式中的两个常数项,是根据各分段高低点的实际值和理想值计算得出的。
所谓校正,就是经测量、计算,确定这两个常数项的值。
回复 支持 反对

使用道具 举报

     
发表于 2019-2-21 20:49:22 | 显示全部楼层
应该调整输出端的电容,再看负载电压多大!
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-24 12:09:12 | 显示全部楼层
bg1trk 发表于 2019-2-21 20:49
您手上有源程序吗?

如果有源程序,给您一个我现用的校正函数供参考:

这两天捣鼓捣鼓,有效果,一般在2-3字误差,个別的到4-5字,电压小于0.2时误差就太了,搞不定,是不是ad和da的位数低的原因啊?
回复 支持 反对

使用道具 举报

     
发表于 2019-2-24 13:17:28 | 显示全部楼层
xisogou 发表于 2019-2-24 12:09
这两天捣鼓捣鼓,有效果,一般在2-3字误差,个別的到4-5字,电压小于0.2时误差就太了,搞不定,是不是ad ...

请详细说说您是怎么校正的?
能把这部分的源程序贴出来看看吗?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-24 15:55:53 | 显示全部楼层
bg1trk 发表于 2019-2-24 13:17
请详细说说您是怎么校正的?
能把这部分的源程序贴出来看看吗?

if(v>29000)                //′大于29V时
                v=v*0.993428323;
        else if(v>21000&&v<=29000)
                v=v*0.987636749+199;
        else if(v>19000&&v<=21000)
                v=v*1.282051282-5384;
        else if(v>8800&&v<=19000)
                v=v*0.984317699+275;
        else if(v>3988&&v<=8800)
                v=v*0.979700811+281;
        else if(v>880&&v<=3988)
                v=v*0.968642437+259;
        else if(v>170&&v<=880)
                v=v*1.058301433+220;
        else                                                                小于0.17V实际显示为0.00
                v=v*8;
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-2-24 15:56:59 | 显示全部楼层
访问论坛,浏览器有时候就死了,用的360浏览器
回复 支持 反对

使用道具 举报

     
发表于 2019-2-24 19:58:45 | 显示全部楼层
本帖最后由 bg1trk 于 2019-2-25 20:00 编辑
xisogou 发表于 2019-2-24 15:55
if(v>29000)                //′大于29V时
                v=v*0.993428323;
        else if(v>21000&&v19000&&v8800&&v3988&&v880&&v170 ...


程序没啥问题,校正公式里的两个常数项您是怎么计算的?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2019-3-2 17:33:19 | 显示全部楼层
本帖最后由 xisogou 于 2019-3-2 17:55 编辑
bg1trk 发表于 2019-2-24 19:58
程序没啥问题,校正公式里的两个常数项您是怎么计算的?


现在只有周末有点时间捣鼓
21        21.05        442.05        443.1025       
22        22.08        485.76        487.5264       
23        23.08        530.84        532.6864       
24        24.11        578.64        581.2921       
25        25.1        627.5        630.01       
26        26.12        679.12        682.2544       
27        27.13        732.51        736.0369       
28        28.16        788.48        792.9856       
y均值        x均值        Σxy/n        Σx方/n       
25.00000         25.11143         631.83571         634.68454        
k        b        n               
0.987636749        0.199030329        7               
用excel计算的,今天下午又改了改程序,还是那样

我的AD用的是TM7705不是AD7705这个有关系吗?

补充内容 (2019-3-2 20:44):
应该不是芯片的原因,我用自带程序试了,虽然不是那么准确,但是不至于0.2以下没有数
回复 支持 反对

使用道具 举报

     
发表于 2019-3-2 19:36:08 来自手机 | 显示全部楼层
把程序全传上来看看
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-5-4 12:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表