使用DSP28335生成变频pwm控制buck电路(内含pi调节)

在这里插入代码片@TOC

/*------本例为Buck变换,输入电压为36V,输出电压为24V,输出功率60W,电压纹波小于5%; PWM频率为12.8kHz。---------*/
#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File
#include "math.h"

//#define ACTV_LOW  //驱动电路低有效
#define ACTV_HIGH   //驱动电路高有效

void adc_isr(void);           //声明AD采集子程序
interrupt void ISRepwm1(void); //声明EPWM中断服务子程序
void EPwmSetup(void);          //声明EPWM模块初始化子函数

float D=0.5;                               //占空比赋初值
Uint32 k=0, j=0,close=0, pwm_cnt1;
//AD采集相关
float u1,sum1,sum=0,Voltage1[10];   //u1为采集值,数组用于平均值计算,sum1为和,sum为平均值
float bian=40,pian=1.50,U=24;   //bian为调理电路变比,pian为电路偏置电压,没有偏置设为零,U为给定电压
//PI调节相关
float e,e1=0,e2,PID,PIDold,Kp=0.01,Ki=0.001;//Kp和Ki分别为比例和积分常数

main()
{
    InitSysCtrl();
    InitGpio();

    DINT;//禁止CPU中断
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    EALLOW;
    PieVectTable.EPWM1_INT=&ISRepwm1;//重新映射本处使用的中断向量,使其指向中断服务函数
    EDIS;
    InitAdc(); //AD初始化

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;//停止所有epwm通道的时钟
    EDIS;

    EPwmSetup();//初始化epwm

    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1;//允许EPWM通道的时钟
    EDIS;

    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;  //允许从PIE向量表中读取中断向量
    PieCtrlRegs.PIEIER3.bit.INTx1 = 1;//允许PIE中断组3中EPWM1_INT中断

    IER |= M_INT3;//允许中断
    EINT;          // Enable Global interrupt INTM
    ERTM;          // Enable Global realtime interrupt DBGM

    EPwm1Regs.ETSEL.bit.INTEN=1;//ETSEL.bit.INTEN 中断使能,即允许标志位EPWM1_I
    EPwm1Regs.ETCLR.bit.INT=1; //ETCLR.bit.INT 清除标志位

    for(;;)
    {asm("          NOP");}
}

 void  adc_isr()//AD采集子程序
{
    u1 = ((float)AdcRegs.ADCRESULT0)*3/65536;
    Voltage1[k]=bian*(u1-pian);
    //平均值计算
    k++;
    if(k ==10)
    {
        k = 0;
        sum1=0;//Voltage1[0];
        for(j=0;j<10;j++)
        {
            sum1=sum1+Voltage1[j];	//求和
        }
        sum= sum1/10;//平均值

        //PI调节
        e1=U-sum;
        if(e1>0.2) e1=0.2;
        if(e1<-0.2) e1=-0.2;
        e=e1-e2;
        PID=Kp*e +Ki*e1+PIDold;
        if(PID>0.95) PID=0.95;
        if(PID<0.2) PID=0.2;

        PIDold=PID;
        e2=e1;

        if(close==1)D=PID;//开闭调节转换控制,一般先使close=0进行开环调试,然后再使close=1进行闭环调试

    }

    return;
}

interrupt void ISRepwm1(void)
{
    adc_isr();            // 调用AD子程序
    //计算比较寄存器的值
    #ifdef ACTV_LOW     //驱动电路低有效
        pwm_cnt1=(Uint16)(EPwm1Regs.TBPRD*(1-D));
    #endif
    #ifdef ACTV_HIGH    //驱动电路高有效
        pwm_cnt1=(Uint16)(EPwm1Regs.TBPRD*D);
    #endif
    //更新比较寄存器值
    EPwm1Regs.CMPA.half.CMPA = pwm_cnt1;
    EPwm1Regs.CMPB = pwm_cnt1;

    EPwm1Regs.ETSEL.bit.INTEN=1;//使能epwm1 中断
    EPwm1Regs.ETCLR.bit.INT=1;//清除标志位
    PieCtrlRegs.PIEACK.all=PIEACK_GROUP3;//清除应答
    EINT;
 }
  • 5
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值