李天生的笔记

导航

数字PID控制Boost电路初级实验

    正在处于学习阶段,初次实验数字控制Boost电路。没有数字控制方面的经验,只能按自己的想法设计自己调试,不知电路与程序是否合理,也不知道数字PID实际应用如何设计,希望高手给予指点。

主要设计想法

    数字PID设计:按增量式消弱积分思想设计

    PWM信号占空比:0.5+(PID输出/参考电压Uref)

    PWM信号频率:10kHz

    输出电压采样:一个PWM周期内连续对输出采三次样,处理时取三次的平均值,目的是减小采样误差,不知是否可行。

原理图

元件参数

    L=520uH D=mur1560 S= STP25NM60N C=1000uF 处理器TMS320F28023

    MOSFET驱动:IR2125

实验测试参数:Ui=12V Uo=20V R3=10k R4=1k R5=100k

实验结果

输出Uo能够稳定在20V,负载一定范围变化,输出电压基本不变。上电后输出能够很快调节到20V。

程序

#include "DSP28x_Project.h"

int16 U_ref = 20;

float32 D_on = 0.2;

// PID相关参数

float32 KI = 0.00002; //积分系数

float32 KP = 5;     //比例系数

float32 KD = 0.1;     //微分系数

float32 ek = 0;     //第k次偏差

float32 ek_1 = 0;      //第k-1次偏差

float32 ek_2 = 0;      //第k-2次偏差

float32 pk = -10;     //PID的输出

float32 pk_1 = -10;      //PID前一次输出

float32 P_max = 10;     //PID上限值

float32 P_min = -10;     //PID下限值

void PID(void);     //PID函数声明

// A/D相关参数

float32 Uo = 0;      //输出电压采样后转换后的值

Uint16 U_out[3];     //输出电压三次采样原始值

interrupt void adc_isr(void); //AD中断函数声明

void main(void)

{

InitSysCtrl();

InitEPwm1Gpio();

DINT;

InitPieCtrl();

IER = 0x0000;

IFR = 0x0000;

InitPieVectTable();

EALLOW;

PieVectTable.ADCINT1 = &adc_isr;

EDIS;

InitAdc();

InitEPwm();

PieCtrlRegs.PIEIER1.bit.INTx1 = 1;    

IER |= M_INT1;                         

EINT;                                                              

for(;;);

}

void PID(void) //增量式遇限消弱积分PID

{

    float32 Dpp,Dpi,Dpd;

    Dpp = KP * (ek - ek_1);

    Dpd = KD * (ek - 2*ek_1 + ek_2);

    Dpi = 0;

    if(pk_1 > P_max)

    {

        if(ek < 0)        

            Dpi = KI * ek;

    }

    else if(pk_1 < P_min)

    {

        if(ek > 0)

            Dpi = KI * ek;    

    }

    else

        Dpi = KI * ek;

    pk = pk_1 + (Dpp + Dpi + Dpd);

    ek_2 = ek_1;

    ek_1 = ek;

    pk_1 = pk;

}

interrupt void adc_isr(void)               //AD中断函数

{

U_out[0] = AdcResult.ADCRESULT0;         //同时对输出进行三次采样

U_out[1] = AdcResult.ADCRESULT1;

U_out[2] = AdcResult.ADCRESULT2;

Uo = (U_out[0]+U_out[1]+U_out[2])/312;     //对采样值进行处理

ek = U_ref - Uo;

PID();

D_on = 0.5 + pk/U_ref;          //计算占空比

if(D_on > 1)

D_on = 0.9;

if(D_on < 0)

    D_on = 0;

EPwm1Regs.CMPB = D_on*5000;         //更新输出的PWM

AdcRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;    

PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;

}

posted on 2010-10-09 15:12  李天生  阅读(5628)  评论(1编辑  收藏  举报