OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5217|回复: 5

关于AD DA数控电源的补偿算法问题

[复制链接]

56

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
376
金钱
376
注册时间
2013-4-25
在线时间
0 小时
发表于 2013-8-11 10:34:41 | 显示全部楼层 |阅读模式
最近在做一个数控电源,流程是这样的,设定电压值——DA输出(有误差)——AD检测输出电压——根据设定值与实际输出的关系进行反馈补偿调整,但是最后一步我不知道怎么写了,就是关于最后一块调整的算法,求指教

我的主函数

#include<reg52.h>

#include"ad_tlc2543.h"
#include"delayyy.h" 
#include"serial.h" 
#include"dac1230.h"
#include"display.h"

#define uint unsigned int
#define uchar unsigned char

float f_Voltage;
float f_Voltage_Set=12.00;

void main()
{
   uint ad=0;
   float f_Voltage_Set_Temp=f_Voltage_Set;
   
   //uchar i;
   init_serial();                                                  //串口初始化
   Init_dac1230();                                                  //dac1230初始化
   init_1602();                                                          //1602初始化
   IE=0; //屏蔽中断
           while(1)
           {
           //////////DA/////////////
           Write_Date_1230(f_Voltage_Set_Temp);                                                     //往此函数写一个数n则输出一个电压值n
           //////////DA/////////////


           //////////AD/////////////
           ad=read2543(0);                                                                                      //此函数读取通道0的电压值
           f_Voltage=(float)ad/0x0fff*5;                                                         //f_Voltage即是此电压值的十进制浮点数值
           f_Voltage=3.0*f_Voltage;                                                                         //分压采集电压

           display(f_Voltage_Set_Temp);

           delay1ms(1000);
             //下面是调整部分,但是仿真结果不对
           if(f_Voltage>f_Voltage_Set)
           {
                           f_Voltage_Set_Temp=f_Voltage_Set-(f_Voltage-f_Voltage_Set);                                
           }
           else
           {
                           f_Voltage_Set_Temp=f_Voltage_Set+(f_Voltage_Set-f_Voltage);                                
           }

           display(f_Voltage_Set_Temp);
//
//           i=0;
//           while(i<7)
//                   {
//                         if(TI==1)
//                             {
//                                     SBUF=buf;
//                                     TI=0;
//                                     i++;
//                             }
//                   }
//                   delay1ms(1000);                                                                                         //1秒发送一次
           }
           //////////AD/////////////

}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-11 10:41:23 | 显示全部楼层
回复 支持 反对

使用道具 举报

56

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
376
金钱
376
注册时间
2013-4-25
在线时间
0 小时
 楼主| 发表于 2013-8-11 10:54:00 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
是仿真啊,非得实际电路吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-11 12:06:28 | 显示全部楼层
if(f_Voltage>f_Voltage_Set)
           {
                           f_Voltage_Set_Temp=f_Voltage_Set-(f_Voltage-f_Voltage_Set);                                
           }
           else
           {
                           f_Voltage_Set_Temp=f_Voltage_Set+(f_Voltage_Set-f_Voltage);                                
           }
改为

           if(f_Voltage>f_Voltage_Set)
           {
                           f_Voltage_Set_Temp--;                                
           }
           else
           {
                           f_Voltage_Set_Temp++;                                 
           }
试试
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

56

主题

143

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
376
金钱
376
注册时间
2013-4-25
在线时间
0 小时
 楼主| 发表于 2013-8-11 23:45:39 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
貌似不行,被我改成这样了


   if(f_Voltage>f_Voltage_Set)
   {
f_Voltage_Set_Temp=f_Voltage_Set-0.01;
   }
   if(f_Voltage<f_Voltage_Set)
   {
f_Voltage_Set_Temp=f_Voltage_Set+0.01;

效果不错,但是我又发现一个问题就是如果把0.01改为0.001,0.005甚至0.009都不会引起f_Voltage_Set_Temp的变化,怎么回事>
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2013-8-12 00:05:29 | 显示全部楼层
回复【5楼】fk1174:
---------------------------------
看错了,原来你的还是浮点数....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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