打印
[AVR单片机]

关于PID控制问题请教

[复制链接]
4042|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
此心向学|  楼主 | 2010-7-26 18:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在21上找了很多PID控制方面的资料,看了之后还是晕

如果要PID控制电源恒功率输出,应该怎么做啊???

只是单纯的PID控制电压来实现恒功率嘛???各位大侠给个思路,谢谢。

下面是一段增量PID的代码,也不知道些的对不对,请个位帮忙看看,给出出主意,感激不尽。

#include<avr/io.h>
#define KP 4//这些值是假定值(不知道P,I,D这几个值具体怎么确定。晕)
#define KI 2
#define KD 3
struct IncPID//增量PID结构体定义
{
float SetValue; //设定目标
float CurrentValue;//当前采样值
float LastValue;//上一次输出值
// float SumError; //误差累计
// float Proportion; //比例常数 Proportional Const
// float Integral; //积分常数 Integral Const
// float Derivative; //微分常数 Derivative Const
float LastError; //Error[-1]
float PrevError; //Error[-2]
}PID;

int main(void)
{
while(1);
}
//增量PID结构初始化
void IncPID_Init(void)
{
PID.SetValue = 0; //设定目标
PID.CurrentValue = 0;//当前采样值
PID.LastValue = 0;//上一次输出值
// PID.SumError = 0; //误差累计
// PID.Proportion = KP; //比例常数 Proportional Const
// PID.Integral = KI; //积分常数 Integral Const
// PID.Derivative = KD; //微分常数 Derivative Const
PID.LastError = 0; //E(k-1)
PID.PrevError = 0; //E(k-2)
}

/*********************************
PID = Uk + KP*[E(k)-E(k-1)]+KI*E(k)+KD*[E(k)-2E(k-1)+E(k-2)];(增量型PID算式)
函数入口: SV(设定值),CV(实际采样值)
函数出口: NewValue(新输出值)
//PID运算函数
********************************/
float PID_Operation (float SV,float CV)   
{
float CurrentError,IncValue,NewValue;//E(k),PID增量值,新输出值
PID.SetValue = SV;
PID.CurrentValue = CV;
CurrentError = PID.SetValue - PID.CurrentValue;//E(k)
IncValue = KP * (CurrentError - PID.LastError) + KI * CurrentError + KD * (CurrentError - 2 * PID.LastError + PID.PrevError);
NewValue = IncValue + PID.LastValue;
PID.LastValue = NewValue;
PID.LastError = CurrentError;
PID.PrevError = PID.LastError;
return(float)(NewValue);
}

相关帖子

沙发
宇宙飞船| | 2010-7-26 21:55 | 只看该作者
比例(P)控制
积分(I)控制
微分(D)控制
这项技术的原理其实相当的简单,就是闭环控制器,模拟技术中的负反遗电路。
比例可以用电阻分压来做,或者是在单片机中把AD的样值数据加减。
积分可以用一只电阻,一只电容代替,或者是在单片机中把AD样值累加取平均数。
微分同样也就一只电容一只电阻,或者是单片机的DAC输出作控制。

使用特权

评论回复
板凳
928315| | 2010-7-27 21:07 | 只看该作者
想学习下,PID用得挺多的。飞船能否讲得更详细点,

使用特权

评论回复
地板
此心向学|  楼主 | 2010-7-27 21:28 | 只看该作者
顶3L的,版主具体介绍一下吧
比如P,I,D具体场合该如何确定
要不你就以这个恒功率问题为模板讲一下下,:P
见过很多以温度为模板讲的,不过我比较笨,还是晕

使用特权

评论回复
5
宇宙飞船| | 2010-7-27 23:17 | 只看该作者
只要知道算法,就能进行灵活设计了。
楼主可以做一个模拟电路的音频实验,输入由0到40 分贝,输出峰值电压保持恒定不变,就能明白PID是怎么回事, 那些参数该如何设置了。

若用MCU采样进行软处理,若果电压是正弦波或方波,那么PID的算法关键点就是只要知道正弦波或方波电压的计算公式。

平均值(半波)= E*(1/PI), 平均值(方波)= E/2 ;其中E是峰值电压,PI是3.14159

使用特权

评论回复
6
宇宙飞船| | 2010-8-4 12:56 | 只看该作者
怎不见楼主投票了?

使用特权

评论回复
7
论坛游客| | 2010-8-4 14:46 | 只看该作者
以我的观察来看   21ic没几个人搞懂PID的

使用特权

评论回复
8
潜艇8421| | 2010-8-4 14:51 | 只看该作者
楼主原来早已投靠老顽童了。

使用特权

评论回复
9
宇容创行| | 2010-8-4 14:52 | 只看该作者
那还是有几人懂的
比如2楼的理解,绝对是代表火星一流水平

使用特权

评论回复
10
潜艇8421| | 2010-8-4 14:57 | 只看该作者
某些人就喜欢拿虚无飘渺自认为高深的理论吓唬人。

使用特权

评论回复
11
无名圣龙| | 2010-8-4 15:02 | 只看该作者
那还是有几人懂的
比如2楼的理解,绝对是代表火星一流水平
宇容创行 发表于 2010-8-4 14:52


错!错!错!
2楼的理解,绝对代表超宇宙水平

使用特权

评论回复
12
潜艇8421| | 2010-8-4 15:16 | 只看该作者
那些人云其云的人,根本就没有学过模以电路分析!

使用特权

评论回复
13
粉丝| | 2010-8-4 15:24 | 只看该作者
某些人连积分在单片机上有几种实现的算法,还没搞懂,就大言不渐。

使用特权

评论回复
14
无名刀客| | 2010-8-4 15:31 | 只看该作者
LS能详细介绍一下,积分在单片机上有几种实现的算法,谢谢!

使用特权

评论回复
15
粉丝| | 2010-8-4 15:45 | 只看该作者
一言难尽,14楼把电路分析基础学完就知道了!

使用特权

评论回复
16
论坛游客| | 2010-8-4 16:05 | 只看该作者
占座看表演

使用特权

评论回复
17
Mr_Gavin| | 2011-3-3 11:51 | 只看该作者
晕过 ……

使用特权

评论回复
18
ch0721| | 2011-3-5 23:18 | 只看该作者
没有人讲啊 那我说说吧 PID实际上没有什么 首先为什么要加PID PID可以增加一个积分环节 提高系统型别 大家都知道一型系统(传递函数含一个积分环节)在跟踪速度信号的时候是没有稳态误差的 这就使系统误差减小 另外串联PID校正环节会增加两个开环极点 如果适当的话 会改善系统的带宽和相角裕度 大家都知道这两个指标直接关系到系统单位阶跃响应的超调量(峰值)和调整时间(振铃) 也就是说一个PID校正实际上应该先有控制模型 然后画出BODE图 确定零极点分配使之达到预先想要的指标。

      但鉴于实际上有些人对频域的设计不是很懂的情况下,pid也是可以在时域上“蒙”的,先来谈一下各环节的作用,比例环节:成比例的反应控制系统的偏差信号,偏差一旦产生,控制器立即产生控制作用,以减小偏差;积分环节:主要消除静差,提高系统无差度。积分的作用强弱取决于积分时间常数T,T越大,积分越弱,反之越强;微分环节:反映偏差信号的变化趋势(变化速率),并能在偏差信号变得太大之前,在系统中引入一个有效的早期修正信号,从而加快系统的动作速度,减少调节时间。

      所以如果你不是通过频域设计靠“蒙”的话,就要至少把系统调到稳定,然后观察输入阶跃信号或正弦信号,从输出信号来判断各参数的调整方向,这可能是比较困难和需要一定经验的,其实还有一种比较适合新手的路来走,那就是用MATLAB,在新版本MATLAB中,simulink 中的PID模块是可以自整定的,也就是PID TUNER 而SISOTOOL工具箱中也可以进行PID自整定,太具体的不多说了,MATLAB help中都有详细的使用方法和实例。
          离散的PID也就是用单片机完成的PID,一般会用梯形公式来模拟积分,差分来近似微分,比例就是那个了,呵呵。所以程序你只要弄懂ADC DAC算算数就OK了,当然这是指比较简单的PID,像比较那个啥一点的PID 如积分分离PID、不完全微分PID,专家PID,模糊自适应PID 纯滞后环节的达林算法、Smith算法,遗传算法整定PID等,也是设计和编程也是相对复杂的,本人只做过积分分离PID、不完全微分PID、纯滞后环节的达林算法、Smith算法,再高级一点的东西就不妄谈了。
          随便写写,希望对楼主有些帮助,见笑了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

70

帖子

1

粉丝