Lines Matching full:pc
36 pidctrl_init(struct pidctrl *pc, int interval, int setpoint, int bound, in pidctrl_init() argument
40 bzero(pc, sizeof(*pc)); in pidctrl_init()
41 pc->pc_setpoint = setpoint; in pidctrl_init()
42 pc->pc_interval = interval; in pidctrl_init()
43 pc->pc_bound = bound * setpoint * Kid; in pidctrl_init()
44 pc->pc_Kpd = Kpd; in pidctrl_init()
45 pc->pc_Kid = Kid; in pidctrl_init()
46 pc->pc_Kdd = Kdd; in pidctrl_init()
50 pidctrl_init_sysctl(struct pidctrl *pc, struct sysctl_oid_list *parent) in pidctrl_init_sysctl() argument
54 &pc->pc_error, 0, "Current difference from setpoint value (P)"); in pidctrl_init_sysctl()
56 &pc->pc_olderror, 0, "Error value from last interval"); in pidctrl_init_sysctl()
58 &pc->pc_integral, 0, "Accumulated error integral (I)"); in pidctrl_init_sysctl()
60 &pc->pc_derivative, 0, "Error derivative (D)"); in pidctrl_init_sysctl()
62 &pc->pc_input, 0, "Last controller process variable input"); in pidctrl_init_sysctl()
64 &pc->pc_output, 0, "Last controller output"); in pidctrl_init_sysctl()
66 &pc->pc_ticks, 0, "Last controller runtime"); in pidctrl_init_sysctl()
68 &pc->pc_setpoint, 0, "Desired level for process variable"); in pidctrl_init_sysctl()
70 &pc->pc_interval, 0, "Interval between calculations (ticks)"); in pidctrl_init_sysctl()
72 &pc->pc_bound, 0, "Integral wind-up limit"); in pidctrl_init_sysctl()
74 &pc->pc_Kpd, 0, "Inverse of proportional gain"); in pidctrl_init_sysctl()
76 &pc->pc_Kid, 0, "Inverse of integral gain"); in pidctrl_init_sysctl()
78 &pc->pc_Kdd, 0, "Inverse of derivative gain"); in pidctrl_init_sysctl()
82 pidctrl_classic(struct pidctrl *pc, int input) in pidctrl_classic() argument
87 error = pc->pc_setpoint - input; in pidctrl_classic()
88 pc->pc_ticks = ticks; in pidctrl_classic()
89 pc->pc_olderror = pc->pc_error; in pidctrl_classic()
92 Kpd = MAX(pc->pc_Kpd, 1); in pidctrl_classic()
93 Kid = MAX(pc->pc_Kid, 1); in pidctrl_classic()
94 Kdd = MAX(pc->pc_Kdd, 1); in pidctrl_classic()
97 pc->pc_error = error; in pidctrl_classic()
98 pc->pc_integral = in pidctrl_classic()
99 MAX(MIN(pc->pc_integral + error, pc->pc_bound), -pc->pc_bound); in pidctrl_classic()
100 pc->pc_derivative = error - pc->pc_olderror; in pidctrl_classic()
103 output = (pc->pc_error / Kpd) + (pc->pc_integral / Kid) + in pidctrl_classic()
104 (pc->pc_derivative / Kdd); in pidctrl_classic()
106 pc->pc_output = output; in pidctrl_classic()
107 pc->pc_input = input; in pidctrl_classic()
113 pidctrl_daemon(struct pidctrl *pc, int input) in pidctrl_daemon() argument
118 error = pc->pc_setpoint - input; in pidctrl_daemon()
125 if ((u_int)ticks - pc->pc_ticks >= pc->pc_interval) { in pidctrl_daemon()
126 pc->pc_ticks = ticks; in pidctrl_daemon()
127 pc->pc_olderror = pc->pc_error; in pidctrl_daemon()
128 pc->pc_output = pc->pc_error = 0; in pidctrl_daemon()
131 error -= pc->pc_error - pc->pc_output; in pidctrl_daemon()
135 Kpd = MAX(pc->pc_Kpd, 1); in pidctrl_daemon()
136 Kid = MAX(pc->pc_Kid, 1); in pidctrl_daemon()
137 Kdd = MAX(pc->pc_Kdd, 1); in pidctrl_daemon()
140 pc->pc_error += error; in pidctrl_daemon()
141 pc->pc_integral = in pidctrl_daemon()
142 MAX(MIN(pc->pc_integral + error, pc->pc_bound), 0); in pidctrl_daemon()
143 pc->pc_derivative = pc->pc_error - pc->pc_olderror; in pidctrl_daemon()
146 output = (pc->pc_error / Kpd) + (pc->pc_integral / Kid) + in pidctrl_daemon()
147 (pc->pc_derivative / Kdd); in pidctrl_daemon()
148 output = MAX(output - pc->pc_output, 0); in pidctrl_daemon()
150 pc->pc_output += output; in pidctrl_daemon()
151 pc->pc_input = input; in pidctrl_daemon()