Rev 746 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 746 | Rev 750 | ||
---|---|---|---|
Line 64... | Line 64... | ||
64 | #include "uart.h" |
64 | #include "uart.h" |
65 | #include "rc.h" |
65 | #include "rc.h" |
66 | #include "twimaster.h" |
66 | #include "twimaster.h" |
67 | #include "mm3.h" |
67 | #include "mm3.h" |
Line 68... | Line 68... | ||
68 | 68 | ||
69 | volatile unsigned int I2CTimeout = 100; |
69 | volatile uint16_t I2CTimeout = 100; |
70 | // gyro readings |
70 | // gyro readings |
71 | volatile int16_t Reading_GyroPitch, Reading_GyroRoll, Reading_GyroYaw; |
71 | volatile int16_t Reading_GyroPitch, Reading_GyroRoll, Reading_GyroYaw; |
72 | // gyro neutral readings |
72 | // gyro neutral readings |
73 | volatile int16_t AdNeutralPitch = 0, AdNeutralRoll = 0, AdNeutralYaw = 0; |
73 | volatile int16_t AdNeutralPitch = 0, AdNeutralRoll = 0, AdNeutralYaw = 0; |
Line 88... | Line 88... | ||
88 | volatile int32_t Reading_IntegralGyroYaw = 0, Reading_IntegralGyroYaw2 = 0; |
88 | volatile int32_t Reading_IntegralGyroYaw = 0, Reading_IntegralGyroYaw2 = 0; |
89 | volatile int32_t MeanIntegralPitch; |
89 | volatile int32_t MeanIntegralPitch; |
90 | volatile int32_t MeanIntegralRoll; |
90 | volatile int32_t MeanIntegralRoll; |
Line 91... | Line 91... | ||
91 | 91 | ||
92 | // attitude acceleration integrals |
92 | // attitude acceleration integrals |
93 | volatile int32_t IntegralAccPitch = 0, IntegralAccRoll = 0, IntegralAccZ = 0; |
93 | volatile int32_t IntegralAccPitch = 0, IntegralAccRoll = 0; |
Line 94... | Line 94... | ||
94 | volatile int32_t Reading_Integral_Top = 0; |
94 | volatile int32_t Reading_Integral_Top = 0; |
95 | 95 | ||
96 | // compass course |
96 | // compass course |
Line 175... | Line 175... | ||
175 | AdNeutralPitch = AdValueGyrPitch; |
175 | AdNeutralPitch = AdValueGyrPitch; |
176 | AdNeutralRoll = AdValueGyrRoll; |
176 | AdNeutralRoll = AdValueGyrRoll; |
177 | AdNeutralYaw = AdValueGyrYaw; |
177 | AdNeutralYaw = AdValueGyrYaw; |
178 | StartNeutralRoll = AdNeutralRoll; |
178 | StartNeutralRoll = AdNeutralRoll; |
179 | StartNeutralPitch = AdNeutralPitch; |
179 | StartNeutralPitch = AdNeutralPitch; |
180 | if(GetParamByte(PID_ACC_PITCH) > 4) |
180 | if(GetParamWord(PID_ACC_PITCH) > 1023) |
181 | { |
181 | { |
182 | NeutralAccY = abs(Mean_AccRoll) / ACC_AMPLIFY; |
182 | NeutralAccY = abs(Mean_AccRoll) / ACC_AMPLIFY; |
183 | NeutralAccX = abs(Mean_AccPitch) / ACC_AMPLIFY; |
183 | NeutralAccX = abs(Mean_AccPitch) / ACC_AMPLIFY; |
184 | NeutralAccZ = Current_AccZ; |
184 | NeutralAccZ = Current_AccZ; |
185 | } |
185 | } |
Line 230... | Line 230... | ||
230 | Mean_AccTop = ((int32_t)Mean_AccTop * 1 + ((int32_t)AdValueAccTop)) / 2L; |
230 | Mean_AccTop = ((int32_t)Mean_AccTop * 1 + ((int32_t)AdValueAccTop)) / 2L; |
Line 231... | Line 231... | ||
231 | 231 | ||
232 | // sum sensor readings for later averaging |
232 | // sum sensor readings for later averaging |
233 | IntegralAccPitch += ACC_AMPLIFY * AdValueAccPitch; |
233 | IntegralAccPitch += ACC_AMPLIFY * AdValueAccPitch; |
234 | IntegralAccRoll += ACC_AMPLIFY * AdValueAccRoll; |
- | |
Line 235... | Line 234... | ||
235 | IntegralAccZ += Current_AccZ - NeutralAccZ; |
234 | IntegralAccRoll += ACC_AMPLIFY * AdValueAccRoll; |
236 | 235 | ||
237 | // Yaw |
236 | // Yaw |
238 | // calculate yaw gyro intergral (~ to rotation angle) |
237 | // calculate yaw gyro intergral (~ to rotation angle) |
Line 348... | Line 347... | ||
348 | Reading_GyroYaw = AdValueGyrYaw; |
347 | Reading_GyroYaw = AdValueGyrYaw; |
Line 349... | Line 348... | ||
349 | 348 | ||
350 | Mean_AccPitch = ACC_AMPLIFY * (int32_t)AdValueAccPitch; |
349 | Mean_AccPitch = ACC_AMPLIFY * (int32_t)AdValueAccPitch; |
351 | Mean_AccRoll = ACC_AMPLIFY * (int32_t)AdValueAccRoll; |
350 | Mean_AccRoll = ACC_AMPLIFY * (int32_t)AdValueAccRoll; |
- | 351 | Mean_AccTop = (int32_t)AdValueAccTop; |
|
352 | Mean_AccTop = (int32_t)AdValueAccTop; |
352 | // start ADC (enables internal trigger so that the ISR in analog.c |
353 | // start ADC |
353 | // updates the readings once) |
354 | ADC_Enable(); |
354 | ADC_Enable(); |
355 | //update poti values by rc-signals (why not +127?) |
355 | //update poti values by rc-signals |
356 | if(Poti1 < PPM_in[ParamSet.ChannelAssignment[CH_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[ParamSet.ChannelAssignment[CH_POTI1]] + 110 && Poti1) Poti1--; |
356 | if(Poti1 < PPM_in[ParamSet.ChannelAssignment[CH_POTI1]] + 110) Poti1++; else if(Poti1 > PPM_in[ParamSet.ChannelAssignment[CH_POTI1]] + 110 && Poti1) Poti1--; |
357 | if(Poti2 < PPM_in[ParamSet.ChannelAssignment[CH_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[ParamSet.ChannelAssignment[CH_POTI2]] + 110 && Poti2) Poti2--; |
357 | if(Poti2 < PPM_in[ParamSet.ChannelAssignment[CH_POTI2]] + 110) Poti2++; else if(Poti2 > PPM_in[ParamSet.ChannelAssignment[CH_POTI2]] + 110 && Poti2) Poti2--; |
358 | if(Poti3 < PPM_in[ParamSet.ChannelAssignment[CH_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[ParamSet.ChannelAssignment[CH_POTI3]] + 110 && Poti3) Poti3--; |
358 | if(Poti3 < PPM_in[ParamSet.ChannelAssignment[CH_POTI3]] + 110) Poti3++; else if(Poti3 > PPM_in[ParamSet.ChannelAssignment[CH_POTI3]] + 110 && Poti3) Poti3--; |
359 | if(Poti4 < PPM_in[ParamSet.ChannelAssignment[CH_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[ParamSet.ChannelAssignment[CH_POTI4]] + 110 && Poti4) Poti4--; |
359 | if(Poti4 < PPM_in[ParamSet.ChannelAssignment[CH_POTI4]] + 110) Poti4++; else if(Poti4 > PPM_in[ParamSet.ChannelAssignment[CH_POTI4]] + 110 && Poti4) Poti4--; |
Line 362... | Line 362... | ||
362 | if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
362 | if(Poti2 < 0) Poti2 = 0; else if(Poti2 > 255) Poti2 = 255; |
363 | if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
363 | if(Poti3 < 0) Poti3 = 0; else if(Poti3 > 255) Poti3 = 255; |
364 | if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
364 | if(Poti4 < 0) Poti4 = 0; else if(Poti4 > 255) Poti4 = 255; |
Line 365... | Line 365... | ||
365 | 365 | ||
366 | TurnOver180Pitch = (int32_t) ParamSet.AngleTurnOverPitch * 2500L; |
366 | TurnOver180Pitch = (int32_t) ParamSet.AngleTurnOverPitch * 2500L; |
367 | TurnOver180Roll = (int32_t) ParamSet.AngleTurnOverRoll * 2500L; |
367 | TurnOver180Roll = (int32_t) ParamSet.AngleTurnOverRoll * 2500L; |
Line 368... | Line 368... | ||
368 | } |
368 | } |
369 | 369 | ||
370 | /************************************************************************/ |
370 | /************************************************************************/ |
Line 377... | Line 377... | ||
377 | Motor_Rear = 0; |
377 | Motor_Rear = 0; |
378 | Motor_Front = 0; |
378 | Motor_Front = 0; |
379 | Motor_Right = 0; |
379 | Motor_Right = 0; |
380 | Motor_Left = 0; |
380 | Motor_Left = 0; |
381 | if(MotorTest[0]) Motor_Front = MotorTest[0]; |
381 | if(MotorTest[0]) Motor_Front = MotorTest[0]; |
382 | if(MotorTest[1]) Motor_Rear = MotorTest[1]; |
382 | if(MotorTest[1]) Motor_Rear = MotorTest[1]; |
383 | if(MotorTest[2]) Motor_Left = MotorTest[2]; |
383 | if(MotorTest[2]) Motor_Left = MotorTest[2]; |
384 | if(MotorTest[3]) Motor_Right = MotorTest[3]; |
384 | if(MotorTest[3]) Motor_Right = MotorTest[3]; |
385 | } |
385 | } |
Line 386... | Line 386... | ||
386 | 386 | ||
387 | //DebugOut.Analog[12] = Motor_Front; |
387 | //DebugOut.Analog[12] = Motor_Front; |
Line 682... | Line 682... | ||
682 | StickPitch += ExternStickPitch / 8; |
682 | StickPitch += ExternStickPitch / 8; |
683 | StickRoll += ExternStickRoll / 8; |
683 | StickRoll += ExternStickRoll / 8; |
684 | StickYaw += ExternStickYaw; |
684 | StickYaw += ExternStickYaw; |
Line 685... | Line 685... | ||
685 | 685 | ||
686 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
686 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
687 | //+ Analoge Control via serial communication |
687 | //+ Analog control via serial communication |
Line 688... | Line 688... | ||
688 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
688 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
689 | 689 | ||
690 | if(ExternControl.Config & 0x01 && FCParam.UserParam1 > 128) |
690 | if(ExternControl.Config & 0x01 && FCParam.UserParam1 > 128) |
Line 781... | Line 781... | ||
781 | // reset averaging for acc and gyro integral as well as gyro integral acc correction |
781 | // reset averaging for acc and gyro integral as well as gyro integral acc correction |
782 | MeasurementCounter = 0; |
782 | MeasurementCounter = 0; |
Line 783... | Line 783... | ||
783 | 783 | ||
784 | IntegralAccPitch = 0; |
784 | IntegralAccPitch = 0; |
785 | IntegralAccRoll = 0; |
- | |
Line 786... | Line 785... | ||
786 | IntegralAccZ = 0; |
785 | IntegralAccRoll = 0; |
787 | 786 | ||
Line 788... | Line 787... | ||
788 | MeanIntegralPitch = 0; |
787 | MeanIntegralPitch = 0; |
Line 803... | Line 802... | ||
803 | tmp_long = (int32_t)(IntegralPitch / ParamSet.GyroAccFaktor - (int32_t)Mean_AccPitch); |
802 | tmp_long = (int32_t)(IntegralPitch / ParamSet.GyroAccFaktor - (int32_t)Mean_AccPitch); |
804 | tmp_long /= 16; |
803 | tmp_long /= 16; |
805 | tmp_long2 = (int32_t)(IntegralRoll / ParamSet.GyroAccFaktor - (int32_t)Mean_AccRoll); |
804 | tmp_long2 = (int32_t)(IntegralRoll / ParamSet.GyroAccFaktor - (int32_t)Mean_AccRoll); |
806 | tmp_long2 /= 16; |
805 | tmp_long2 /= 16; |
Line 807... | Line 806... | ||
807 | 806 | ||
808 | if((MaxStickPitch > 15) || (MaxStickRoll > 15)) |
807 | if((MaxStickPitch > 15) || (MaxStickRoll > 15)) // reduce effect during stick commands |
809 | { |
808 | { |
810 | tmp_long /= 3; |
809 | tmp_long /= 3; |
811 | tmp_long2 /= 3; |
810 | tmp_long2 /= 3; |
812 | } |
811 | } |
813 | if(MaxStickYaw > 25) |
812 | if(MaxStickYaw > 25) // reduce further is yaw stick is active |
814 | { |
813 | { |
815 | tmp_long /= 3; |
814 | tmp_long /= 3; |
816 | tmp_long2 /= 3; |
815 | tmp_long2 /= 3; |
Line 817... | Line 816... | ||
817 | } |
816 | } |
818 | 817 | ||
819 | #define BALANCE 32 |
818 | #define BALANCE 32 |
820 | // limit correction |
819 | // limit correction effect |
821 | if(tmp_long > BALANCE) tmp_long = BALANCE; |
820 | if(tmp_long > BALANCE) tmp_long = BALANCE; |
822 | if(tmp_long < -BALANCE) tmp_long =-BALANCE; |
821 | if(tmp_long < -BALANCE) tmp_long =-BALANCE; |
823 | if(tmp_long2 > BALANCE) tmp_long2 = BALANCE; |
822 | if(tmp_long2 > BALANCE) tmp_long2 = BALANCE; |
Line 828... | Line 827... | ||
828 | } |
827 | } |
829 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
828 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
830 | // MeasurementCounter is incremented in the isr of analog.c |
829 | // MeasurementCounter is incremented in the isr of analog.c |
831 | if(MeasurementCounter >= BALANCE_NUMBER) // averaging number has reached |
830 | if(MeasurementCounter >= BALANCE_NUMBER) // averaging number has reached |
832 | { |
831 | { |
833 | static int cnt = 0; |
832 | static int16_t cnt = 0; |
834 | static char last_n_p, last_n_n, last_r_p, last_r_n; |
833 | static int8_t last_n_p, last_n_n, last_r_p, last_r_n; |
835 | static long MeanIntegralPitch_old, MeanIntegralRoll_old; |
834 | static int32_t MeanIntegralPitch_old, MeanIntegralRoll_old; |
Line 836... | Line 835... | ||
836 | 835 | ||
837 | // if not lopping in any direction (this should be alwais the case, |
836 | // if not lopping in any direction (this should be alwais the case, |
838 | // because the Measurement counter is reset to 0 if looping in any direction is active.) |
837 | // because the Measurement counter is reset to 0 if looping in any direction is active.) |
839 | if(!Looping_Pitch && !Looping_Roll) |
838 | if(!Looping_Pitch && !Looping_Roll) |
Line 843... | Line 842... | ||
843 | MeanIntegralRoll /= BALANCE_NUMBER; |
842 | MeanIntegralRoll /= BALANCE_NUMBER; |
Line 844... | Line 843... | ||
844 | 843 | ||
845 | // Calculate mean of the acceleration values |
844 | // Calculate mean of the acceleration values |
846 | IntegralAccPitch = (ParamSet.GyroAccFaktor * IntegralAccPitch) / BALANCE_NUMBER; |
845 | IntegralAccPitch = (ParamSet.GyroAccFaktor * IntegralAccPitch) / BALANCE_NUMBER; |
847 | IntegralAccRoll = (ParamSet.GyroAccFaktor * IntegralAccRoll ) / BALANCE_NUMBER; |
- | |
Line 848... | Line 846... | ||
848 | IntegralAccZ = IntegralAccZ / BALANCE_NUMBER; |
846 | IntegralAccRoll = (ParamSet.GyroAccFaktor * IntegralAccRoll ) / BALANCE_NUMBER; |
849 | 847 | ||
850 | // Pitch ++++++++++++++++++++++++++++++++++++++++++++++++ |
848 | // Pitch ++++++++++++++++++++++++++++++++++++++++++++++++ |
851 | // Calculate deviation of the averaged gyro integral and the averaged acceleration integral |
849 | // Calculate deviation of the averaged gyro integral and the averaged acceleration integral |
Line 981... | Line 979... | ||
981 | MeanIntegralRoll_old = MeanIntegralRoll; |
979 | MeanIntegralRoll_old = MeanIntegralRoll; |
982 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
980 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
983 | // reset variables used for averaging |
981 | // reset variables used for averaging |
984 | IntegralAccPitch = 0; |
982 | IntegralAccPitch = 0; |
985 | IntegralAccRoll = 0; |
983 | IntegralAccRoll = 0; |
986 | IntegralAccZ = 0; |
- | |
987 | MeanIntegralPitch = 0; |
984 | MeanIntegralPitch = 0; |
988 | MeanIntegralRoll = 0; |
985 | MeanIntegralRoll = 0; |
989 | MeasurementCounter = 0; |
986 | MeasurementCounter = 0; |
990 | } // end of averaging |
987 | } // end of averaging |
Line 1037... | Line 1034... | ||
1037 | { |
1034 | { |
1038 | CompassCourse = CompassHeading; |
1035 | CompassCourse = CompassHeading; |
1039 | StoreNewCompassCourse = 0; |
1036 | StoreNewCompassCourse = 0; |
1040 | } |
1037 | } |
1041 | w = (w * FCParam.CompassYawEffect) / 64; // scale to parameter |
1038 | w = (w * FCParam.CompassYawEffect) / 64; // scale to parameter |
1042 | w = FCParam.CompassYawEffect - w; // reduce commpass effect with increasing declination |
1039 | w = FCParam.CompassYawEffect - w; // reduce compass effect with increasing declination |
1043 | if(w > 0) // if there is any compass effect (avoid negative compass feedback) |
1040 | if(w > 0) // if there is any compass effect (avoid negative compass feedback) |
1044 | { |
1041 | { |
1045 | Reading_IntegralGyroYaw += (CompassOffCourse * w) / 32; |
1042 | Reading_IntegralGyroYaw += (CompassOffCourse * w) / 32; |
1046 | } |
1043 | } |
1047 | } |
1044 | } |
Line 1127... | Line 1124... | ||
1127 | 1124 | ||
1128 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1125 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1129 | // Hight Control |
1126 | // Hight Control |
1130 | // The higth control algorithm reduces the thrust but does not increase the thrust. |
1127 | // The higth control algorithm reduces the thrust but does not increase the thrust. |
1131 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1128 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1132 | // If hight control is activated and no emergency landing is activre |
1129 | // If hight control is activated and no emergency landing is active |
1133 | if((ParamSet.GlobalConfig & CFG_HEIGHT_CONTROL) && (!EmergencyLanding) ) |
1130 | if((ParamSet.GlobalConfig & CFG_HEIGHT_CONTROL) && (!EmergencyLanding) ) |
1134 | { |
1131 | { |
1135 | int tmp_int; |
1132 | int tmp_int; |
1136 | // if hight control is activated by an rc channel |
1133 | // if hight control is activated by an rc channel |