Rev 1805 | Rev 1841 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1805 | Rev 1821 | ||
---|---|---|---|
Line 79... | Line 79... | ||
79 | * These are no longer maintained, just left at 0. The original implementation just summed the acc. |
79 | * These are no longer maintained, just left at 0. The original implementation just summed the acc. |
80 | * value to them every 2 ms. No filtering or anything. Just a case for an eventual overflow?? Hey??? |
80 | * value to them every 2 ms. No filtering or anything. Just a case for an eventual overflow?? Hey??? |
81 | */ |
81 | */ |
82 | // int16_t naviAccPitch = 0, naviAccRoll = 0, naviCntAcc = 0; |
82 | // int16_t naviAccPitch = 0, naviAccRoll = 0, naviCntAcc = 0; |
Line 83... | Line 83... | ||
83 | 83 | ||
84 | uint8_t gyroPFactor, gyroIFactor; // the PD factors for the attitude control |
84 | uint8_t gyroPFactor, gyroIFactor; // the PD factors for the attitude control |
Line 85... | Line 85... | ||
85 | uint8_t yawPFactor, yawIFactor; // the PD factors for the yaw control |
85 | uint8_t yawPFactor, yawIFactor; // the PD factors for the yaw control |
86 | 86 | ||
87 | // Some integral weight constant... |
87 | // Some integral weight constant... |
Line 93... | Line 93... | ||
93 | 93 | ||
94 | /************************************************************************/ |
94 | /************************************************************************/ |
95 | /* Filter for motor value smoothing (necessary???) */ |
95 | /* Filter for motor value smoothing (necessary???) */ |
96 | /************************************************************************/ |
96 | /************************************************************************/ |
97 | int16_t motorFilter(int16_t newvalue, int16_t oldvalue) { |
97 | int16_t motorFilter(int16_t newvalue, int16_t oldvalue) { |
98 | switch(dynamicParams.UserParams[5]) { |
98 | switch (dynamicParams.UserParams[5]) { |
99 | case 0: |
99 | case 0: |
100 | return newvalue; |
100 | return newvalue; |
101 | case 1: |
101 | case 1: |
102 | return (oldvalue + newvalue) / 2; |
102 | return (oldvalue + newvalue) / 2; |
103 | case 2: |
103 | case 2: |
104 | if(newvalue > oldvalue) |
104 | if (newvalue > oldvalue) |
105 | return (1 * (int16_t)oldvalue + newvalue) / 2; //mean of old and new |
105 | return (1 * (int16_t) oldvalue + newvalue) / 2; //mean of old and new |
106 | else |
106 | else |
107 | return newvalue - (oldvalue - newvalue) * 1; // 2 * new - old |
107 | return newvalue - (oldvalue - newvalue) * 1; // 2 * new - old |
108 | case 3: |
108 | case 3: |
109 | if(newvalue < oldvalue) |
109 | if (newvalue < oldvalue) |
110 | return (1 * (int16_t)oldvalue + newvalue) / 2; //mean of old and new |
110 | return (1 * (int16_t) oldvalue + newvalue) / 2; //mean of old and new |
111 | else |
111 | else |
- | 112 | return newvalue - (oldvalue - newvalue) * 1; // 2 * new - old |
|
112 | return newvalue - (oldvalue - newvalue) * 1; // 2 * new - old |
113 | default: |
113 | default: return newvalue; |
114 | return newvalue; |
114 | } |
115 | } |
Line 115... | Line 116... | ||
115 | } |
116 | } |
116 | 117 | ||
117 | /************************************************************************/ |
118 | /************************************************************************/ |
118 | /* Neutral Readings */ |
119 | /* Neutral Readings */ |
119 | /************************************************************************/ |
120 | /************************************************************************/ |
Line 120... | Line 121... | ||
120 | void flight_setNeutral() { |
121 | void flight_setNeutral() { |
121 | MKFlags |= MKFLAG_CALIBRATE; |
122 | MKFlags |= MKFLAG_CALIBRATE; |
122 | 123 | ||
123 | // not really used here any more. |
124 | // not really used here any more. |
Line 124... | Line 125... | ||
124 | dynamicParams.KalmanK = -1; |
125 | dynamicParams.KalmanK = -1; |
125 | dynamicParams.KalmanMaxDrift = 0; |
126 | dynamicParams.KalmanMaxDrift = 0; |
Line -... | Line 127... | ||
- | 127 | dynamicParams.KalmanMaxFusion = 32; |
|
126 | dynamicParams.KalmanMaxFusion = 32; |
128 | |
127 | 129 | controlMixer_initVariables(); |
|
128 | controlMixer_initVariables(); |
130 | } |
129 | } |
131 | |
130 | 132 | void setFlightParameters(uint8_t _Ki, uint8_t _gyroPFactor, |
|
131 | void setFlightParameters(uint8_t _Ki, uint8_t _gyroPFactor, uint8_t _gyroIFactor, uint8_t _yawPFactor, uint8_t _yawIFactor) { |
133 | uint8_t _gyroIFactor, uint8_t _yawPFactor, uint8_t _yawIFactor) { |
132 | Ki = 10300 / _Ki; |
134 | Ki = 10300 / _Ki; |
Line 133... | Line 135... | ||
133 | gyroPFactor = _gyroPFactor; |
135 | gyroPFactor = _gyroPFactor; |
134 | gyroIFactor = _gyroIFactor; |
136 | gyroIFactor = _gyroIFactor; |
135 | yawPFactor = _yawPFactor; |
- | |
136 | yawIFactor = _yawIFactor; |
137 | yawPFactor = _yawPFactor; |
137 | } |
- | |
138 | 138 | yawIFactor = _yawIFactor; |
|
139 | void setNormalFlightParameters(void) { |
- | |
140 | setFlightParameters(dynamicParams.IFactor + 1, |
139 | } |
Line 141... | Line 140... | ||
141 | dynamicParams.GyroP + 10, |
140 | |
142 | staticParams.GlobalConfig & CFG_HEADING_HOLD ? 0 : dynamicParams.GyroI, |
141 | void setNormalFlightParameters(void) { |
143 | dynamicParams.GyroP + 10, |
142 | setFlightParameters(dynamicParams.IFactor + 1, dynamicParams.GyroP + 10, |
Line 144... | Line -... | ||
144 | dynamicParams.UserParams[6] |
- | |
145 | ); |
143 | staticParams.GlobalConfig & CFG_HEADING_HOLD ? 0 : dynamicParams.GyroI, |
146 | } |
144 | dynamicParams.GyroP + 10, dynamicParams.UserParams[6]); |
147 | 145 | } |
|
148 | void setStableFlightParameters(void) { |
146 | |
283 | 283 | ||
284 | /************************************************************************/ |
284 | /************************************************************************/ |
285 | /* Compass is currently not supported. */ |
285 | /* Compass is currently not supported. */ |
286 | /************************************************************************/ |
286 | /************************************************************************/ |
287 | if(staticParams.GlobalConfig & (CFG_COMPASS_ACTIVE|CFG_GPS_ACTIVE)) { |
287 | if (staticParams.GlobalConfig & (CFG_COMPASS_ACTIVE | CFG_GPS_ACTIVE)) { |
288 | updateCompass(); |
288 | updateCompass(); |
289 | } |
289 | } |
290 | 290 | ||
291 | #if defined (USE_NAVICTRL) |
291 | #if defined (USE_NAVICTRL) |
292 | /************************************************************************/ |
292 | /************************************************************************/ |
293 | /* GPS is currently not supported. */ |
293 | /* GPS is currently not supported. */ |
294 | /************************************************************************/ |
294 | /************************************************************************/ |
295 | if(staticParams.GlobalConfig & CFG_GPS_ACTIVE) { |
295 | if(staticParams.GlobalConfig & CFG_GPS_ACTIVE) { |
296 | GPS_Main(); |
296 | GPS_Main(); |
297 | MKFlags &= ~(MKFLAG_CALIBRATE | MKFLAG_START); |
297 | MKFlags &= ~(MKFLAG_CALIBRATE | MKFLAG_START); |
298 | } else { |
298 | } else { |
Line 299... | Line 299... | ||
299 | // GPSStickPitch = 0; |
299 | // GPSStickPitch = 0; |
300 | // GPSStickRoll = 0; |
300 | // GPSStickRoll = 0; |
301 | } |
301 | } |
302 | #endif |
302 | #endif |
303 | // end part 1: 750-800 usec. |
303 | // end part 1: 750-800 usec. |
304 | // start part 3: 350 - 400 usec. |
304 | // start part 3: 350 - 400 usec. |
305 | #define SENSOR_LIMIT (4096 * 4) |
305 | #define SENSOR_LIMIT (4096 * 4) |
306 | /************************************************************************/ |
306 | /************************************************************************/ |
307 | 307 | ||
308 | /* Calculate control feedback from angle (gyro integral) */ |
308 | /* Calculate control feedback from angle (gyro integral) */ |
309 | /* and angular velocity (gyro signal) */ |
309 | /* and angular velocity (gyro signal) */ |
310 | /************************************************************************/ |
310 | /************************************************************************/ |
311 | // The P-part is the P of the PID controller. That's the angle integrals (not rates). |
311 | // The P-part is the P of the PID controller. That's the angle integrals (not rates). |
312 | for (axis=PITCH; axis<=ROLL; axis++) { |
312 | for (axis = PITCH; axis <= ROLL; axis++) { |
313 | if(looping & ((1<<4)<<axis)) { |
313 | if (looping & ((1 << 4) << axis)) { |
314 | PPart[axis] = 0; |
314 | PPart[axis] = 0; |
315 | } else { // TODO: Where do the 44000 come from??? |
315 | } else { // TODO: Where do the 44000 come from??? |
- | 316 | PPart[axis] = angle[axis] * gyroIFactor / (44000 / CONTROL_SCALING); // P-Part - Proportional to Integral |
|
316 | PPart[axis] = angle[axis] * gyroIFactor / (44000 / CONTROL_SCALING); // P-Part - Proportional to Integral |
317 | } |
317 | } |
318 | |
318 | 319 | /* |
|
319 | /* |
320 | * Now blend in the D-part - proportional to the Differential of the integral = the rate. |
320 | * Now blend in the D-part - proportional to the Differential of the integral = the rate. |
321 | * Read this as: PDPart = PPart + rate_PID * pfactor * CONTROL_SCALING |
321 | * Read this as: PDPart = PPart + rate_PID * pfactor * CONTROL_SCALING |
- | |
322 | * where pfactor is in [0..1]. |
322 | * where pfactor is in [0..1]. |
323 | */ |
323 | */ |
- | 324 | PDPart[axis] = PPart[axis] + (int32_t) ((int32_t) rate_PID[axis] |
|
324 | PDPart[axis] = PPart[axis] + (int32_t)((int32_t)rate_PID[axis] * gyroPFactor / (256L / CONTROL_SCALING)) |
325 | * gyroPFactor / (256L / CONTROL_SCALING)) + (differential[axis] |
325 | + (differential[axis] * (int16_t)dynamicParams.GyroD) / 16; |
326 | * (int16_t) dynamicParams.GyroD) / 16; |
326 | 327 | ||
327 | CHECK_MIN_MAX(PDPart[axis], -SENSOR_LIMIT, SENSOR_LIMIT); |
328 | CHECK_MIN_MAX(PDPart[axis], -SENSOR_LIMIT, SENSOR_LIMIT); |
328 | } |
329 | } |
329 | 330 | ||
330 | PDPartYaw = |
331 | PDPartYaw = (int32_t) (yawRate * 2 * (int32_t) yawPFactor) / (256L |
331 | (int32_t)(yawRate * 2 * (int32_t)yawPFactor) / (256L / CONTROL_SCALING) |
332 | / CONTROL_SCALING) + (int32_t) (yawAngleDiff * yawIFactor) / (2 * (44000 |
332 | + (int32_t)(yawAngleDiff * yawIFactor) / (2 * (44000 / CONTROL_SCALING)); |
333 | / CONTROL_SCALING)); |
333 | 334 | ||
334 | // limit control feedback |
335 | // limit control feedback |
335 | CHECK_MIN_MAX(PDPartYaw, -SENSOR_LIMIT, SENSOR_LIMIT); |
336 | CHECK_MIN_MAX(PDPartYaw, -SENSOR_LIMIT, SENSOR_LIMIT); |
336 | 337 | ||
337 | /* |
338 | /* |
338 | * Compose throttle term. |
339 | * Compose throttle term. |
339 | * If a Bl-Ctrl is missing, prevent takeoff. |
340 | * If a Bl-Ctrl is missing, prevent takeoff. |
340 | */ |
341 | */ |
341 | if(missingMotor) { |
342 | if (missingMotor) { |
342 | // if we are in the lift off condition. Hmmmmmm when is throttleTerm == 0 anyway??? |
343 | // if we are in the lift off condition. Hmmmmmm when is throttleTerm == 0 anyway??? |
343 | if(isFlying > 1 && isFlying < 50 && throttleTerm > 0) |
344 | if (isFlying > 1 && isFlying < 50 && throttleTerm > 0) |
344 | isFlying = 1; // keep within lift off condition |
345 | isFlying = 1; // keep within lift off condition |
345 | throttleTerm = staticParams.MinThrottle; // reduce gas to min to avoid lift of |
346 | throttleTerm = staticParams.MinThrottle; // reduce gas to min to avoid lift of |
346 | } |
347 | } |
347 | 348 | ||
348 | // Scale up to higher resolution. Hmm why is it not (from controlMixer and down) scaled already? |
349 | // Scale up to higher resolution. Hmm why is it not (from controlMixer and down) scaled already? |
349 | throttleTerm *= CONTROL_SCALING; |
350 | throttleTerm *= CONTROL_SCALING; |
453 | DebugOut.Analog[23] = (yawRate * 2 * (int32_t)yawPFactor) / (256L / CONTROL_SCALING); |
454 | DebugOut.Analog[23] = (yawRate * 2 * (int32_t)yawPFactor) / (256L / CONTROL_SCALING); |