BOOST输出15V,采样比0.1, 开关频率50K
//使用周期寄存器中断启动AD采样
//boost电压环单闭环PI调节
#include "DSP2833x Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x Examples.h" // DSP2833x Examples Include File
#define c GpioDataRegs.GPADAT.bit.GPIO1
float Uref; //采样电压基准
float e1; //当前周期的偏差值
float e2; //前一个周期的偏差值
float Kp; //比例系数
float Ki; //积分系数
float a; //当前周期数字PI控制器的输出
Uint16 b; //当前周期数字PI控制器的输出
float adcresulta0; //采样转换结果
void adc_init (void); //初始化AD
void InitEv (void); //初给化 ePWM
interrupt void adcINT_ISR (void); //AD采样中断
void Gpioctrl (void); //配置GPIO
void main (void)
{
InitSysCtrl( );
DINT;
InitPieCtrl( );
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable( );
EALLOW;
PieVectTable.ADCINT=&adcINT_ISR; //将AD中断服务子函数的地址存放到相应的向量地址中
EDIS;
adc_init( );
Gpioctrl( );
InitEv( );
PieCtrlRegs.PIEIER1.bit.INTx6=1; //使能ADC采样中断
IER|=M_INT1; //开CPU中断
EINT; //使能全局中断
ERTM; //使能实时中断
Kp=100;
Ki=1;
Uref=1.5; //数字量
e1=0;
e2=0;
a=0;
}
void adc_init(void)
{
EALLOW;
#if(CPU_FRQ 150MHZ)
#define ADC_MODCLK 0x3
#endif
#if(CPU_FRQ 100MHZ)
#define ADC_MODCLK 0x2
#endif
EDIS;
InitAdc( );
EALLOW;
SysCtrlRegs.HISPCP.all=ADC_MODCLK;
EDIS;
AdcRegs.ADCTRL1.bit.ACQ_PS=0x0; //设置启动脉冲的宽度(采样时间=Tadclk)
AdcRegs.ADCTRL3.bit.ADCCLKPS=0x1; //对HSPCLK进行2分频
AdcRegs.ADCMAXCONV.bit.MAX_CONV1=1; //设置最大转换通道为1+1=2次
AdcRegs.ADCTRL1.bit.SEQ_CASC=1; //级联方式
AdcRegs.ADCTRL3.bit.SMODE_SEL=0; //顺序采样方式
AdcRegs.ADCCHSELSEQ1.bit.CONV00=0x0; //第一次转换通道设定为ADCINA0
AdcRegs.ADCCHSELSEQ1.bit.CONV01=0x1; //第二次转换通道设定为ADCINA1
AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1=1; //允许SEQ1被ePWMxSOCA触发信号启动
AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1=1; //SEQ1的中断使能
}
void InitEv{void)
{
EPwm1Regs.TBCTL.bit.CTRMODE=TB_COUNT_UP; //增计数模式
EPwm1Regs.TBCTL.bit.HSPCLKDIV=TB_DIV1; //设定TBCLK=SYSCLK时基时钟
EPwm1Regs.TBCTL.bit.CLKDIV=TB_DIV1; //设定TBCLK=SYSCLKOUT
EPwm1Regs.TBPRD=3000; //设定PWM周期为3001个TBCLK时钟周期
EPwm1Regs.TBPHS.half.TBPHS=0; //将相位寄存器清零
EPwm1Regs.TBCTR=0; //将时间基准计数器清零
EPwm1Regs.TBCTL.bit.PHSEN=TB_DISABLE; //禁止相位控制
EPwm1Regs.TBCTL.bit.PRDLD=TB_SHADOW; //TBPRD寄存器采用映射模式
EPwm1Regs.TBCTL.bit.SYNCOSEL=TB_SYNC_DISABLE; //禁止同步信号
EPwm1Regs.CMPCTL.bit.SHDWAMODE=CC_SHADOW; //设定CMPA为映射模式
EPwm1Regs.CMPCTL.bit.SHDWBMODE=CC SHADOW;
EPwm1Regs.CMPCTL.bit.LOADAMODE=CC_CTR_ZERO; //设定在CTR=ZERO时装载
EPwm1Regs.CMPCTL.bit.LOADBMODE=CC_CTR_ZERO;
EPwm1Regs.ETSEL.bit.SOCASEL=2; //选择在TBCTR=TBPRD时启动AD转换
EPwm1Regs.ETSEL.bit.INTEN=1; //使能产生中断信号EPWMx INT (必不可少)
EPwm1Regs.ETSEL.bit.INTSEL=2; //选择EPWMx INT产生的条件(必不可少)
EPwm1Regs.ETPS.bit.SOCACNT=1; //发生一次TBCTR=TBPRD启动转换一次
EPwm1Regs.ETPS.bit.SOCAPRD=1; //ADC启动信号EPWMxSOCA的周期设定
EPwm1Regs.ETSEL.bit.SOCAEN=1; //使能ADC启动脉冲EPWMxSOCA
EPwm1Regs.ETFLG.bit.SOCA=0; //ADC启动信号EPWMxSOCA状态标志位
EPwm1Regs.ETCLR.bit.SOCA=1; //清除ADC启动信号EPWMxSOCA状态标志位
}
interrupt void adcINT_ISR(void)
{
adcresulta0=(AdcRegs.ADCRESULT0>>4)*3.0/4095;
/PI控制/
e1=adcresulta0-Uref;
if(e1<0)
{
c=1;
}
else
{
c=0;
}
a=Kp*(e1-e2)+Ki*e1+a;
e2=e1;
/限幅/
if(a<800)
{
a=800;
}
if(a>2500)
{
a=2500;
}
b=a;
EPwm1Regs.CMPA.half.CMPA=b; //设定比较器A为b个TBCLK
EPwm1Regs.AQCTLA.bit.PRD=AQ_SET; //当CTR=PRD时,将EPWM1A置高
EPwm1Regs.AQCTLA.bit.CAU=AQ_CLEAR; //当CTR=CAU时,将EPWM1A置低
PieCtrlRegs.PIEACK.all=0x0001; //中断相应标志位置1,中断向量已经向CPU发出中断请求,其它中断被锁存
AdcRegs.ADCTRL2.bit.RST_SEQ1=1; //复位序列发生器
AdcRegs.ADCST.bit.INT_SEQ1_CLR=1; //清除中断信号
return;
}
void Gpioctrl(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=1;
GpioCtrlRegs.GPAPUD.bit.GPIO0=0;
GpioCtrlRegs.GPADIR.bit.GPIO0=1;
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;
GpioCtrlRegs.GPAPUD.bit.GPIO1=0;
GpioCtrlRegs.GPADIR.bit.GPIO1=1;
EDIS;
}
评论6