tangaoo 发表于 2012-4-18 16:45:39

基于UC3843步进可调稳压电源设计(已完成)

1.UC3843芯片的datasheet。在动手设计之前一定要开明白它每个管脚的工作原理。可以参考白沙前辈的一步一步教你做个单端反激电源。这里面把UC3843的工作原理讲解的很清楚。在论坛里很容易就收到了。
2.上原理图,见附件。
该原理图的不难理解。难点大概是如何实现开关电源的步进可调。根据自己的意愿输出任意值(当然在一定的范围内)。利用UC3843,配合单片机控制系统实现对开关电源的闭环控制。在开环的基础上扩展A/D转换器,经采样电路采样,电源的输出电压实时的反馈回控制系统。通过程序设定,给定电压不断与反馈电压进行比较然后决定电源专用芯片反馈输入脚所加的电压值。直到二者达到动态平衡(满足在一定范围内的相等),这样使得单片机控制电路在反馈回路的作用下,既能够实现输出电源的步进可调,又保证了输出电压的稳定。简单点说就是在UC3843的电压反馈输入脚上下文章。单片机经过DA后,往该脚上加一个电压,便能控制输出电压的大小。大致的关系是,所加电压越小,输入的电压就越大。这个可以具体实践。
3.程序部分
/*********************************
时间:2011年8月25日
功能:基于UC3843芯片的升压 显示 步进可调

   
*********************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define N 50
uint ddata;
uint ddata2;
uint sentnum;
uint sentnum1=0x5af;
uchar keynum;
uchar table[]={"实时电压:"};
uchar table2[]={"实时电流:"};

//显示部分
sbit rs=P0^5;
sbit rw=P0^6;
sbit e=P0^7;
sbit psb=P0^4;

//DA部分
sbit din=P1^3;
sbit clk2=P1^4;
sbit cs2=P1^5;

//第一块AD部分 检测电压
sbit clk=P1^0;
sbit cs=P1^1;
sbit dout=P1^2;

//第二块AD部分 检测电流
sbit clk3=P3^0;
sbit cs3=P3^1;
sbit dout3=P3^2;

//按键部分
sbit key1=P0^1;
sbit key2=P0^2;
sbit key3=P0^3;

//蜂鸣器
sbit leep=P0^0;


//TLV5618DA部分
voiddac5618(int vcon)   //TLC5618DAC子程序,三线串行方式
{
       char i;
       uint svcon;
       svcon=vcon|0x8000;   //vcon最高位置1,选择TLC5618的A通道
       cs2=0;                   //置5618的CS=0,允许片选
       for(i=0;i<16;i++)
       {
               din=svcon&0x8000;               //串行方式送16位数据
               svcon<<=1;
               clk2=0;
               clk2=1;
       }
       cs2=1;                              //禁止片选
}


//TLC1549AD部分(1)
uint get_data()
{
        uchar i;
        uint temp=0;
        cs=1;
        _nop_();
        cs=0;
        for(i=0;i<10;i++)
        {
                clk=0;
                temp=(temp<<1)|dout;
                clk=1;
                _nop_();
        }
        cs=1;
        return(temp);
}


uint filter()          // 滤波子程序 中位值平均滤波法
{
unsigned long int datas = 0;
uint i,temp1;
uchar x,y,z;
for(z=0;z<N;z++)
{
        ddata=get_data();       
}
   for(y=0;y<N;y++)                                                               // 将得到的数据从大到小排序
    {
       for(x=1;x<N+1-y;x++)
          {
           if((ddata)>(ddata))
          {
                  temp1=ddata;
                  ddata=ddata;
                  ddata=temp1;
                }
          }
        }
for(i=5;i<N-5;i++)                                                                       // 滤除高2位和低2位数据
   {
          datas+=ddata;
   }
   datas/=(N-10);
   datas=(unsigned int)datas;
   return (datas);
}


uint dianya()
{
        long int m;
        doublen;
        m=filter()/1;
        n=(float)m/6.95;
        n=n*35;
        m=n;
        return m;
}


//TLC1549AD部分(2)
uint get_data2()
{
        uchar i;
        uint temp=0;
        cs3=1;
        _nop_();
        cs3=0;
        for(i=0;i<10;i++)
        {
                clk3=0;
                temp=(temp<<1)|dout3;
                clk3=1;
                _nop_();
        }
        cs3=1;
        return(temp);
}


uint filter2()          // 滤波子程序 中位值平均滤波法
{
unsigned long int datas = 0;
uint i,temp1;
uchar x,y,z;
for(z=0;z<N;z++)
{
        ddata2=get_data2();       
}
   for(y=0;y<N;y++)                                                               // 将得到的数据从大到小排序
    {
       for(x=1;x<N+1-y;x++)
          {
           if((ddata2)>(ddata2))
          {
                  temp1=ddata2;
                  ddata2=ddata2;
                  ddata2=temp1;
                }
          }
        }
for(i=5;i<N-5;i++)                                                                       // 滤除高2位和低2位数据
   {
          datas+=ddata2;
   }
   datas/=(N-10);
   datas=(unsigned int)datas;
   return (datas);
}


uint dianliu()
{
        long int m;
        doublen;
        m=filter2()/1;
        n=(float)m/6.95;
        n=n*35;
        m=n;
        return m;
}






//显示部分
void delayus(uint time_nop)
{
    uint i;
        for(i=0;i<time_nop;i++)
        {
          _nop_();
        }
}
void delayms(uint z)
{
   uint x,y;
        for(x=z;x>0;x--)
       for(y=110;y>0;y--);
}
void write_12864com(uchar com)
{
    rw=0;
        rs=0;
        delayus(50);
        P2=com;
        e=1;
        delayus(500);
        e=0;
        delayus(100);
}
void write_12864dat(uchar dat)
{
    rw=0;
        rs=1;
        delayus(50);
        P2=dat;
        e=1;
        delayus(500);
        e=0;
        delayus(100);
}
void led_12864pos(uchar x,uchar y)
{
        uchar pos;
        if(x==0)
        x=0x80;
        if(x==1)
        x=0x90;
        if(x==2)
        x=0x88;
        if(x==3)
        x=0x98;
        pos=x+y;
        write_12864com(pos);                               
}


void init()
{
        uchar i;
        delayms(50);
        psb=1;
        write_12864com(0x30);
        delayus(200);
        write_12864com(0x30);
        delayus(200);
        write_12864com(0x0c);
        delayus(200);
        write_12864com(0x01);
        delayus(240);
        write_12864com(0x06);
        delayus(500);
        led_12864pos(0,0);
        for(i=0;i<10;i++)
        {
          write_12864dat(table);
                delayus(50);
        }
        led_12864pos(1,0);
        for(i=0;i<10;i++)
        {
          write_12864dat(table2);
                delayus(50);
        }
}


void display(uint dat)//电压显示函数
{
        uchar ge,shi,bai,qian;
        qian=dat/1000;
        bai=dat/100%10;//分解两位数,因只能一个一个显示
        shi=dat/10%10;
        ge=dat%10;
        led_12864pos(0,5);
        write_12864dat(0x30+qian);
        write_12864dat(0x30+bai);
        //led_12864pos(1,1);
        write_12864dat(0x2e);
        write_12864dat(0x30+shi);
        //led_12864pos(1,2);
        write_12864dat(0x56);
        //write_12864dat(0x30+ge);
}

void display2(uint dat)//电流显示函数
{
        uchar ge,shi,bai,qian;
        qian=dat/1000;
        bai=dat/100%10;//分解两位数,因只能一个一个显示
        shi=dat/10%10;
        ge=dat%10;
        led_12864pos(1,5);
        write_12864dat(0x30+qian);
        //led_12864pos(1,1);
        write_12864dat(0x2e);
        write_12864dat(0x30+bai);
        write_12864dat(0x30+shi);
        //led_12864pos(1,2);
        write_12864dat(0x41);
        //write_12864dat(0x30+ge);
}


//键盘扫描
uint keyscan()
{
        uchar keynum=0;
        uchar i;
        if(key1==0)
        {                                                          
                delayms(10);
                if(key1==0)
                {
                        while(!key1);
                        keynum++;
                        //if(keynum==7)
                        //{keynum=0;}
                }
                for(i=0;i<keynum;i++)
                {
                        sentnum1=sentnum1+170;
                }
               
        }
        if(key2==0)
        {
                delayms(10);
                if(key2==0)
                {
                        while(!key2);
                        keynum++;
                        //if(keynum==7)
                        //{keynum=0;}
                }
                for(i=0;i<keynum;i++)
                {
                       sentnum1=sentnum1-170;
                }
        }
        return (sentnum1);       
}



void main()
{
    init();
    while(1)
        {
          dac5618(keyscan());
                display(dianya());
                display2(dianliu());
                if(dianliu()>=800)
                leep=0;
                delayms(500);
        }
}
该部分其实很简单。写的挺乱的,望大家见谅。大致看一下就能看明白。
呵呵。第一次发帖,可能写的很乱。欢迎大家拍砖!

137703056 发表于 2012-4-18 16:50:20

沙发,顶起!

475627406 发表于 2012-4-18 18:56:20

参考下
等我做的时候肯定会加个运放,不然这单片机的速度,哎

tangaoo 发表于 2012-4-19 21:37:44

137703056 发表于 2012-4-18 16:50 static/image/common/back.gif
沙发,顶起!

谢谢支持哈

tangaoo 发表于 2012-4-19 21:39:41

475627406 发表于 2012-4-18 18:56 static/image/common/back.gif
参考下
等我做的时候肯定会加个运放,不然这单片机的速度,哎

现在不是单片机直接输出PWM波 是由它控制UC3843输出PWM波了 所以速度还好啦

Water_Wind 发表于 2012-4-28 10:47:49

请问楼主的电压输出最大为多少.
DA是直接连接到UC3843的1,2脚管吗?
TLV5618的参考电压是多少.?
另外.楼主说的.             白沙前辈的一步一步教你做个单端反激电源怎么找不到..
最近刚在学这个..

tangaoo 发表于 2012-4-28 12:59:11

Water_Wind 发表于 2012-4-28 10:47 static/image/common/back.gif
请问楼主的电压输出最大为多少.
DA是直接连接到UC3843的1,2脚管吗?
TLV5618的参考电压是多少.?


40V左右 电流可以达到1.5A 是可以直接应为这个管脚是电压反馈型(不过我总是觉得有点不妥)
至于那个资料我在这里上传一份吧再

auto01 发表于 2012-4-28 13:38:49

学习一下,希望资料更详细点

Water_Wind 发表于 2012-4-28 16:46:58

再请教下楼主.
1.为什么Vref要接地呢?
2.输出电压 =DA * ( 1 + ( 24K + 5K(电位器) / 2.2K ) )是吗?
3.电流为什么那样取样?

Water_Wind 发表于 2012-4-28 17:16:46

刚才那个Vref接地知道了.
楼主.
TLV5618需要5V的VDD,可以把Vref拉出去给它用吗?

Water_Wind 发表于 2012-4-28 20:26:47

楼主还有个问题.
输出电压和VCC有关系吗??
输出电压 = VCC * D??   D为占空比.

Water_Wind 发表于 2012-4-28 21:22:43

楼主还有个问题.
比如. 我要输出15V电压 .
DA输出的电压为多少.15V???

Water_Wind 发表于 2012-4-28 22:44:54

楼主上了,一定要回帖......

fydzaa 发表于 2012-4-28 22:48:29

支持。纯支持

fydzaa 发表于 2012-4-28 22:53:26

不过;我有一个问题;这样电压采样是不是慢了点?空载电压波动是不是有点大;

Water_Wind 发表于 2012-4-28 23:04:20

楼主.还有那个电流的DA有什么用.???

fydzaa 发表于 2012-4-29 15:51:42

电流;我倒是看懂了{:titter:

D.. 发表于 2012-4-29 16:21:19

fydzaa 发表于 2012-4-29 15:51 static/image/common/back.gif
电流;我倒是看懂了{:titter:

请问你知道那个输出电压和3脚管的反馈电压到底是什么数量关系啊???
这个问题我烦死了..

fydzaa 发表于 2012-4-29 16:25:07

软件控制电流

Water_Wind 发表于 2012-4-29 16:30:12

fydzaa 发表于 2012-4-29 16:25 static/image/common/back.gif
软件控制电流

我问的电压... .
比如要输出15V电压.
3脚管需要加电压多少???

Water_Wind 发表于 2012-4-29 23:25:51

楼主DA的那个电流是干嘛的??   只是把数据平均然后给Isense吗?
好像这个并不能当恒流源..
还有楼主. UC3843内部的误差放大器,没有闭环吗??就是反馈电压没有直接到Vfb吗??

fydzaa 发表于 2012-4-30 08:10:32

唉;他还有一部分电路没有画出来;

fydzaa 发表于 2012-4-30 09:15:02

应该是DA+采样电压=3脚电压吧;

不知道有没有人试过在4脚去掉定时电阻;电容;外加一个PWM方波;6脚会输出什么波形;;唉我手上没有示波器;那位大侠试试

ding86361953 发表于 2012-4-30 11:13:07

楼主我想问下,你这个是升压电路。
怎么开关管接在整流管后面了啊????

lcmdw 发表于 2012-11-8 11:02:57

mark{:smile:}

sunnyhook 发表于 2012-11-8 11:17:23

ding86361953 发表于 2012-4-30 11:13 static/image/common/back.gif
楼主我想问下,你这个是升压电路。
怎么开关管接在整流管后面了啊???? ...

这个我也疑惑,感觉到不对啊,开关管因该在升压电感的后面续流管的前面。如果用单片机介入做负反馈,势必会影响频响,性能不会好。
我做过类似的,是直接用模拟的馈环,只是通过单片机DAC直接影响基准,效果比较好。

sunnyhook 发表于 2012-11-8 11:19:46

Water_Wind 发表于 2012-4-28 10:47 static/image/common/back.gif
请问楼主的电压输出最大为多少.
DA是直接连接到UC3843的1,2脚管吗?
TLV5618的参考电压是多少.?


5618是使用外部基准的,而且内部会倍压,比如说外接2.048V的基准,满幅输入4.096V

zxy882266 发表于 2013-4-8 00:22:03

楼主瞎跑了,正在研究3843,说说看啊

zxy882266 发表于 2013-4-8 00:24:41

楼主瞎跑了,正在研究3843,说说看啊

mhw 发表于 2013-4-8 15:46:58

这个电路很危险……

1125526801 发表于 2013-7-2 23:47:21

我也想用pic和3843组合的电源,学习一下

zjk 发表于 2014-4-21 09:57:48

mark,标记

vonkun 发表于 2014-7-28 15:03:22

3843的2管脚接地的话,会一直升压吧???

小菜鸟001 发表于 2014-8-3 15:58:39

楼主吓跑了~
页: [1]
查看完整版本: 基于UC3843步进可调稳压电源设计(已完成)