基于dsp2812的遥控型开关电源的设计与制作资料Word下载.docx
《基于dsp2812的遥控型开关电源的设计与制作资料Word下载.docx》由会员分享,可在线阅读,更多相关《基于dsp2812的遥控型开关电源的设计与制作资料Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
(1)遥控器向装有红外接收管的51MCU发送相关指令,51MCU将接收到的指令处理分析以RS-485的通信方式发送至DSP处理系统;
(2)DSP主控制系统接收不同的数据比较生成不同占空比的PWM波,经DA滤波电路,电压跟随器后连接Boost电路中3483反馈控制芯片的feedback引脚;
(3)随着滤波电压不同的幅值,Boost电路输出不同的幅值的电压,再将输出电压AD采样至DSP主控制系统,将当前电压值用数码管显示。
3.单元电路设计
DSP数据分析处理控制模块是本设计的核心部分,是整个系统的基石。
利用DSP的事件管理器中的输出比较模块,可产生占空比及频率均可调的六路互补对称带死区的PWM波,它的强大之处就是在于此;
Boost升压电路采用3843主控芯片控制MOS管的导通与关断,并将输出电压分压拉回比较,实现了闭环稳定调节,具体电路如图四所示;
遥控器及红外接收管部分硬件较为简单,主要是程序数据获得部分,见软件代码附录;
3.1PWM滤波DA及电压跟随器电路:
选取合适的电阻电容将DSP输出的PWM波虑为直流电压信号,再经一个电压跟随器起缓冲作用,输出电压信号与Boost电路输出电压分压后分别接运放的反相和同相输入端,反馈端电阻和电容并联,输出接入3483芯片的feedback引脚。
同时,该运放的同相输入端可接入DSP进行AD采样。
图四
(1):
PWM滤波DA及电压跟随器电路
3.2Boost升压电路:
在Boost电路中,feedback引脚的电压与reference引脚电压做差所得直流信号与固定频率的锯齿波电压比较所得不同占空比的周期信号作为MOS管的输入。
在高电平时,MOS管导通,电容放电电压降低;
在低电平时,MOS管截止,电感放电,电压升高。
场效应管的不断导通,截止的脉冲宽度使电容上的电压上升,而且电容上的电压最终稳定在一个预期值,开关导通时的压降和截止时上升的电压相等,开关频率快,最终得到稳定的直流电压输出波形。
图四
(2):
由以上分析,feedback引脚的任一电压必将对应一个输出电压幅值。
在图二的综合电路中,随着PWM占空比的增大,DA后得到的直流电压也将增大,在2号运放的反相输入端电压增大,输出电压增大,MOS管的截止脉冲宽度增大,输出电压增大,使运放的同相输入端电压增大,在反馈回路中和运放输出电压稳定。
由此构成一个完整的反馈闭环控制电路。
整个电路的输出电压随着DA电压的变化而变化,而且稳定可控。
4实验过程及系统软件设计
本设计软件使用C语言编程实现,主要软件程序思维如图五;
遥控器数据获取处理
DSP数据分析
DSP输出PWM占空比改变
DSPAD采样输出电压
……
图五:
软件程序思维导势图
51主要程序如代码附录:
主要包括红外信号数据获取处理,并将按键值以RS-485的通信方式发送至DSP。
由程序分析易得,红外接收管所获得的时域信号为一系列的脉冲信号,包括前置引导判别和数据信号,数据与脉冲宽度时间相对应,计算延时即可得。
下图四为红外接收管获取的脉冲信号;
由此遥控器的红外协议分析可得,如果我们了解了相关类型的协议,完全可以自己做出一个万能遥控器!
图四:
红外接收管获取的脉冲信号
DSP主要程序如代码附录:
主要包括接收51所发数据,并调整所产生的PWM波的占空比及开启AD采样中断和数码管显示部分。
主要用到了Gpio,485通信,事件管理器和AD转换等模块。
包括所用到的初始化和中断函数等;
DSP软件的整体逻辑可概括为一下几步:
(1)开启SCI中断接收遥控数据,并将所得遥控数据与事件管理器输出PWM的比较值挂钩;
(2)使能事件管理器输出比较模块,并使能周期中断,在中断服务子程序中调整比较值,使其输出随遥控器键值而变化的不同占空比的PWM波;
(3)开启AD中断,采样输出电压,将AD值所代表的电压值通过数码管显示,数码管的显示程序部分应放到周期中断服务子程序中。
5.设计成果展示及心得体会:
在输入电压12V时,遥控器按键可分别调控输出电压达到20V到40V,而且输出稳定可控,同时数码管会将当前电压值显示。
在上学期开关电源课程学习的基础上,在DSP课程上我通过对DSP中Gpio口,事件管理器,AD采样,中断等等模块的学习重组,将二者结合完成了基于DSP的遥控型开关电源设计与制作。
在设计过程中也遇到了些许困难,但在老师的帮助和自己的坚持下完成了此次自我设计,加深了对开关电源电路的理解和认识。
自我感觉尤其在PWM滤波电路及后面的运放电路中,自己对运放的理解更加深入,模电的理解有了新的进步。
总体而言,此次设计中涵盖的东西较广,自己也从中学到了很多,软件的逻辑性思维,硬件电路的调试技巧以及动手能力的培养等。
6.代码附录:
51部分:
voidmain(void)
{
IRIN=1;
//I/O口初始化,红外接收管数据引脚
UsartConfiguration();
//串口初始化函数
while
(1)//数据分析获取
{
while(IRIN==0)
{
delay(15);
if(IRIN!
=1)
while(!
IRIN)//等IR变为高电平,跳过9ms的前导低电平信号。
delay
(1);
}
for(j=0;
j<
4;
j++)//收集四组数据
for(k=0;
k<
8;
k++)//每组数据有8位
while(IRIN)//等IR变为低电平,跳过4.5ms的前导高电平信号。
{delay
(1);
}
IRIN)//等IR变为高电平
while(IRIN)//计算IR高电平时长
delay
(1);
N++;
}//高电平计数完毕
IRCOM[j]=IRCOM[j]>
>
1;
//数据最高位补“0”
if(N>
=8)
{IRCOM[j]=IRCOM[j]|0x80;
}//数据最高位补“1”
N=0;
}//endfork
}//endforj
switch(IRCOM[2])
case0x1C:
{
distemp=0x05;
break;
case0x5A:
distemp=0x06;
case0x42:
distemp=0x07;
break;
}
case0x52:
{
distemp=0x08;
case0x4A:
distemp=0x09;
default:
distemp=0x00;
}
RS485E=1;
//485的使能脚
SBUF=distemp;
//将要发送的数据放入到发送寄存器
while(!
TI);
//等待发送数据完成
TI=0;
//清除发送完成标志位
delay1(100);
//delay很重要
else
}
}
标准Delay函数:
voiddelay(ucharx)//x*0.14MS
{
unsignedchari;
while(x--)
for(i=0;
i<
13;
i++){}
串口初始化函数:
voidUsartConfiguration()
SCON=0X50;
//设置为工作方式1
TMOD=0X20;
//设置计数器工作方式2
PCON=0X00;
//8080//波特率加倍
TH1=0XFD;
//F3FA//计数器初始值设置,注意波特率是9600的
TL1=0XFD;
//F3FA
ES=1;
//打开接收中断
EA=1;
//打开总中断
TR1=1;
//打开计数器
DSP主要程序函数部分:
//主函数部分;
unsignedchari;
//选段码
unsignedintm=1000;
//占空比
doublek;
//AD采样值
InitSysCtrl();
//初始化系统函数
DINT;
//关总中断
IER=0x0000;
//禁止CPU中断
IFR=0x0000;
//清除CPU中断标志
InitPieCtrl();
//初始化PIE控制寄存器
InitPieVectTable();
//初始化PIE中断向量表
//---------------------------------------------------------
EALLOW;
PieVectTable.RXAINT=&
SCIA_RX_isr;
//SCIA接收中断
PieVectTable.ADCINT=&
ADC_SAMPLE_isr;
//AD中断入口
PieVectTable.T1PINT=&
T1_isr;
//周期中断入口
//PieVectTable.TINT0=&
cpu_timer0_isr;
//CPU定时器0中断入口
EDIS;
Init_Gpio();
//初始化GPIO口
Init_ADC();
//初始化ADC模块
Init_EV();
//初始化EV
Init_Sci();
//初始化SCI
//-----------------------使能PIE----------------------------
PieCtrlRegs.PIEIER9.bit.INTx1=1;
//使能PIE模块中的SCI接收中断
PieCtrlRegs.PIEIER2.bit.INTx4=1;
//使能.PIE的T1周期中断
PieCtrlRegs.PIEIER1.bit.INTx6=1;
//使能PIE的ADC中断ADCINT
//PieCtrlRegs.PIEIER1.bit.INTx7=1;
//使能PIE模块中的CPU定时器0中断
//-----------------------使能CPU中断-------------------------
IER|=M_INT2;
//开CPU中断
IER|=M_INT9;
//开CPU中断sci
IER|=M_INT1;
//IER|=M_INT1;
EINT;
//开全局中断
ERTM;
//开实时中断
EvaRegs.T1CON.bit.TENABLE=1;
//开定时器T1计数操作
while
(1)//i为接收数据判断,m为占空比比较值设定;
switch(i)
case5:
{
m=4500;
break;
case6:
m=5375;
case7:
m=6245;
}
case8:
m=7120;
default:
m=0;
//初始化Gpio口;
voidInit_Gpio(void)
//----------------------------------------------------------------
//LED部分
GpioMuxRegs.GPFMUX.bit.MFSRA_GPIOF11=0;
//设置为通用I/O口
GpioMuxRegs.GPFDIR.bit.GPIOF11=1;
//IO口方向为输出
GpioMuxRegs.GPFMUX.bit.MCLKXA_GPIOF8=0;
GpioMuxRegs.GPFDIR.bit.GPIOF8=1;
GpioMuxRegs.GPFMUX.bit.MFSXA_GPIOF10=0;
GpioMuxRegs.GPFDIR.bit.GPIOF10=1;
GpioMuxRegs.GPFMUX.bit.MCLKRA_GPIOF9=0;
//数码管部分
GpioMuxRegs.GPBMUX.all=0x0000;
//GPIOB口设置为输出通用IO口,数码管显示使用
GpioMuxRegs.GPBDIR.all=0xffff;
//RS485通讯
//GpioMuxRegs.GPFMUX.bit.SCITXDA_GPIOF4=1;
//设置SCIA的发送引脚
GpioMuxRegs.GPFMUX.bit.SCIRXDA_GPIOF5=1;
//设置SCIA的接收引脚
GpioMuxRegs.GPDMUX.bit.T3CTRIP_PDPB_GPIOD5=0;
//将485控制引脚设置为通用的数字IO口
GpioMuxRegs.GPDDIR.bit.GPIOD5=0;
//将控制IO口设置为输入引脚
//EV模块部分
GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6=1;
//设置T1PWM功能引脚
GpioMuxRegs.GPAMUX.bit.T2PWM_GPIOA7=1;
//设置T2PWM功能引脚
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1;
//设置PWM1引脚
GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1;
//设置PWM2引脚
GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2=1;
//设置PWM3引脚
GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3=1;
//设置PWM4引脚
GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4=1;
//设置PWM5引脚
GpioMuxRegs.GPAMUX.bit.PWM6_GPIOA5=1;
//设置PWM6引脚
//初始化ADC采样模块
//=================================================================
voidInit_ADC(void)
unsignedintad;
//定义一个局部变量i用来短延时
AdcRegs.ADCTRL1.bit.RESET=1;
//复位ADC模块
for(ad=0;
ad<
1;
ad++);
//空指令延时一个机器周期
AdcRegs.ADCTRL1.bit.RESET=0;
AdcRegs.ADCTRL1.bit.SUSMOD=3;
//仿真暂停时序列发生器和其他数字电路逻辑立即停止
AdcRegs.ADCTRL1.bit.ACQ_PS=0;
//采样脉冲宽度ts=(ACQ_PS+1)*Tadcclk;
这里为一个ADCclk周期
AdcRegs.ADCTRL1.bit.CPS=0;
//这里ADC时钟分频器没有两分频
AdcRegs.ADCTRL1.bit.CONT_RUN=0;
//启动-停止模式
AdcRegs.ADCTRL1.bit.SEQ_CASC=1;
//序列发生器为级联模式
AdcRegs.ADCTRL3.bit.ADCBGRFDN=3;
//带隙和参考电路上电
10000;
AdcRegs.ADCTRL3.bit.ADCPWDN=1;
//ADC模块的模拟电路上电
5000;
AdcRegs.ADCTRL3.bit.ADCCLKPS=30;
//设定ADC内核时钟分频器150/(2*30)=2.5M
AdcRegs.ADCTRL3.bit.SMODE_SEL=0;
//选择顺序采样模式
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=11;
//12个转换通道
AdcRegs.ADCCHSELSEQ1.all=0x3210;
//通道依次采样
AdcRegs.ADCCHSELSEQ2.all=0x7654;
AdcRegs.ADCCHSELSEQ3.all=0xBA98;
AdcRegs.ADCCHSELSEQ4.all=0xFEDC;
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1;
//写1清除SEQ1中断标志位
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1;
//使能排序器SEQ1的中断
AdcRegs.ADCTRL2.bit.INT_MOD_SEQ1=0;
//排序器SEQ1每个序列结束,产生中断
AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1=0;
//禁止EVA触发排序器SEQ1
AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
//软件写1触发SEQ1进行A/D转换
//初始化SCI模块
voidInit_Sci(void)//中断方式接收
SciaRegs.SCICCR.bit.STOPBITS=0;
//1位停止位
SciaRegs.SCICCR.bit.PARITYENA=0;
//禁止极性功能
SciaRegs.SCICCR.bit.LOOPBKENA=0;
//禁止回送测试模式功能
SciaRegs.SCICCR.bit.ADDRIDLE_MODE=0;
//空闲线模式
SciaRegs.SCICCR.bit.SCICHAR=7;
//8位数据位
//SciaRegs.SCICTL1.bit.TXENA=0;
//SCIA模块的发送使能
SciaRegs.SCICTL1.bit.RXENA=1;
//SCIA模块的接收使能
SciaRegs.SCIHBAUD=0x01;
SciaRegs.SCILBAUD=0xE7;
//波特率为9600
SciaRegs.SCICTL2.bit.RXBKINTENA=1;
SciaRegs.SCICTL1.bit.SWRESET=1;
//重启SCI
//初始化EV模块
voidInit_EV(void)//无死区,单控制占空比;
intj;
EvaRegs.T1CON.bit.TMODE=1;
//连续增减模式
EvaRegs.T1CON.bit.TPS=1;
//预定标因子设置为1,T1CLK=HSPCLK/2=37.5MHz
EvaRegs.T1CON.bit.TENABLE=0;
//先暂停T1计数
EvaRegs.T1CON.bit.TCLKS10=0;
//使用内部时钟T1CLK
EvaRegs.T1CON.bit.TECMPR=1;
//使能定时器比较操作
//EvaRegs.T1PR=23;
//周期寄存器78.125us/4=2*T1PR(5860)*6.67ns/4
EvaRegs.T1PR=0x493E;
//1khz;
18750
EvaRegs.T1CNT=0;
//计数器初始值为0
EvaRegs.COMCONA.bit.CENABLE=1;
//使能比较单元的比较操作
EvaRegs.COMCONA.bit.FCOMPOE=1;
//全比较输出,各引脚由各自的比较逻辑驱动
EvaRegs.COMCONA.bit.CLD=2;
//比较器的重新装载条件为立即装载
EvaRegs.CMPR1=0;
EvaRegs.CMPR2=0;
EvaRegs.CMPR3=0;
for(j=0;
j++);
//输出动作
EvaRegs.ACTRA.all=0x0999;
//PWM1,3,5高有效;
PWM2,4,6低有效
//T1CMP设置
EvaRegs.GPTCONA.bit.T1CTRIPE=0;
//禁止保护作用