打印
[STC单片机]

PID算法 计算出来的结果,应如何应用啊?

[复制链接]
6116|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nbsmaps|  楼主 | 2015-7-12 09:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 nbsmaps 于 2015-7-12 21:05 编辑

    C51单片机,用于温度的PID控制,在网上下了一个程序,就是看不懂.第一,温差,即设定温度与实际温度超过1度时不启用PID控制,那么测量的数值都是INT型的,这个减法永远计算不出<1 >0的情况啊.=0,就是相同,
  2:主要的问题:这个PID计算出来的东西,如何用于控制啊,计算出来的值,代表什么意思,代表的是单位时间内加热的值?或着说一个加热周期内应加热百分比?若是的这个意思的话,那加热周期如何确定啊,这个周期在PID参数里好象没找到.

相关帖子

沙发
nbsmaps|  楼主 | 2015-7-12 21:04 | 只看该作者
http://www.51hei.com/bbs/dpj-31471-1.html 源程序参考的代码.下面是部分代码,红色字部分请知道的朋友解说一下.另外就是输出,这个定时周期有关系吗?
183./**********************************************************************************************************************************************/

184.

185.//PID算法温控C语言2008-08-17 18:58

186.#ifndef _PID_H__

187.#define _PID_H__

188.

189.#include<intrins.h>

190.#include<math.h>

191.#include<string.h>

192.struct PID

193.{

194.    unsigned int SetPoint ;

195.    // 设定目标 Desired Value

196.    unsigned int Proportion ;

197.    // 比例常数 Proportional Const

198.    unsigned int Integral ;

199.    // 积分常数 Integral Const

200.    unsigned int Derivative ;

201.    // 微分常数 Derivative Const

202.    unsigned int LastError ;

203.    // Error[-1]

204.    unsigned int PrevError ;

205.    // Error[-2]

206.    unsigned int SumError ;

207.    // Sums of Errors

208.}

209.;

210.struct PID spid ;

211.// PID Control Structure

212.unsigned int rout ;

213.// PID Response (Output)

214.unsigned int rin ;

215.// PID Feedback (Input)

216.

217.

218.sbit output=P1^4;

219.unsigned char high_time,low_time,count=0 ;

220.//占空比调节参数

221.unsigned char set_temper ;

222.

223.void PIDInit(struct PID*pp)

224.{

225.    memset(pp,0,sizeof(struct PID)); //PID参数初始化全部设置为0

226.}

227.

228.unsigned int PIDCalc(struct PID*pp,unsigned int NextPoint)

229.{

230.    unsigned int dError,Error ;

231.    Error=pp->SetPoint-NextPoint ;

232.    // 偏差

233.    pp->SumError+=Error ;

234.    // 积分

235.    dError=pp->LastError-pp->PrevError ;

236.    // 当前微分

237.    pp->PrevError=pp->LastError ;

238.    pp->LastError=Error ;

239.    //比例

240.    //积分项

241.    return(pp->Proportion*Error+pp->Integral*pp->SumError+pp->Derivative*dError);

242.    // 微分项

243.}
这一块为PID运算,还能看得清.
244.

245./***********************************************************

246.温度比较处理子程序

247.***********************************************************/

248.void compare_temper()

249.{

250.    unsigned char i ;

251.    //EA=0;

252.    if(set_temper>temper)

253.    {

254.        if(set_temper-temper>1)   //这个因为设置的两个参数都是CHAR,怎么可以有<1?

255.        {

256.            high_time=100 ; //大于1°不进行PID运算

257.            low_time=0 ;

258.        }

259.        else

260.        {   //在1°范围内进行PID运算

261.            for(i=0;i<10;i++)       这里不清楚为什么要重复计算10次?

262.            {

263.                //get_temper();

264.                rin=s;

265.                // Read Input

266.                rout=PIDCalc(&spid,rin); //执行PID运算

267.                // Perform PID Interation

268.            }

269.            if(high_time<=100) //限制最大值

270.            high_time=(unsigned char)(rout/800); 这里除以800算什么意思?

271.            else

272.            high_time=100;

273.            low_time=(100-high_time);

274.        }

275.    }

使用特权

评论回复
板凳
cuya| | 2015-7-12 22:04 | 只看该作者
加热周期是由你自己根据系统的时间常数决定, 而 PID 决定占空比。

使用特权

评论回复
评论
nbsmaps 2015-7-13 08:44 回复TA
对的,主要是一直不知道,我是用定时器周期,PWM占空比,但是检测周期,加热周期,这些实际没关系。昨晚才看明白。输出值为一定周期,也就是 
地板
gx_huang| | 2015-7-14 12:55 | 只看该作者
PID运算,如果不是浮点计算,显然所有的中间变量,温度单位肯定不是1度的,肯定要做到更高,比如单位是0.1或者0.01度。1度的单位分辨率,无法PID计算的。

使用特权

评论回复
5
nbsmaps|  楼主 | 2015-7-22 09:13 | 只看该作者
gx_huang 发表于 2015-7-14 12:55
PID运算,如果不是浮点计算,显然所有的中间变量,温度单位肯定不是1度的,肯定要做到更高,比如单位是0.1 ...

试了几天,感觉还是不行,若周期算为10秒,那PID结果是10秒内的加热时间比,那么周期若是100S秒,这中间那PID结果是100秒内时间比,那么对于同一结果如10%,那么对10秒周期的是1S,对100秒周期的是10S,这个如何稳定温度啊?

使用特权

评论回复
6
nbsmaps|  楼主 | 2015-7-22 09:14 | 只看该作者
计算用定点,精确到0.1度,计算时,采样温度,设定温度都提高10倍,如10.1,我计算按101算,小于20度,也就是2度实际,启动PID

使用特权

评论回复
7
gx_huang| | 2015-7-22 09:39 | 只看该作者
nbsmaps 发表于 2015-7-22 09:13
试了几天,感觉还是不行,若周期算为10秒,那PID结果是10秒内的加热时间比,那么周期若是100S秒,这中间 ...

加热周期不能很长的,否则就无法稳定了,这个输出周期和系统的温度稳定性有关,如果是控制电烙铁,则只能几秒以下的周期,如果是控制比较大的加热块,则一般是20S。如果是可控硅输出,周期可以小一些,如果是继电器,一般是20S。

使用特权

评论回复
8
nbsmaps|  楼主 | 2015-7-22 10:11 | 只看该作者
我是加热水温与风温,还有一个是取暖坐圈的。加热周期,都取在10S,100个交流周期,因为可控硅最小误差10MS,取1000个周期,风温,与坐圈的取500周期,就是5S了。 是的,现在就感觉用不用PID(水没用微分)感觉一样,好象就比例有点起作用!先谢谢啊

使用特权

评论回复
9
wakala| | 2015-11-14 22:47 | 只看该作者
270.            high_time=(unsigned char)(rout/800); 这里除以800算什么意思?
同问,请高手解答?

使用特权

评论回复
10
coody| | 2015-11-16 17:25 | 只看该作者
温度控制器、马达控制器等等就是可参考的例子。

还有多轴飞行器的PID也是非常经典的应用。

使用特权

评论回复
11
adamxx00| | 2016-1-7 11:16 | 只看该作者
我也想知道这个输出应该是怎么应用的,楼主弄明白了吗?

使用特权

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

本版积分规则

39

主题

268

帖子

3

粉丝