数字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;
}