电路原理图如下:
该项设计的主要目的是设计一种数控稳压电源。它利用单片机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按下
- {
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10); //此处调用显示函数就是延时去抖的作用
- if(KEY1==0) //再次判断按键按下
- {
- if(U<960) //1V对应的是80 10位ad(10位ad最大数据是1024,这里为了取整数,选择80对应1V,也就是8对应0.1V,因为电压调节的变化一共有120种)
- U=U+8; //电压加0.1V
- }
- }
- if(KEY2==0) //按键2按下
- {
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- if(KEY2==0)
- {
- if(U>=8) //电压减
- U=U-8;
- }
- }
- if(KEY3==0) //按键3按下
- {
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- if(KEY3==0)
- {
- U=400; //输出5V电压
- }
- }
- if(KEY4==0) //按键4按下
- {
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- shuma(U/8*10);
- if(KEY4==0)
- {
- U=0; //关闭输出
- }
- }
- }
- GETU=A_D(); //读取ad数据
- if(GETU>=12) //0.0196V,采样电阻采集到的电压数据
- {
- U=0; //关闭输出
- flag=1; //短路标志位
- }
- }
- }
复制代码
以上程序51hei提供下载:
C程序注释.zip
(43.94 KB, 下载次数: 150)
原理图.pdf
(222.22 KB, 下载次数: 140)
重点:电路原理讲解.doc
(791.5 KB, 下载次数: 135)
|