历史上的今天
今天是:2025年02月15日(星期六)
2020年02月15日 | 基于51单片机数控恒流源
2020-02-15 来源:51hei
电路原理图如下:
该项设计的主要目的是设计一种数控稳压电源。它利用单片机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按下
史海拾趣
|
自己如何设计一个用在WINCE5.0下的FlashPlayer ? 我想在vs2005开发平台上设计一个可以用在WINCE5.0上面使用的FlashPlayer,有哪个高手做过? 方便给些基础的代码或者参考资料吗?… 查看全部问答> |
|
BITMAP bm; GetObject((HBITMAP)hBitmap, sizeof(BITMAP), &bm); 为什么获取的bm.bmBits总为0? 但是bm.width 等其他可以获取到值,求教这是为啥? 哪出错了?… 查看全部问答> |
|
嘿 各位: 我定义了一个结构的二维数组,然后用一个函数进行初始化,但是用tornado怎么也编译不过,但是在vc++6.0上面可以成功。请问是什么原因呢? typedef struct ...… 查看全部问答> |
|
if (temp&0x10); 为什么当temp最高位为1的时候,结果为真?当temp最高位为1时if 语句不是判断0x10是否为真吗?难道说if(不为0)结果就是真?… 查看全部问答> |
|
我打开IAR,建立工程,在器件选择上,找了半天也没有找到这个LPC810, -----IAR V6.4 只有自己做SCF文件了 大家都用什么作编译器呢?… 查看全部问答> |
|
采用12V~15V电源供电,300 Lumen输出 选好设计目标之后,选择LED的类型,下图选了一个功效比较高的 然后是驱动电路的选取,以简单为原则,选第一项 设计概览如下 原理图如下所示,采用3个LED串联输出 … 查看全部问答> |
|
经过几天调试,终于把下位机部分完成。感受如下: 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 二 ...… 查看全部问答> |




