中级会员
 
- 积分
- 413
- 金钱
- 413
- 注册时间
- 2018-1-9
- 在线时间
- 65 小时
|
发表于 2018-1-10 16:46:01
|
显示全部楼层
你找的这个PID感觉,不是工程用的没有输入啊?
缺少对ActualSpeed的赋值。还有工程用的一定会有饱和输出判断的,就是你原有程序中的200和1000的判断。
你这么大的功率在调程序的时候一定要有,输出限制,不然会炸的。
贴一个DSP的宏定义的PI调节器,其实大部分PID的D都等于0,。也就是PI调节器 了。
你先看看,有什么问题可以使交流。
#ifndef __PI_H__
#define __PI_H__
typedef struct { _iq Ref; // Input: reference set-point
_iq Fbk; // Input: feedback
_iq Out; // Output: controller output
_iq Kp; // Parameter: proportional loop gain
_iq Ki; // Parameter: integral gain
_iq Umax; // Parameter: upper saturation limit
_iq Umin; // Parameter: lower saturation limit
_iq up; // Data: proportional term
_iq ui; // Data: integral term
_iq v1; // Data: pre-saturated controller output
_iq i1; // Data: integrator storage: ui(k-1)
_iq w1; // Data: saturation record: [u(k-1) - v(k-1)]
} PI_CONTROLLER;
/*-----------------------------------------------------------------------------
Default initalisation values for the PI_GRANDO objects
-----------------------------------------------------------------------------*/
#define PI_CONTROLLER_DEFAULTS { \
0, \
0, \
0, \
_IQ(1.0), \
_IQ(0.0), \
_IQ(1.0), \
_IQ(-1.0), \
_IQ(0.0), \
_IQ(0.0), \
_IQ(0.0), \
_IQ(0.0), \
_IQ(1.0) \
}
/*------------------------------------------------------------------------------
PI_GRANDO Macro Definition
------------------------------------------------------------------------------*/
#define PI_MACRO(v) \
\
/* proportional term */ \
v.up = _IQmpy(v.Kp, (v.Ref - v.Fbk)); \
\
/* integral term */ \
v.ui = (v.Out == v.v1)?(_IQmpy(v.Ki, v.up)+ v.i1) : v.i1; \
v.i1 = v.ui; \
\
/* control output */ \
v.v1 = v.up + v.ui; \
v.Out= _IQsat(v.v1, v.Umax, v.Umin); \
//v.w1 = (v.Out == v.v1) ? _IQ(1.0) : _IQ(0.0); |
|