历史上的今天
返回首页

历史上的今天

今天是:2025年02月15日(星期六)

2020年02月15日 | 基于51单片机数控恒流源

2020-02-15 来源:51hei

电路原理图如下:
0.png?imageView2/2/w/550

该项设计的主要目的是设计一种数控稳压电源。它利用单片机STC89C51作为主控芯片,控制数字/模拟转换器(TLC5615)的输出电压的大小,经过运算放大器LM358与IRF9Z24N构成负反馈系统,从而输出恒定电压。最后通过电位器分压将输出信号反馈到运算放大器LM358上,使输出准确度可以调节。此设计通过键盘电路与单片机连接,读入控制数据,利用软件进行判断,从而起到控制电源输出的作用。通过LCD1602(或LED数码管)显示数控电源的输出电压,实现简单的人机对话。该项设计具有设计简单,控制灵活,调节方便,携带方便、成本低等优势,具有较强的实用性。


下图是为了了解整个电路如何工作的,把整个电路拆开。

二、原理讲解:

供电部分:

P2为接线柱,是整个系统的输入电压端口,整个数控电源有此输入能量。D1、D2、D3、D4为四个二极管(in4007),起整流的作用,C6为滤波电容。整流滤波电路是使供电可以为交流,同时也可以用直流供电(交流供电不要超过20V,直流不要超过35V)。受电压限制的主要是后级运放耐压、TL431耐压以及7812的耐压值。7812主要为保护7805,7805稳出5V电压共单片机供电使用。但是7805耐压值是15V,所以前级要加7812保护7805。

晶振部分:

C2、C3、Y1(12MHZ)与单片机端口构成震荡电路,为51单片机提供时钟。

复位电路:

RST连接单片机复位管脚,此电路及有上电复位功能,又有手动复位功能。C1、R2构成上电复位电路,上电瞬间C1导通,则RST为高电平,单片机将复位,电压稳定后C1储存的电能通过R2对地释放掉,单片机将正常运行。同样K2按下时RST为高电平,单片机复位,弹起来时RST为低电平,单片机正常运行.

单片机部分:

单片机默认选用STC89C51,同时兼容STC89C52、AT89S52、AT89S51、AT89C51等51单片机。

按键部分:

按键选用独立按键,扫描时间短,使程序更简单且扫描时间更短,从而提高稳定性。按键弹起时P20、P21、P22、P23为弱上拉状态,所以为高电平。按键按下时对应的I/O口为低电平,可以被程序中的扫描函数检测到。


数码管显示部分:

数码管显示采用四位一体共阳数码管,这样使电路更为简单,只需四个9012三极管就可以将其驱动。P24、P25、P26、P27分别作为数码管的位选端,控制是否选通哪一位数码管。采用PNP型三极管,低电平导通,高电平截止。R20、R30、R40、R50为三极管基极限流电阻,此电阻及能保护三极管又能保证三极管导通时处于完全导通状态。R51为限流电阻,此电阻的大小直接决定数码管的亮暗成都,在此选择220欧姆、1/4色环电阻。数码管的阴极端直接接单片机的P0口,而不需上拉电阻。STC89C51的单片机P0口为漏极开路,所以作为输出时必须接上拉电路,而作为输入时相当于数码管作为上拉,所以不再需要上拉电阻,及简化了电路又节省了成本。

数模转换部分:(此为数控电压数控调压关键所在)

数模转换采用德州仪器的TLC5615,此为一片10位串行单5V电源DAC,直接电压输出。单片机P33、P32、P34分别连接TLC5615的时钟端、片选端、数据端即可控制它输出想要的电压。此时TLC5615的6脚及参考电压输入端需接入2.5V的参考电压。根据公式可知,当参考电压为2.5V时,TLC5615将最大输出5V电压。

TL5615(DAC)电压计算公式


Vout为7脚输出电压,Vrefin为6脚参考电压输入端,N为单片机通过1、2、3管脚向TLC5615写入的数据,1024是根据这是一片10位数模转换而计算出来的(210=1024),最后乘以二是因为TLC5615内部有2倍的增益放大器。

在给TLC输入2.5V参考电压的时候,我们用了TL431芯片。TL431是可控精密稳压源。它的输出电压用两个电阻就可以任意的设置到从Verf(2.5V)到36V范围内的任何值。该器件的典型动态阻抗为0.2Ω,在很多应用中用它代替稳压二极管。

同时用LM358作为跟随器,减小2.5V基准电源的阻抗,再送入TLC5615 参考电压端。

(写论文时,可以在此讲解TL41技术参数LM358技术参数和原理和跟随器电路原理)

TLC5615内部原理图:

                         TLC5615逻辑时序图:




在给TLC输入2.5V参考电压的时候,我们用了TL431芯片。TL431是可控精密稳压源。它的输出电压用两个电阻就可以任意的设置到从Verf(2.5V)到36V范围内的任何值。该器件的典型动态阻抗为0.2Ω,在很多应用中用它代替稳压二极管。

同时用OPA2107作为跟随器,减小2.5V基准电源的阻抗,再送入TLC5615 参考电压端。

(写论文时,可以在此讲解TL41技术参数OPA2107技术参数和原理和跟随器电路原理)


MOS放大部分:

将上述TLC5615输出的可调电压送到运放LM358的反相端,通过MOS管(F9Z24N)放大。同时在F9Z24N的输出端用RW1(10K)电位器分压,取一定比例的输出电压反馈到比较器正相端,构成一个反馈系统。此时MOS管输出的PWM波的占空比将根据负载和输入电压而变化以保证输出电压的稳定。C5作为输出滤波电容,滤掉输出电压纹波。

根据反馈系统的稳定原理计算出输出电压的公式,如下:

设:Vo为输出电压,Vin为LM358的2脚输入电压,RWH为电位器上部分电阻,RWL为电位器下部分电阻,RW为电位器阻值。

Vo=Vin×(RW/RWL);

(写论文时,可以在此讲解F9Z24N技术参数)

报警电路:

此电路可以由单片机控制三极管(8550/9012)的通断来控制蜂鸣器的报警。当P36为高时,三极管不高通,为低时三极管导通蜂鸣器响。当过流或短路时,单片机切断输出,同时蜂鸣器报名。


单片机源程序如下:


#include "reg52.h"                        //包含头文件


//宏定义

#define uchar unsigned char

#define uint  unsigned int


//按键定义

sbit KEY1= P2^0;

sbit KEY2= P2^1;

sbit KEY3= P2^2;

sbit KEY4= P2^3;


//数码管位选端定义

sbit W1= P2^4;

sbit W2= P2^5;

sbit W3= P2^6;

sbit W4= P2^7;


//DAC定义

sbit  CS_5615=P1^5;                 //定义片选信号IO口 

sbit CLK_5615=P1^6;                 //定义时钟信号IO口 

sbit DAT_5615=P1^7;                 //定义数据输入IO口 


//ADC定义

sbit  CS=P3^5;                       //定义片选信号IO口 

sbit CLK=P3^3;                       //定义时钟信号IO口 

sbit DIO=P3^4;                       //定义数据输入IO口 


uint  U; 

uchar GETU=0;

bit flag=0;


uchar code table[]=

{

        0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7

};        //共阳数码管段码表        没有小数点 0~9

uchar code table1[]=

{

        0x7F,0x64,0xBD,0xF5,0xE6,0xF3,0xFB,0x67,0xFF,0xF7,0x5e

};//带小数点的编码            0~9



void delay_ms(uint z)                      //延时函数

{

  uint a,b;

  for(a=z;a>0;a--)

   for(b=5;b>0;b--);

}


void  shuma(uint buf)                      //数码管显示程序

{

        uchar a,b,c,d;                     //定义变量

        a=buf/1000;                        //将数据除以1000得到千位数据

        b=buf%1000/100;                    //取余1000除以100得到百位数据

        c=buf%100/10;                      //得到十位数据

        d=buf%10;                          //得到个位数据


        W1=0;W2=1;W3=1;W4=1;               //选中第一个位

        P0=~table[a];                      //输入该位要显示的数据

        delay_ms(60);                      //延时


        W1=1;W2=0;W3=1;W4=1;               //选中第二个位

        P0=~table1[b];                     //注释同上

        delay_ms(60);


        W1=1;W2=1;W3=0;W4=1;

        P0=~table[c];

        delay_ms(60);


        W1=1;W2=1;W3=1;W4=0;

        P0=~table1[10];

        delay_ms(60);

        W1=1;W2=1;W3=1;W4=1;

}


void tlc_5615(uint buf)                //DA输出

{

        uint a,c;                      //定义变量

        c=buf;                         //要输出的数据赋值

    CS_5615=0;                         //引脚拉低

        for(a=16;a>0;a--)              //循环16次

        {

         DAT_5615=c>>15;               //把数据串行输入进da芯片(把数据右移15位得到最高位数据,赋值给数据脚)

         c=c<<1;                       //将数据左移一位,下次循环时就是传输第二位数据了

         CLK_5615=1;                         //拉高

         CLK_5615=0;                 //拉低

    }

        CLK_5615=1;

        CLK_5615=0;

        CLK_5615=1;

        CLK_5615=0;

        CS_5615=1;

}


unsigned int  A_D()

{

        unsigned char i,dat;

        CS=1;   //一个转换周期开始

        CLK=0;  //为第一个脉冲作准备

        CS=0;  //CS置0,片选有效

        

        DIO=1;    //DIO置1,规定的起始信号  

        CLK=1;   //第一个脉冲

        CLK=0;   //第一个脉冲的下降沿,此前DIO必须是高电平

        DIO=1;   //DIO置1, 通道选择信号  

        CLK=1;   //第二个脉冲,第2、3个脉冲下沉之前,DI必须跟别输入两位数据用于选择通道,这里选通道CH0 

        CLK=0;   //第二个脉冲下降沿 

        DIO=0;   //DI置0,选择通道0

        CLK=1;    //第三个脉冲

        CLK=0;    //第三个脉冲下降沿 

        DIO=1;    //第三个脉冲下沉之后,输入端DIO失去作用,应置1

        CLK=1;    //第四个脉冲

        for(i=0;i<8;i++)  //高位在前

        {

                CLK=1;         //第四个脉冲

                CLK=0; 

                dat<<=1;       //将下面储存的低位数据向右移

                dat|=(unsigned char)DIO; //将输出数据DIO通过或运算储存在dat最低位 

        }                                  

        CS=1;          //片选无效 

        return dat;         //将读出的数据返回     

}



//主函数

void main(void)

{

        U=0;                                           //电压值显示0

        while(1)                                   //进入循环

        {

                tlc_5615(U);                   //输出电压值

                shuma(U/8*10);                   //显示电压值

                if(flag==0)                           //没有短路

                {

                        if(KEY1==0)                   //按键1按下

推荐阅读

史海拾趣

Aptina (ON Semiconductor)公司的发展小趣事

在快速发展的同时,Aptina注重技术研发与专利布局。公司投入大量资源用于研发,不断推出具有创新性的图像传感器产品。这些产品不仅提升了公司的市场竞争力,还为Aptina积累了大量的技术专利。这些专利成为了公司宝贵的资产,为公司的长期发展奠定了坚实基础。

C&K Switches公司的发展小趣事

在Littelfuse的支持下,C&K Switches公司继续保持着稳健的发展态势。它不断推出新产品和技术,拓展新的应用领域和市场。同时,C&K还加强了与全球客户和合作伙伴的合作关系,共同推动电子行业的发展。展望未来,C&K将继续致力于技术创新和产品研发,不断提升产品质量和服务水平,为客户提供更优质、更可靠的产品和解决方案。

这些故事展示了C&K Switches公司在电子行业中的发展历程和成就。从创立之初的精湛技艺和创新理念,到全球布局和业务拓展,再到技术突破和创新以及与Littelfuse的收购与合作,C&K始终保持着对技术的追求和对市场的敏锐洞察。未来,C&K将继续在电子行业中发挥重要作用,推动行业的发展和进步。

Eagle Plastic Devices公司的发展小趣事

随着全球环保意识的不断提高,Eagle Plastic Devices公司也开始将环保理念融入产品研发和生产过程中。公司采用环保材料、改进生产工艺、降低能耗和排放等措施,努力降低产品对环境的影响。同时,公司还积极参与环保公益活动,倡导绿色消费和可持续发展。这些举措不仅提升了公司的品牌形象,也为公司带来了更多的市场机遇。

福声科技(FUET)公司的发展小趣事

福声科技(FUET)的初创可以追溯到几年前,当时电子产业正蓬勃发展,对高质量电声元器件的需求日益增长。公司创始人凭借在电声领域的深厚积累,决定成立一家专注于电声产品研发、生产和销售的企业。初期,福声科技聚焦于贴片式无源蜂鸣器、高分贝报警器等产品,凭借其高性价比和稳定的性能,迅速在家电、移动通讯设备等领域获得市场认可,为公司的后续发展奠定了坚实基础。

Etron公司的发展小趣事

1991年,台湾的电子行业正蓬勃发展,钰创科技(Etron)在这一时期应运而生,创始人凭借对市场敏锐的洞察力,决定专注于利基型缓冲记忆体产品与系统晶片的设计与生产。初创时期,公司面临着技术、资金和市场等多重挑战。然而,钰创科技凭借其团队的技术实力和创新精神,成功开发出了一系列具有竞争力的产品,逐渐在市场上崭露头角。

Delphi Connection Systems公司的发展小趣事

随着全球对环保意识的不断提高,Delphi Connection Systems公司也积极响应环保号召,致力于研发和生产环保型连接器产品。公司采用环保材料和工艺,减少生产过程中的污染排放,同时推出可回收、可再利用的连接器产品。这一举措不仅符合了环保要求,也为客户提供了更加环保的解决方案。

问答坊 | AI 解惑

自己如何设计一个用在WINCE5.0下的FlashPlayer ?

我想在vs2005开发平台上设计一个可以用在WINCE5.0上面使用的FlashPlayer,有哪个高手做过? 方便给些基础的代码或者参考资料吗?…

查看全部问答>

关于BITMAP 结构体中的bmBits

BITMAP bm; GetObject((HBITMAP)hBitmap, sizeof(BITMAP), &bm); 为什么获取的bm.bmBits总为0? 但是bm.width 等其他可以获取到值,求教这是为啥? 哪出错了?…

查看全部问答>

vxWorks不支持结构的二维数组???

嘿 各位:   我定义了一个结构的二维数组,然后用一个函数进行初始化,但是用tornado怎么也编译不过,但是在vc++6.0上面可以成功。请问是什么原因呢?           typedef  struct   ...…

查看全部问答>

问一个判断“与运算”的问题。

if (temp&0x10);  为什么当temp最高位为1的时候,结果为真?当temp最高位为1时if 语句不是判断0x10是否为真吗?难道说if(不为0)结果就是真?…

查看全部问答>

紧急求助是什么错误

请高手帮我看看错误在哪里?…

查看全部问答>

你用什么编译LPPC810 ?

我打开IAR,建立工程,在器件选择上,找了半天也没有找到这个LPC810, -----IAR V6.4 只有自己做SCF文件了 大家都用什么作编译器呢?…

查看全部问答>

TIStellaris图形库触摸屏事件响应问题求助大神

在button响应函数中我想添加控制灯闪的功能,不知为什么执行不下去!…

查看全部问答>

晒WEBENCH设计的过程+300Lumen LED

采用12V~15V电源供电,300 Lumen输出 选好设计目标之后,选择LED的类型,下图选了一个功效比较高的 然后是驱动电路的选取,以简单为原则,选第一项 设计概览如下 原理图如下所示,采用3个LED串联输出 …

查看全部问答>

【TI首届低功耗设计大赛】完成过半

经过几天调试,终于把下位机部分完成。感受如下: 1 CCS的编译器有点不好用,调试的时候对时序影响很大,这点不如IAR。 2 楼主电脑性能不是很好,CCS太占内存,经常卡。 3 对MSP430FR5969芯片不是很熟悉,对有些关于功耗上的认识不足。 节 ...…

查看全部问答>

【Atmel SAM R21创意大赛周计划】+(ZLLDEMO+SLRemote)步步入门

【Atmel SAM R21创意大赛周计划】+(ZLLDEMO+SLRemote)步步入门目的:了解BITCLOUD下ZLL组网过程,方便后期学习移植一  烧写2板目标文件【Atmel SAM R21创意大赛周计划】+烧写目标文件https://bbs.eeworld.com.cn/thread-453979-1-1.html 二 ...…

查看全部问答>