Rev 2132 | Rev 2138 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2132 | Rev 2135 | ||
---|---|---|---|
1 | #include <stdlib.h> |
1 | #include <stdlib.h> |
2 | #include <avr/io.h> |
2 | #include <avr/io.h> |
3 | #include "eeprom.h" |
3 | #include "eeprom.h" |
4 | #include "flight.h" |
4 | #include "flight.h" |
5 | #include "output.h" |
5 | #include "output.h" |
6 | 6 | ||
7 | // Necessary for external control and motor test |
7 | // Necessary for external control and motor test |
8 | #include "uart0.h" |
8 | #include "uart0.h" |
9 | #include "timer2.h" |
9 | #include "timer2.h" |
10 | #include "analog.h" |
10 | #include "analog.h" |
11 | #include "attitude.h" |
11 | #include "attitude.h" |
12 | #include "controlMixer.h" |
12 | #include "controlMixer.h" |
13 | #include "configuration.h" |
13 | #include "configuration.h" |
14 | 14 | ||
15 | #define CHECK_MIN_MAX(value, min, max) {if(value < min) value = min; else if(value > max) value = max;} |
15 | #define CHECK_MIN_MAX(value, min, max) {if(value < min) value = min; else if(value > max) value = max;} |
16 | 16 | ||
17 | /* |
17 | /* |
18 | * target-directions integrals. |
18 | * target-directions integrals. |
19 | */ |
19 | */ |
20 | int32_t target[3]; |
20 | int32_t target[3]; |
21 | 21 | ||
22 | /* |
22 | /* |
23 | * Error integrals. |
23 | * Error integrals. |
24 | */ |
24 | */ |
25 | int32_t error[3]; |
- | |
26 | 25 | ||
27 | uint8_t reverse[3]; |
26 | uint8_t reverse[3]; |
28 | int32_t maxError[3]; |
27 | int32_t maxError[3]; |
29 | int32_t IPart[3] = { 0, 0, 0 }; |
28 | int32_t IPart[3] = { 0, 0, 0 }; |
30 | PID_t airspeedPID[3]; |
29 | PID_t airspeedPID[3]; |
31 | 30 | ||
32 | int16_t controlServos[NUM_CONTROL_SERVOS]; |
31 | int16_t controlServos[NUM_CONTROL_SERVOS]; |
33 | 32 | ||
34 | /************************************************************************/ |
33 | /************************************************************************/ |
35 | /* Neutral Readings */ |
34 | /* Neutral Readings */ |
36 | /************************************************************************/ |
35 | /************************************************************************/ |
37 | #define CONTROL_CONFIG_SCALE 10 |
36 | #define CONTROL_CONFIG_SCALE 10 |
38 | 37 | ||
39 | void flight_setGround(void) { |
38 | void flight_setGround(void) { |
40 | IPart[PITCH] = IPart[ROLL] = IPart[YAW] = 0; |
39 | IPart[PITCH] = IPart[ROLL] = IPart[YAW] = 0; |
41 | target[PITCH] = attitude[PITCH]; |
40 | target[PITCH] = attitude[PITCH]; |
42 | target[ROLL] = attitude[ROLL]; |
41 | target[ROLL] = attitude[ROLL]; |
43 | target[YAW] = attitude[YAW]; |
42 | target[YAW] = attitude[YAW]; |
44 | } |
43 | } |
45 | 44 | ||
46 | void flight_updateFlightParametersToFlightMode(void) { |
45 | void flight_updateFlightParametersToFlightMode(void) { |
47 | debugOut.analog[16] = currentFlightMode; |
46 | debugOut.analog[16] = currentFlightMode; |
- | 47 | ||
48 | reverse[PITCH] = staticParams.servosReverse & CONTROL_SERVO_REVERSE_ELEVATOR; |
48 | reverse[PITCH] = staticParams.servosReverse & CONTROL_SERVO_REVERSE_ELEVATOR; |
49 | reverse[ROLL] = staticParams.servosReverse & CONTROL_SERVO_REVERSE_AILERONS; |
49 | reverse[ROLL] = staticParams.servosReverse & CONTROL_SERVO_REVERSE_AILERONS; |
50 | reverse[YAW] = staticParams.servosReverse & CONTROL_SERVO_REVERSE_RUDDER; |
50 | reverse[YAW] = staticParams.servosReverse & CONTROL_SERVO_REVERSE_RUDDER; |
51 | 51 | ||
52 | // At a switch to angles, we want to kill errors first. |
52 | // At a switch to angles, we want to kill errors first. |
53 | // This should be triggered only once per mode change! |
53 | // This should be triggered only once per mode change! |
54 | if (currentFlightMode == FLIGHT_MODE_ANGLES) { |
54 | if (currentFlightMode == FLIGHT_MODE_ANGLES) { |
55 | target[PITCH] = attitude[PITCH]; |
55 | target[PITCH] = attitude[PITCH]; |
56 | target[ROLL] = attitude[ROLL]; |
56 | target[ROLL] = attitude[ROLL]; |
57 | target[YAW] = attitude[YAW]; |
57 | target[YAW] = attitude[YAW]; |
58 | } |
58 | } |
59 | 59 | ||
60 | for (uint8_t axis=0; axis<3; axis++) { |
60 | for (uint8_t axis=0; axis<3; axis++) { |
61 | maxError[axis] = (int32_t)staticParams.gyroPID[axis].iMax * GYRO_DEG_FACTOR; |
61 | maxError[axis] = (int32_t)staticParams.gyroPID[axis].iMax * GYRO_DEG_FACTOR; |
62 | } |
62 | } |
63 | } |
63 | } |
64 | 64 | ||
65 | // Normal at airspeed = 10. |
65 | // Normal at airspeed = 10. |
66 | uint8_t calcAirspeedPID(uint8_t pid) { |
66 | uint8_t calcAirspeedPID(uint8_t pid) { |
67 | if (!(staticParams.bitConfig & CFG_USE_AIRSPEED_PID)) { |
67 | if (!(staticParams.bitConfig & CFG_USE_AIRSPEED_PID)) { |
68 | return pid; |
68 | return pid; |
69 | } |
69 | } |
70 | 70 | ||
71 | uint16_t result = (pid * 10) / airspeedVelocity; |
71 | uint16_t result = (pid * 10) / airspeedVelocity; |
72 | 72 | ||
73 | if (result > 240 || airspeedVelocity == 0) { |
73 | if (result > 240 || airspeedVelocity == 0) { |
74 | result = 240; |
74 | result = 240; |
75 | } |
75 | } |
76 | 76 | ||
77 | return result; |
77 | return result; |
78 | } |
78 | } |
79 | 79 | ||
80 | void setAirspeedPIDs(void) { |
80 | void setAirspeedPIDs(void) { |
81 | for (uint8_t axis = 0; axis<3; axis++) { |
81 | for (uint8_t axis = 0; axis<3; axis++) { |
82 | airspeedPID[axis].P = calcAirspeedPID(dynamicParams.gyroPID[axis].P); |
82 | airspeedPID[axis].P = calcAirspeedPID(dynamicParams.gyroPID[axis].P); |
83 | airspeedPID[axis].I = calcAirspeedPID(dynamicParams.gyroPID[axis].I); // Should this be??? |
83 | airspeedPID[axis].I = calcAirspeedPID(dynamicParams.gyroPID[axis].I); // Should this be??? |
84 | airspeedPID[axis].D = dynamicParams.gyroPID[axis].D; |
84 | airspeedPID[axis].D = dynamicParams.gyroPID[axis].D; |
85 | } |
85 | } |
86 | } |
86 | } |
87 | 87 | ||
88 | #define LOG_STICK_SCALE 8 |
88 | #define LOG_STICK_SCALE 8 |
89 | #define LOG_P_SCALE 6 |
89 | #define LOG_P_SCALE 6 |
90 | #define LOG_I_SCALE 10 |
90 | #define LOG_I_SCALE 10 |
91 | #define LOG_D_SCALE 6 |
91 | #define LOG_D_SCALE 6 |
92 | 92 | ||
93 | /************************************************************************/ |
93 | /************************************************************************/ |
94 | /* Main Flight Control */ |
94 | /* Main Flight Control */ |
95 | /************************************************************************/ |
95 | /************************************************************************/ |
96 | void flight_control(void) { |
96 | void flight_control(void) { |
97 | // Mixer Fractions that are combined for Motor Control |
97 | // Mixer Fractions that are combined for Motor Control |
98 | int16_t term[4]; |
98 | int16_t term[4]; |
99 | 99 | ||
100 | // PID controller variables |
100 | // PID controller variables |
101 | int16_t PDPart[3]; |
101 | int16_t PDPart[3]; |
102 | 102 | ||
103 | static int8_t debugDataTimer = 1; |
103 | static int8_t debugDataTimer = 1; |
104 | 104 | ||
105 | // High resolution motor values for smoothing of PID motor outputs |
105 | // High resolution motor values for smoothing of PID motor outputs |
106 | // static int16_t outputFilters[MAX_OUTPUTS]; |
106 | // static int16_t outputFilters[MAX_OUTPUTS]; |
107 | 107 | ||
108 | uint8_t axis; |
108 | uint8_t axis; |
109 | 109 | ||
110 | setAirspeedPIDs(); |
110 | setAirspeedPIDs(); |
111 | 111 | ||
112 | term[CONTROL_THROTTLE] = controls[CONTROL_THROTTLE]; |
112 | term[CONTROL_THROTTLE] = controls[CONTROL_THROTTLE]; |
113 | 113 | ||
114 | // These params are just left the same in all modes. In MANUAL and RATE the results are ignored anyway. |
114 | // These params are just left the same in all modes. In MANUAL and RATE the results are ignored anyway. |
115 | int32_t tmp; |
115 | int32_t tmp; |
116 | 116 | ||
117 | tmp = ((int32_t)controls[CONTROL_ELEVATOR] * staticParams.stickIElevator) >> LOG_STICK_SCALE; |
117 | tmp = ((int32_t)controls[CONTROL_ELEVATOR] * staticParams.stickIElevator) >> LOG_STICK_SCALE; |
118 | if (reverse[PITCH]) target[PITCH] += tmp; else target[PITCH] -= tmp; |
118 | if (reverse[PITCH]) target[PITCH] += tmp; else target[PITCH] -= tmp; |
119 | 119 | ||
120 | tmp = ((int32_t)controls[CONTROL_AILERONS] * staticParams.stickIAilerons) >> LOG_STICK_SCALE; |
120 | tmp = ((int32_t)controls[CONTROL_AILERONS] * staticParams.stickIAilerons) >> LOG_STICK_SCALE; |
121 | if (reverse[ROLL]) target[ROLL] += tmp; else target[ROLL] -= tmp; |
121 | if (reverse[ROLL]) target[ROLL] += tmp; else target[ROLL] -= tmp; |
122 | 122 | ||
123 | tmp = ((int32_t)controls[CONTROL_RUDDER] * staticParams.stickIRudder) >> LOG_STICK_SCALE; |
123 | tmp = ((int32_t)controls[CONTROL_RUDDER] * staticParams.stickIRudder) >> LOG_STICK_SCALE; |
124 | if (reverse[YAW]) target[YAW] += tmp; else target[YAW] -= tmp; |
124 | if (reverse[YAW]) target[YAW] += tmp; else target[YAW] -= tmp; |
125 | 125 | ||
126 | for (axis = PITCH; axis <= YAW; axis++) { |
126 | for (axis = PITCH; axis <= YAW; axis++) { |
127 | if (target[axis] > OVER180) { |
127 | if (target[axis] > OVER180) { |
128 | target[axis] -= OVER360; |
128 | target[axis] -= OVER360; |
129 | } else if (target[axis] <= -OVER180) { |
129 | } else if (target[axis] <= -OVER180) { |
130 | target[axis] += OVER360; |
130 | target[axis] += OVER360; |
131 | } |
131 | } |
132 | 132 | ||
133 | error[axis] = attitude[axis] - target[axis]; |
133 | int32_t error = attitude[axis] - target[axis]; |
134 | 134 | ||
135 | #define ROTATETARGET 1 |
135 | #define ROTATETARGET 1 |
136 | // #define TRUNCATEERROR 1 |
136 | // #define TRUNCATEERROR 1 |
137 | 137 | ||
138 | #ifdef ROTATETARGET |
138 | #ifdef ROTATETARGET |
- | 139 | //if(abs(error) > OVER180) { // doesnt work!!! |
|
139 | if(abs(error[axis]) > OVER180) { |
140 | if(error > OVER180 || error < -OVER180) { |
140 | // The shortest way from attitude to target crosses -180. |
141 | // The shortest way from attitude to target crosses -180. |
141 | // Well there are 2 possibilities: A is >0 and T is < 0, that makes E a (too) large positive number. It should be wrapped to negative. |
142 | // Well there are 2 possibilities: A is >0 and T is < 0, that makes E a (too) large positive number. It should be wrapped to negative. |
142 | // Or A is <0 and T is >0, that makes E a (too) large negative number. It should be wrapped to positive. |
143 | // Or A is <0 and T is >0, that makes E a (too) large negative number. It should be wrapped to positive. |
143 | if (error[axis] > 0) { |
144 | if (error > 0) { |
144 | if (error[axis] < OVER360 - maxError[axis]) { |
145 | if (error < OVER360 - maxError[axis]) { |
145 | // too much err. |
146 | // too much err. |
146 | error[axis] = -maxError[axis]; |
147 | error = -maxError[axis]; |
147 | target[axis] = attitude[axis] + maxError[axis]; |
148 | target[axis] = attitude[axis] + maxError[axis]; |
148 | if (target[axis] > OVER180) target[axis] -= OVER360; |
149 | if (target[axis] > OVER180) target[axis] -= OVER360; |
149 | } else { |
150 | } else { |
150 | // Normal case, we just need to correct for the wrap. Error will be negative. |
151 | // Normal case, we just need to correct for the wrap. Error will be negative. |
151 | error[axis] -= OVER360; |
152 | error -= OVER360; |
152 | } |
153 | } |
153 | } else { |
154 | } else { |
154 | if (error[axis] > maxError[axis] - OVER360) { |
155 | if (error > maxError[axis] - OVER360) { |
155 | // too much err. |
156 | // too much err. |
156 | error[axis] = maxError[axis]; |
157 | error = maxError[axis]; |
157 | target[axis] = attitude[axis] - maxError[axis]; |
158 | target[axis] = attitude[axis] - maxError[axis]; |
158 | if (target[axis] < -OVER180) target[axis] += OVER360; |
159 | if (target[axis] < -OVER180) target[axis] += OVER360; |
159 | } else { |
160 | } else { |
160 | // Normal case, we just need to correct for the wrap. Error will be negative. |
161 | // Normal case, we just need to correct for the wrap. Error will be negative. |
161 | error[axis] += OVER360; |
162 | error += OVER360; |
162 | } |
163 | } |
163 | } |
164 | } |
164 | } else { |
165 | } else { |
165 | // Simple case, linear range. |
166 | // Simple case, linear range. |
166 | if (error[axis] > maxError[axis]) { |
167 | if (error > maxError[axis]) { |
167 | error[axis] = maxError[axis]; |
168 | error = maxError[axis]; |
168 | target[axis] = attitude[axis] - maxError[axis]; |
169 | target[axis] = attitude[axis] - maxError[axis]; |
169 | } else if (error[axis] < -maxError[axis]) { |
170 | } else if (error < -maxError[axis]) { |
170 | error[axis] = -maxError[axis]; |
171 | error = -maxError[axis]; |
171 | target[axis] = attitude[axis] + maxError[axis]; |
172 | target[axis] = attitude[axis] + maxError[axis]; |
172 | } |
173 | } |
173 | } |
174 | } |
174 | #endif |
175 | #endif |
175 | #ifdef TUNCATEERROR |
176 | #ifdef TUNCATEERROR |
176 | if (error[axis] > maxError[axis]) { |
177 | if (error > maxError[axis]) { |
177 | error[axis] = maxError[axis]; |
178 | error = maxError[axis]; |
178 | } else if (error[axis] < -maxError[axis]) { |
179 | } else if (error < -maxError[axis]) { |
179 | error[axis] = -maxError[axis]; |
180 | error = -maxError[axis]; |
180 | } else { |
181 | } else { |
181 | // update I parts here for angles mode. I parts in rate mode is something different. |
182 | // update I parts here for angles mode. I parts in rate mode is something different. |
182 | } |
183 | } |
183 | #endif |
184 | #endif |
- | 185 | ||
- | 186 | debugOut.analog[9+axis] = error / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
|
184 | 187 | ||
185 | /************************************************************************/ |
188 | /************************************************************************/ |
186 | /* Calculate control feedback from angle (gyro integral) */ |
189 | /* Calculate control feedback from angle (gyro integral) */ |
187 | /* and angular velocity (gyro signal) */ |
190 | /* and angular velocity (gyro signal) */ |
188 | /************************************************************************/ |
191 | /************************************************************************/ |
189 | if (currentFlightMode == FLIGHT_MODE_ANGLES || currentFlightMode == FLIGHT_MODE_RATE) { |
192 | if (currentFlightMode == FLIGHT_MODE_ANGLES || currentFlightMode == FLIGHT_MODE_RATE) { |
190 | PDPart[axis] = +(((int32_t) gyro_PID[axis] * (int32_t) airspeedPID[axis].P) >> LOG_P_SCALE) |
193 | PDPart[axis] = +(((int32_t) gyro_PID[axis] * (int32_t) airspeedPID[axis].P) >> LOG_P_SCALE) |
191 | + (((int16_t)gyroD[axis] * (int16_t) airspeedPID[axis].D) >> LOG_D_SCALE); |
194 | + (((int16_t)gyroD[axis] * (int16_t) airspeedPID[axis].D) >> LOG_D_SCALE); |
192 | //if (reverse[axis]) |
195 | //if (reverse[axis]) |
193 | // PDPart[axis] = -PDPart[axis]; |
196 | // PDPart[axis] = -PDPart[axis]; |
194 | } else { |
197 | } else { |
195 | PDPart[axis] = 0; |
198 | PDPart[axis] = 0; |
196 | } |
199 | } |
197 | 200 | ||
198 | if (currentFlightMode == FLIGHT_MODE_ANGLES) { |
201 | if (currentFlightMode == FLIGHT_MODE_ANGLES) { |
199 | int16_t anglePart = (int32_t)(error[axis] * (int32_t) airspeedPID[axis].I) >> LOG_I_SCALE; |
202 | int16_t anglePart = (int32_t)(error * (int32_t) airspeedPID[axis].I) >> LOG_I_SCALE; |
200 | PDPart[axis] += anglePart; |
203 | PDPart[axis] += anglePart; |
201 | } |
204 | } |
202 | 205 | ||
203 | // Add I parts here... these are integrated errors. |
206 | // Add I parts here... these are integrated errors. |
204 | if (reverse[axis]) |
207 | if (reverse[axis]) |
205 | term[axis] = controls[axis] - PDPart[axis]; // + IPart[axis]; |
208 | term[axis] = controls[axis] - PDPart[axis]; // + IPart[axis]; |
206 | else |
209 | else |
207 | term[axis] = controls[axis] + PDPart[axis]; // + IPart[axis]; |
210 | term[axis] = controls[axis] + PDPart[axis]; // + IPart[axis]; |
208 | } |
211 | } |
209 | 212 | ||
210 | debugOut.analog[12] = term[PITCH]; |
213 | debugOut.analog[12] = term[PITCH]; |
211 | debugOut.analog[13] = term[ROLL]; |
214 | debugOut.analog[13] = term[ROLL]; |
212 | debugOut.analog[14] = term[YAW]; |
215 | debugOut.analog[14] = term[YAW]; |
213 | debugOut.analog[15] = term[THROTTLE]; |
216 | debugOut.analog[15] = term[THROTTLE]; |
214 | 217 | ||
215 | for (uint8_t i = 0; i < NUM_CONTROL_SERVOS; i++) { |
218 | for (uint8_t i = 0; i < NUM_CONTROL_SERVOS; i++) { |
216 | int16_t tmp; |
219 | int16_t tmp; |
217 | if (servoTestActive) { |
220 | if (servoTestActive) { |
218 | controlServos[i] = ((int16_t) servoTest[i] - 128) * 8; |
221 | controlServos[i] = ((int16_t) servoTest[i] - 128) * 8; |
219 | } else { |
222 | } else { |
220 | // Follow the normal order of servos: Ailerons, elevator, throttle, rudder. |
223 | // Follow the normal order of servos: Ailerons, elevator, throttle, rudder. |
221 | switch (i) { |
224 | switch (i) { |
222 | case 0: |
225 | case 0: |
223 | tmp = term[ROLL]; |
226 | tmp = term[ROLL]; |
224 | break; |
227 | break; |
225 | case 1: |
228 | case 1: |
226 | tmp = term[PITCH]; |
229 | tmp = term[PITCH]; |
227 | break; |
230 | break; |
228 | case 2: |
231 | case 2: |
229 | tmp = term[THROTTLE]; |
232 | tmp = term[THROTTLE]; |
230 | break; |
233 | break; |
231 | case 3: |
234 | case 3: |
232 | tmp = term[YAW]; |
235 | tmp = term[YAW]; |
233 | break; |
236 | break; |
234 | default: |
237 | default: |
235 | tmp = 0; |
238 | tmp = 0; |
236 | } |
239 | } |
237 | // These are all signed and in the same units as the RC stuff in rc.c. |
240 | // These are all signed and in the same units as the RC stuff in rc.c. |
238 | controlServos[i] = tmp; |
241 | controlServos[i] = tmp; |
239 | } |
242 | } |
240 | } |
243 | } |
241 | 244 | ||
242 | calculateControlServoValues(); |
245 | calculateControlServoValues(); |
243 | 246 | ||
244 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
247 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
245 | // Debugging |
248 | // Debugging |
246 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
249 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
247 | if (!(--debugDataTimer)) { |
250 | if (!(--debugDataTimer)) { |
248 | debugDataTimer = 24; // update debug outputs at 488 / 24 = 20.3 Hz. |
251 | debugDataTimer = 24; // update debug outputs at 488 / 24 = 20.3 Hz. |
249 | debugOut.analog[0] = gyro_PID[PITCH]; // in 0.1 deg |
252 | debugOut.analog[0] = gyro_PID[PITCH]; // in 0.1 deg |
250 | debugOut.analog[1] = gyro_PID[ROLL]; // in 0.1 deg |
253 | debugOut.analog[1] = gyro_PID[ROLL]; // in 0.1 deg |
251 | debugOut.analog[2] = gyro_PID[YAW]; |
254 | debugOut.analog[2] = gyro_PID[YAW]; |
252 | 255 | ||
253 | debugOut.analog[3] = attitude[PITCH] / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
256 | debugOut.analog[3] = attitude[PITCH] / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
254 | debugOut.analog[4] = attitude[ROLL] / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
257 | debugOut.analog[4] = attitude[ROLL] / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
255 | debugOut.analog[5] = attitude[YAW] / (GYRO_DEG_FACTOR / 10); |
258 | debugOut.analog[5] = attitude[YAW] / (GYRO_DEG_FACTOR / 10); |
256 | 259 | ||
257 | debugOut.analog[6] = target[PITCH] / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
260 | debugOut.analog[6] = target[PITCH] / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
258 | debugOut.analog[7] = target[ROLL] / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
261 | debugOut.analog[7] = target[ROLL] / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
259 | debugOut.analog[8] = target[YAW] / (GYRO_DEG_FACTOR / 10); |
262 | debugOut.analog[8] = target[YAW] / (GYRO_DEG_FACTOR / 10); |
260 | - | ||
261 | debugOut.analog[9] = error[PITCH] / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
- | |
262 | debugOut.analog[10] = error[ROLL] / (GYRO_DEG_FACTOR / 10); // in 0.1 deg |
- | |
263 | debugOut.analog[11] = error[YAW] / (GYRO_DEG_FACTOR / 10); |
- | |
264 | 263 | ||
265 | debugOut.analog[12] = term[PITCH]; |
264 | debugOut.analog[12] = term[PITCH]; |
266 | debugOut.analog[13] = term[ROLL]; |
265 | debugOut.analog[13] = term[ROLL]; |
267 | debugOut.analog[14] = term[YAW]; |
266 | debugOut.analog[14] = term[YAW]; |
268 | 267 | ||
269 | //DebugOut.Analog[18] = (10 * controlIntegrals[CONTROL_ELEVATOR]) / GYRO_DEG_FACTOR_PITCHROLL; // in 0.1 deg |
268 | //DebugOut.Analog[18] = (10 * controlIntegrals[CONTROL_ELEVATOR]) / GYRO_DEG_FACTOR_PITCHROLL; // in 0.1 deg |
270 | //DebugOut.Analog[19] = (10 * controlIntegrals[CONTROL_AILERONS]) / GYRO_DEG_FACTOR_PITCHROLL; // in 0.1 deg |
269 | //DebugOut.Analog[19] = (10 * controlIntegrals[CONTROL_AILERONS]) / GYRO_DEG_FACTOR_PITCHROLL; // in 0.1 deg |
271 | //debugOut.analog[22] = (10 * IPart[PITCH]) / GYRO_DEG_FACTOR; // in 0.1 deg |
270 | //debugOut.analog[22] = (10 * IPart[PITCH]) / GYRO_DEG_FACTOR; // in 0.1 deg |
272 | //debugOut.analog[23] = (10 * IPart[ROLL]) / GYRO_DEG_FACTOR; // in 0.1 deg |
271 | //debugOut.analog[23] = (10 * IPart[ROLL]) / GYRO_DEG_FACTOR; // in 0.1 deg |
273 | } |
272 | } |
274 | } |
273 | } |
275 | 274 |