Lines Matching refs:pc
37 pidctrl_init(struct pidctrl *pc, int interval, int setpoint, int bound, in pidctrl_init() argument
41 bzero(pc, sizeof(*pc)); in pidctrl_init()
42 pc->pc_setpoint = setpoint; in pidctrl_init()
43 pc->pc_interval = interval; in pidctrl_init()
44 pc->pc_bound = bound * setpoint * Kid; in pidctrl_init()
45 pc->pc_Kpd = Kpd; in pidctrl_init()
46 pc->pc_Kid = Kid; in pidctrl_init()
47 pc->pc_Kdd = Kdd; in pidctrl_init()
51 pidctrl_init_sysctl(struct pidctrl *pc, struct sysctl_oid_list *parent) in pidctrl_init_sysctl() argument
55 &pc->pc_error, 0, "Current difference from setpoint value (P)"); in pidctrl_init_sysctl()
57 &pc->pc_olderror, 0, "Error value from last interval"); in pidctrl_init_sysctl()
59 &pc->pc_integral, 0, "Accumulated error integral (I)"); in pidctrl_init_sysctl()
61 &pc->pc_derivative, 0, "Error derivative (D)"); in pidctrl_init_sysctl()
63 &pc->pc_input, 0, "Last controller process variable input"); in pidctrl_init_sysctl()
65 &pc->pc_output, 0, "Last controller output"); in pidctrl_init_sysctl()
67 &pc->pc_ticks, 0, "Last controller runtime"); in pidctrl_init_sysctl()
69 &pc->pc_setpoint, 0, "Desired level for process variable"); in pidctrl_init_sysctl()
71 &pc->pc_interval, 0, "Interval between calculations (ticks)"); in pidctrl_init_sysctl()
73 &pc->pc_bound, 0, "Integral wind-up limit"); in pidctrl_init_sysctl()
75 &pc->pc_Kpd, 0, "Inverse of proportional gain"); in pidctrl_init_sysctl()
77 &pc->pc_Kid, 0, "Inverse of integral gain"); in pidctrl_init_sysctl()
79 &pc->pc_Kdd, 0, "Inverse of derivative gain"); in pidctrl_init_sysctl()
83 pidctrl_classic(struct pidctrl *pc, int input) in pidctrl_classic() argument
88 error = pc->pc_setpoint - input; in pidctrl_classic()
89 pc->pc_ticks = ticks; in pidctrl_classic()
90 pc->pc_olderror = pc->pc_error; in pidctrl_classic()
93 Kpd = MAX(pc->pc_Kpd, 1); in pidctrl_classic()
94 Kid = MAX(pc->pc_Kid, 1); in pidctrl_classic()
95 Kdd = MAX(pc->pc_Kdd, 1); in pidctrl_classic()
98 pc->pc_error = error; in pidctrl_classic()
99 pc->pc_integral = in pidctrl_classic()
100 MAX(MIN(pc->pc_integral + error, pc->pc_bound), -pc->pc_bound); in pidctrl_classic()
101 pc->pc_derivative = error - pc->pc_olderror; in pidctrl_classic()
104 output = (pc->pc_error / Kpd) + (pc->pc_integral / Kid) + in pidctrl_classic()
105 (pc->pc_derivative / Kdd); in pidctrl_classic()
107 pc->pc_output = output; in pidctrl_classic()
108 pc->pc_input = input; in pidctrl_classic()
114 pidctrl_daemon(struct pidctrl *pc, int input) in pidctrl_daemon() argument
119 error = pc->pc_setpoint - input; in pidctrl_daemon()
126 if ((u_int)ticks - pc->pc_ticks >= pc->pc_interval) { in pidctrl_daemon()
127 pc->pc_ticks = ticks; in pidctrl_daemon()
128 pc->pc_olderror = pc->pc_error; in pidctrl_daemon()
129 pc->pc_output = pc->pc_error = 0; in pidctrl_daemon()
132 error -= pc->pc_error - pc->pc_output; in pidctrl_daemon()
136 Kpd = MAX(pc->pc_Kpd, 1); in pidctrl_daemon()
137 Kid = MAX(pc->pc_Kid, 1); in pidctrl_daemon()
138 Kdd = MAX(pc->pc_Kdd, 1); in pidctrl_daemon()
141 pc->pc_error += error; in pidctrl_daemon()
142 pc->pc_integral = in pidctrl_daemon()
143 MAX(MIN(pc->pc_integral + error, pc->pc_bound), 0); in pidctrl_daemon()
144 pc->pc_derivative = pc->pc_error - pc->pc_olderror; in pidctrl_daemon()
147 output = (pc->pc_error / Kpd) + (pc->pc_integral / Kid) + in pidctrl_daemon()
148 (pc->pc_derivative / Kdd); in pidctrl_daemon()
149 output = MAX(output - pc->pc_output, 0); in pidctrl_daemon()
151 pc->pc_output += output; in pidctrl_daemon()
152 pc->pc_input = input; in pidctrl_daemon()