-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathAno_Pid.c
76 lines (56 loc) · 2.28 KB
/
Ano_Pid.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/******************** (C) COPYRIGHT 2016 ANO Tech ***************************
* 作者 :匿名科创
* 文件名 :ANO_PID.c
* 描述 :PID函数
* 官网 :www.anotc.com
* 淘宝 :anotc.taobao.com
* 技术Q群 :190169595
*****************************************************************************/
#include "Ano_Pid.h"
#include "Ano_Math.h"
#include "Ano_Filter.h"
float PID_calculate( float dT_s, //周期(单位:秒)
float in_ff, //前馈值
float expect, //期望值(设定值)
float feedback, //反馈值()
_PID_arg_st *pid_arg, //PID参数结构体
_PID_val_st *pid_val, //PID数据结构体
float inte_d_lim,//积分误差限幅
float inte_lim //integration limit,积分限幅
)
{
float differential,hz;
hz = safe_div(1.0f,dT_s,0);
// pid_arg->k_inc_d_norm = LIMIT(pid_arg->k_inc_d_norm,0,1);
/*
//增量算法
// det u(k) = q0*e(k)+q1*e(k-1)+q2*e(k-2)
out = sptr->q0*sptr->NowError + sptr->q1*sprt->LastError+sptr->q2*PrevError;
// 更新误差
sptr->PrevError = sptr->LastError; // e(k-2) = e(k-1)
sptr->LastError = sptr->NowError; // e(k-1) = e(k)
*/
pid_val->exp_d = (expect - pid_val->exp_old) *hz;
if(pid_arg->fb_d_mode == 0)
{
pid_val->fb_d = (feedback - pid_val->feedback_old) *hz;
}
else
{
pid_val->fb_d = pid_val->fb_d_ex;
}
differential = (pid_arg->kd_ex *pid_val->exp_d - pid_arg->kd_fb *pid_val->fb_d);
pid_val->err = (expect - feedback); // e(k) = r(k) - c(k)
pid_val->err_i += pid_arg->ki *LIMIT((pid_val->err ),-inte_d_lim,inte_d_lim )*dT_s;//)*T;//+ differential/pid_arg->kp
//pid_val->err_i += pid_arg->ki *(pid_val->err )*T;//)*T;//+ pid_arg->k_pre_d *pid_val->feedback_d
pid_val->err_i = LIMIT(pid_val->err_i,-inte_lim,inte_lim);
pid_val->out = pid_arg->k_ff *in_ff
+ pid_arg->kp *pid_val->err
+ differential
// + pid_arg->k_inc_d_norm *pid_val->err_d_lpf + (1.0f-pid_arg->k_inc_d_norm) *differential
+ pid_val->err_i;
pid_val->feedback_old = feedback;
pid_val->exp_old = expect;
return (pid_val->out);
}
/******************* (C) COPYRIGHT 2016 ANO TECH *****END OF FILE************/