基于单片机的稳压电源设计原理说明.docx
- 文档编号:300627
- 上传时间:2022-10-08
- 格式:DOCX
- 页数:13
- 大小:380.86KB
基于单片机的稳压电源设计原理说明.docx
《基于单片机的稳压电源设计原理说明.docx》由会员分享,可在线阅读,更多相关《基于单片机的稳压电源设计原理说明.docx(13页珍藏版)》请在冰豆网上搜索。
基于单片机的稳压电源设计原理说明
4稳压电源设计
4.1电路分析
稳压电路见图4-1所示。
三极管射极电压是稳压电源的输出电压,可以接用电器或负载,这个电压值通过TLC549(A/D,同TLC548)数据转换后,送往单片机处理并显示。
调整按键可以改变输入TLC5615(D/A,同TLC5616)的数据。
TLC5615的输出电压通过运算放大器与实际输出取样电压比较,控制三极管的电压输出。
稳压电路的电压输出接受单片机检测,同时又受单片机的控制。
电路在仿真时,各点的电压都连接有电压表显示。
4.2电路模块
一、A/D转换部分
TLC549对输出电压进行采集,其操作如下:
(1)cs先为高电平。
(cs为片选信号,为1时,输入脉i/oclock不起作用);
(2)clock=0
(3)cs=0;cs置底电平。
同时date_out为高。
(=1);
(4)延时1.4us。
(setuptime,cslowbeforefirstclock);
(5)开始转化数据。
因为TLC549是8位串行模数转换器。
需将8位数据依次串行输出。
期间,clock高低电平转化一次;
(6)8次数据转化之后。
cs置1,片选无效。
等待17us后读出数据。
二、D/A转换部分
TLC5615为10位D/A转换电路,其原理TLC5615的PDF文件。
输出电压=(转换数值/1024)*2*基准电压
三、显示
采用数码管对A/D转换后的数据进行显示,因为TLC549是8位A/D,程序中需要对转化的数据进行处理后才能在七段数码管上动态显示。
TLC549的检测电压值范围为0~5V,A/D转换后数据位0~255,应该显示0~5,并且包含小数点部分。
四、按键操作部分
四个独立的按键主要是对DA的输入数据进行操作的,ADD按键,SUB按键这些按键在安下一次松开后便进行加1的操作,若按键超过一定的时间则增加步长,使其数值能够快速增加,这样就不必要达到一个电压时,一直按几百次。
SUB按键也是如此。
至于那个预读取按键,主要是用于保存你要常用的电压值,这样一来你就可以在使用此电源时,不必要每次都要按键调整,可以通过读取AT24C04的值进行电压预置,保存按键,是用于保存你长使用的电压值,通过此次的电压值保存,使你可以快速达到你所要求的电压值。
4.3编程思路
程序分为键盘处理、D/A、A/D和存储四个模块。
运用扫描法,对键盘进行扫描,有按键就更改输入TLC5615的数值,ADD按键是对数据进行加以操做,长按的话使步进值增大,实现快加,SUB按键与ADD按键同,预读取按键用于读取AT24C04中预置的数值,保存按键用于保存当前电压值;显示部分主要是对TLC549采集回来的电压进行处理显示,它主要是在定时器0的中断服务程序中显示,100ms刷新显示一次;TLC5615模块,通过对dA的串行数据输入,使其在输出电压时可控,输出电压后经lm324,三极管,加上负载输出电压,输出电压后,用TLC549芯片100ms采集一次,送数码管显示。
4.5程序清单
主函数:
#include
#include"intrins.h"
#include"AT24C04.h"
#defineucharunsignedchar
#defineuintunsignedint
ucharcodeLED[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};ucharcodeBit_sel[4]={0x08,0x04,0x02,0x01};//各个数码管对应的位选数据
sbitDIO=P1^0;//数据线
sbitCS=P1^1;//片选
sbitCLK=P1^2;//io口时钟
sbitSCS=P1^4;
sbitSDATA=P1^5;
sbitSCLK=P1^3;
sbitADD=P3^0;
sbitSUB=P3^1;
sbitPre_read=P3^2;
sbitStore=P3^3;
num是用于判断是不是长按
uintqian,bai,shi,ge;//用于显示数码管的千,百,十,个等四位的显示
uintval,num;//val是用于输入DA的数据,
的
uintcp;//计数的变量
ucharkey_stat;
ucharadd_stat,sub_stat;
ucharst_flag,pre_flag;
voiddelay(uintx)
{
while(x--)_nop_();
}
//微妙级是延时函数
/**********************************************函数名称:
deal函数作用:
处理AD的返回值函数参数:
无函数返回值:
无
voiddeal(uintnum)//显示程序
//TLC549处理
//初始化,启动
/**********************************************函数名称:
TL549_AD()函数作用:
返回AD的返回值函数参数:
无函数返回值:
data_ad
uintTL549_AD()
{
uchari;
uintdata_ad=0;
CS=1;
CLK=0;
CS=0;
_nop_();
for(i=0;i<8;i++)//读取采集数据,读取的是上一次采集数据{
CLK=1;
if(DIO)data_ad|=0x01;
CLK=0;
data_ad=data_ad<<1;
}
CS=1;
data_ad=data_ad*(500/256);return(data_ad);
}
/**********************************************
函数名称:
TLC5615_DA(uintda)函数作用:
TLC5615_DA将da转换后模拟输出函数参数:
da
函数返回值:
无**********************************************/voidTLC5615_DA(uintda)//TLC5615的DA转换函数{
uchari;
da<<=6;
SCS=0;
SCLK=0;
for(i=0;i<12;i++)
{
SDATA=(bit)(da&0x8000);
SCLK=1;
da<<=1;
SCLK=0;
}
SCS=1;
SCLK=0;
for(i=0;i<12;i++);
}/**********************************************
函数名称:
key_scan()函数作用:
处理那些独立键盘函数参数:
无函数返回值:
无
voidkey_scan()
{
if(ADD==0)//ADD按键的键盘处理函数{
delay(10);
if(ADD==0)
{
add_stat=1;
num++;
}
else
{
add_stat=0;
num=0;
}
//此处判断是不是长按,长按的话使其步进值加大
if(ADD==0&&add_stat==1&&num>=300)
{
val+=5;
num=0;
}
if(ADD==1&&add_stat==1)
{
val++;
num=0;add_stat=0;
}
if(val>=1024)
{
val=1023;
}
}
if(SUB==0)//SUB按键的键盘处理函数{
delay(10);
if(SUB==0)
{
sub_stat=1;
num++;
}
if(SUB==0&&sub_stat==1&&num>=300)
{
val-=5;
num=0;
}
if(SUB==1&&sub_stat==1)
{
val--;
num=0;
sub_stat=0;
}
if(val<=0)
val=0;
}
if(Pre_read==0)
{delay(100);if(Pre_read==0){pre_flag=1;
}
if(Pre_read==1&&pre_flag==1){
pre_flag=0;val=read_24C04(20);存储的数据
}
}
//预读数据的键盘处理函数
//从AT24C04中的地址20中读出预
if(Store==0)
{delay(100);if(Store==0){st_flag=1;
}
if(Store==1&&st_flag==1)
{
st_flag=0;
write_24C04(20,val);
数据
}
}
}
//保存数值按键的键盘处理函数
//向AT24C04中的地址20写入存储的
函数名称:
timer0_init(void)
函数作用:
初始化定时器0,并设置函数参数:
无函数返回值:
无
**********************************************/
voidtimer0_init(void)//timer0中断初始化函数{
EA=0;
TMOD=0x01;
TR0=0;
TL0=(65536-5000)%256;//设置计数器初值
TH0=(65536-5000)/256;
PT0=1;
ET0=1;
EA=1;
TR0=1;
//主程序
}/**********************************************函数名称:
main(void)函数作用:
main主函数入口函数参数:
无函数返回值:
无
voidmain(void)
{
timer0_init();//初始化定时器0
init_24C04();//初始化AT24C04
while
(1)
{
key_scan();//调用键盘扫描函数
TLC5615_DA(val);//处理键盘发送过来的值
}
}
/**********************************************
函数名称:
timer0_isr(void)interrupt1函数作用:
定时器0,方式1,的中断服务子程序函数参数:
无函数返回值:
无
**********************************************/
voidtimer0_isr(void)interrupt1//timer0中断服务函数{
//数码管的位选变量
TR0=0;
//停止计数
TL0=(65536-5000)%256;//重新载
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 稳压电源 设计 原理 说明