I've been fixed a works transportation usability to power trough a PID. The transportation usability is:

$G_{\small{p}}(s) = \frac{1}{(1+s)(1+2s)}$

Doing a small activity pinch matlab I sewage this PID controller transportation function:

$G_{\small{c}}(s) = 3 + \frac{1}{s} + \frac{2s}{1+\frac{s}{60}}$

So $K_{\small{p}} = 3, K_{\small{i}} = 1, K_{\small{d}} = 2$ (note that I needed to put an precocious wave rod into derivative word to support it real)

Checking nan measurement consequence connected matlab everything seems to activity really fine.

Now I request to discretize specified controller usability and supply anti-windup functionality, I'm not an master but since I request an antiwindup I deliberation I request to disagreement nan integral action from nan proportional and derivative action.

Using Tustin method and a sampling clip of 1e-3 I sewage these:

uP[k] = 3*e[k] uI[k] = 0.0005*(e[k] + e[k-1]) + uI[k-1] uD[k] = 116.5*(e[k] - e[k-1]) + 0.9417 * uD[k-1]of people nan resulting bid will beryllium u[k] = uP[k] + uI[k] + uD[k]

The C codification become:

double control(const double y, const double r) { fixed double e[2] = { 0, 0 }; // e[0] -> e_k-1, e[1] -> e_k fixed double uD[2] = { 0, 0 }; // uD[0] -> uD_k-1, uD[1] -> uD_k fixed double uI[2] = { 0, 0 }; // uI[0] -> uI_k-1, uI[1] -> uI_k double uP, u; e[1] = r - y; uP = Kp * e[1]; uI[1] = Ki * (e[1] + e[0]) + uI[0]; uD[1] = Kd1 * (e[1] - e[0]) + Kd2 * uD[0]; u = uP + uI[1] + uD[1]; // Cut-Off if(u>MAX_CMD){ u = MAX_CMD; } other if(u<MIN_CMD) { u = MIN_CMD; } // e[0] = e[1]; uD[0] = uD[1]; uI[0] = uI[1]; return u; }I deliberation each measurement is correct but I don't consciousness very comfortable pinch specified precocious derivative position and debased integral. And moreover I cannot fig retired an effective antiwindup characteristic (I ever utilized it connected PI controllers ne'er connected PID). Something for illustration that should work?

// Cut-Off if(u>MAX_CMD){ u = MAX_CMD; uI[1] = 0; // Antiwindup } other if(u<MIN_CMD) { u = MIN_CMD; uI[1] = 0; // Antiwindup } //