DSP28335 PID实现高压电路自动调压

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ysgjiangsu/article/details/79734042

搞了一下午,总算实现PID稳定调压,目前精度是5V,范围是100V到4000V,电路设计,此处不表。主要是记录一下DSP的PID调试过程。

还是先赘述一下PID:

工科电子狗,PID全靠网上参考,说说心得:
1. 小明接到任务,向木桶加水,。。。。这个讲PID比较生动形象,连接如下:https://www.zhihu.com/question/23088613
2. 直接上原理框图和公式:
PID抽象原理框图
我觉得PID就是不断测量实际值与期望值的偏差,通过负反馈调整输出,多用在输出控制非线性系统。系统反馈环路得是线性系统(非线性反馈系统要做反函数补偿),以确保反馈测量值真实反映当前状态。比如电机的编码器获取转速,温度传感器获取温度等等。

PID具体计算公式0
这是对PID抽象框图的公式化表达,其中,
T表示PID调节周期,Ti表示积分时间,Td表示微分时间
比例系数:Kp,
积分系数:Kp*T/Ti,可以用Ki表示
微分系数:Kp*Td*/T,可以用Kd表示
e(t)表示当前偏差,u(x)表示当前输出
上式为连续式表达,下式为离散表达式
PID离散表达
进一步分解,
这里写图片描述
可得位置式PID表达式,
这里写图片描述
取k = k - 1,可得
这里写图片描述
两式作差,可得增量式PID表达式
这里写图片描述
因而得到输出增加量表达式如上(PID位置式要累和之前所有的偏差,而增量式只取最新的三个误差)

———————————————–分割————————————————
核心代码
PID结构体

typedef struct PID_Value
{
    float KP;
    float KI;
    float KD;
    float Ek;
    float Ek_1;
    float Ek_2;
    float dacOutAmp;
}PID_ValueStr;

PID具体实现

/*
 * input : adc dpp after filtered,vlotHope output with RMS
 * output: dac output amp
 * fun   : PID fun calc
 */
float PID_Caculate(float adcFltDpp,float voltHope)
{
    float Inck = 0.0;
    pidStr.Ek = voltHope - adcFltDpp * TRANS_RMS_TO_ADC_DPP;

    Inck = pidStr.KP*(pidStr.Ek - pidStr.Ek_1) + pidStr.KI*pidStr.Ek 
    + pidStr.KD*(pidStr.Ek - 2*pidStr.Ek_1 + pidStr.Ek_2);

    pidStr.Ek_2 = pidStr.Ek_1;
    pidStr.Ek_1 = pidStr.Ek;

    pidStr.dacOutAmp = pidStr.dacOutAmp + Inck*1.000/600;

    if(pidStr.dacOutAmp < 0.0000)
        pidStr.dacOutAmp = 0.0000;

    if(pidStr.dacOutAmp > 0.7)
        pidStr.dacOutAmp = 0.7;

    return pidStr.dacOutAmp;
}

PID_Caculate函数放在DSP28335 TIMER0定时中断里,中断周期为20ms,也即PID调节周期为20ms

调试过程:
将PID结构体声明为全局,通过上位机,传递更改参数指令,从而实现在线调节。另外,DSP28335开发环境自带Graph分析工具,可直观看到实时调节的输出
好了,直接说我的调试过程吧:

1.将Ki,Kd全部设为0,从小到大改变Kp,直到出现振荡。然后,反过来从大到小降低Kp,直到振荡消失,记录此时的Kp,最终的Kp取当前记录值的60%~70%,我取的是60%,因场景而异,需要微调

2.确定好Kp,将Kd设为0,将Ki从小到大增加,直至出现振荡。然后,反过来从大到小降低Ki,直到振荡消失,记录此时的Ki,最终的Ki取当前记录值的5/9~6/9,我取的是5.5/9,因场景而异,需要微调

3.确定好Kp,Ki,将Kd从小到大增加,直至出现振荡。然后,反过来从大到小降低Kd,直到振荡消失,记录此时的Kd,最终的Kd取当前记录值的30%

确定好后,再微调P I D参数即可
微调参考如下:
(1)一般来说,在整定中,观察到曲线震荡很频繁,需把比例带增大以减少震荡;当曲线最大偏差大且趋于非周期过程时,需把比例带减少

(2)当曲线波动较大时,应增大积分时间;曲线偏离给定值后,长时间回不来,则需减小积分时间,以加快消除余差。

(3)如果曲线震荡的厉害,需把微分作用减到最小,或暂时不加微分;曲线最大偏差大而衰减慢,需把微分时间加长而加大作用

(4)比例带过小,积分时间过小或微分时间过大,都会产生周期性的激烈震荡。积分时间过小,震荡周期较长;比例带过小,震荡周期较短;微分时间过大,震荡周期最短

(5)比例带过大或积分时间过长,都会使过渡过程变化缓慢。比例带过大,曲线如不规则的波浪较大的偏离给定值。积分时间过长,曲线会通过非周期的不正常途径,慢慢回复到给定值。

注意:当积分时间过长或微分时间过大,超出允许的范围时,不管如果改变比例带,都是无法补救的

PID常用口诀:
参数整定找最佳,从小到大顺序查
先是比例后积分,最后再把微分加
曲线振荡很频繁,比例度盘要放大
曲线漂浮绕大湾,比例度盘往小扳
曲线偏离回复慢,积分时间往下降
曲线波动周期长,积分时间再加长
曲线振荡频率快,先把微分降下来
动差大来波动慢。微分时间应加长
理想曲线两个波,前高后低4比1
一看二调多分析,调节质量不会低

一些参考:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
由于反馈测量电路噪声以及隔离光耦非线性工作区,我并没有达到:理想曲线两个波,前高后低4比1 ,但总体PID控制性能还满意,0.5s内稳定。以后电路调整好再更
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ysgjiangsu/article/details/79734042