Rev 930 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 930 | Rev 964 | ||
---|---|---|---|
Line 85... | Line 85... | ||
85 | long ErsatzKompass; |
85 | long ErsatzKompass; |
86 | int ErsatzKompassInGrad; // Kompasswert in Grad |
86 | int ErsatzKompassInGrad; // Kompasswert in Grad |
87 | int GierGyroFehler = 0; |
87 | int GierGyroFehler = 0; |
88 | float GyroFaktor; |
88 | float GyroFaktor; |
89 | float IntegralFaktor; |
89 | float IntegralFaktor; |
- | 90 | // float IntegralFaktor_Gier; // MartinR |
|
90 | volatile int DiffNick,DiffRoll; |
91 | volatile int DiffNick,DiffRoll; |
91 | int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
92 | int Poti1 = 0, Poti2 = 0, Poti3 = 0, Poti4 = 0; |
92 | volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
93 | volatile unsigned char Motor_Vorne,Motor_Hinten,Motor_Rechts,Motor_Links, Count; |
93 | volatile unsigned char SenderOkay = 0; |
94 | volatile unsigned char SenderOkay = 0; |
94 | int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
95 | int StickNick = 0,StickRoll = 0,StickGier = 0,StickGas = 0; |
Line 133... | Line 134... | ||
133 | unsigned char Parameter_NaviGpsD; |
134 | unsigned char Parameter_NaviGpsD; |
134 | unsigned char Parameter_NaviGpsACC; |
135 | unsigned char Parameter_NaviGpsACC; |
135 | unsigned char Parameter_ExternalControl; |
136 | unsigned char Parameter_ExternalControl; |
136 | struct mk_param_struct EE_Parameter; |
137 | struct mk_param_struct EE_Parameter; |
137 | signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
138 | signed int ExternStickNick = 0,ExternStickRoll = 0,ExternStickGier = 0, ExternHoehenValue = -20; |
138 | int MaxStickNick = 0,MaxStickRoll = 0; |
139 | int MaxStickNick = 0,MaxStickRoll = 0,stick_nick_neutral = 0,stick_roll_neutral = 0; // MartinR: stick_.._neutral hinzugefügt |
139 | unsigned int modell_fliegt = 0; |
140 | unsigned int modell_fliegt = 0; |
140 | unsigned char MikroKopterFlags = 0; |
141 | unsigned char MikroKopterFlags = 0; |
Line 141... | Line 142... | ||
141 | 142 | ||
142 | void Piep(unsigned char Anzahl) |
143 | void Piep(unsigned char Anzahl) |
Line 224... | Line 225... | ||
224 | MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
225 | MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
225 | MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
226 | MesswertGierBias = (signed int) AdNeutralGierBias - AdWertGier; |
226 | MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
227 | MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
227 | MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
228 | MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
Line 228... | Line 229... | ||
228 | 229 | ||
229 | //DebugOut.Analog[26] = MesswertNick; |
230 | // DebugOut.Analog[26] = MesswertNick; |
Line 230... | Line 231... | ||
230 | DebugOut.Analog[28] = MesswertRoll; |
231 | // DebugOut.Analog[28] = MesswertRoll; |
231 | 232 | ||
232 | // Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
233 | // Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
233 | Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
234 | Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
Line 244... | Line 245... | ||
244 | Mess_Integral_Gier += MesswertGier; |
245 | Mess_Integral_Gier += MesswertGier; |
245 | // Mess_Integral_Gier2 += MesswertGier; |
246 | // Mess_Integral_Gier2 += MesswertGier; |
246 | if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
247 | if(ErsatzKompass >= (360L * GIER_GRAD_FAKTOR)) ErsatzKompass -= 360L * GIER_GRAD_FAKTOR; // 360° Umschlag |
247 | if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
248 | if(ErsatzKompass < 0) ErsatzKompass += 360L * GIER_GRAD_FAKTOR; |
248 | // Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
249 | // Kopplungsanteil +++++++++++++++++++++++++++++++++++++ |
- | 250 | if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 50)) IntegralFaktor = 0; // Doppelt ?? MartinR |
|
- | 251 | ||
249 | if(!Looping_Nick && !Looping_Roll && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
252 | if(!Looping_Nick && !Looping_Roll && IntegralFaktor && (EE_Parameter.GlobalConfig & CFG_ACHSENKOPPLUNG_AKTIV)) |
250 | { |
253 | { |
251 | tmpl = (MesswertGierBias * Mess_IntegralNick) / 2048L; |
254 | tmpl = (MesswertGierBias * Mess_IntegralNick) / 2048L; |
252 | tmpl *= Parameter_AchsKopplung1; //125 |
255 | tmpl *= Parameter_AchsKopplung1; //125 |
253 | tmpl /= 4096L; |
256 | tmpl /= 4096L; |
254 | tmpl2 = (MesswertGierBias * Mess_IntegralRoll) / 2048L; |
257 | tmpl2 = (MesswertGierBias * Mess_IntegralRoll) / 2048L; |
Line 346... | Line 349... | ||
346 | //############################################################################ |
349 | //############################################################################ |
347 | { |
350 | { |
348 | if(PlatinenVersion >= 13) SucheGyroOffset(); |
351 | if(PlatinenVersion >= 13) SucheGyroOffset(); |
349 | // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
352 | // ADC auschalten, damit die Werte sich nicht während der Berechnung ändern |
350 | ANALOG_OFF; |
353 | ANALOG_OFF; |
351 | MesswertNick = AdWertNick; |
354 | // MesswertNick = AdWertNick; // original |
- | 355 | //MesswertNick = (signed int) AdWertNick - AdNeutralNick; // MartinR: weshhalb nicht so?? |
|
352 | MesswertRoll = AdWertRoll; |
356 | //MesswertRoll = AdWertRoll; // original |
- | 357 | //MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; // MartinR: weshhalb nicht so?? |
|
353 | MesswertGier = AdWertGier; |
358 | //MesswertGier = AdWertGier; // original |
- | 359 | //MesswertGier = (signed int) AdNeutralGier - AdWertGier; // MartinR: weshhalb nicht so?? |
|
- | 360 | ||
354 | Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
361 | Mittelwert_AccNick = ACC_AMPLIFY * (long)AdWertAccNick; |
355 | Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
362 | Mittelwert_AccRoll = ACC_AMPLIFY * (long)AdWertAccRoll; |
356 | Mittelwert_AccHoch = (long)AdWertAccHoch; |
363 | Mittelwert_AccHoch = (long)AdWertAccHoch; |
357 | // ADC einschalten |
364 | // ADC einschalten |
358 | ANALOG_ON; |
365 | ANALOG_ON; |
Line 437... | Line 444... | ||
437 | CHK_POTI(Parameter_NaviGpsI,EE_Parameter.NaviGpsI,0,255); |
444 | CHK_POTI(Parameter_NaviGpsI,EE_Parameter.NaviGpsI,0,255); |
438 | CHK_POTI(Parameter_NaviGpsD,EE_Parameter.NaviGpsD,0,255); |
445 | CHK_POTI(Parameter_NaviGpsD,EE_Parameter.NaviGpsD,0,255); |
439 | CHK_POTI(Parameter_NaviGpsACC,EE_Parameter.NaviGpsACC,0,255); |
446 | CHK_POTI(Parameter_NaviGpsACC,EE_Parameter.NaviGpsACC,0,255); |
440 | CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
447 | CHK_POTI(Parameter_ExternalControl,EE_Parameter.ExternalControl,0,255); |
Line 441... | Line 448... | ||
441 | 448 | ||
- | 449 | Ki = (float) Parameter_I_Faktor * 0.0001; |
|
- | 450 | ||
- | 451 | if(!IntegralFaktor) Parameter_NaviGpsModeControl= 100; // MartinR: wenn HH dann GPS auf free- Mode |
|
442 | Ki = (float) Parameter_I_Faktor * 0.0001; |
452 | |
443 | MAX_GAS = EE_Parameter.Gas_Max; |
453 | MAX_GAS = EE_Parameter.Gas_Max; |
444 | MIN_GAS = EE_Parameter.Gas_Min; |
454 | MIN_GAS = EE_Parameter.Gas_Min; |
Line 644... | Line 654... | ||
644 | // neue Werte von der Funke |
654 | // neue Werte von der Funke |
645 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
655 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
646 | if(!NewPpmData-- || Notlandung) |
656 | if(!NewPpmData-- || Notlandung) |
647 | { |
657 | { |
648 | int tmp_int; |
658 | int tmp_int; |
649 | static int stick_nick,stick_roll; |
659 | static int stick_nick,stick_roll; // .._neutral hinzugefügt aber Deklaration siehe oben MartinR |
650 | ParameterZuordnung(); |
660 | ParameterZuordnung(); |
- | 661 | ||
- | 662 | ||
- | 663 | if(Parameter_UserParam1 > 50) // MartinR: zweiter Stick_P Wert nur, wenn HH über Schalter aktiv ist |
|
- | 664 | { |
|
- | 665 | stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * Parameter_UserParam2 - stick_nick_neutral) / 4; |
|
- | 666 | stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * Parameter_UserParam2 - stick_roll_neutral) / 4 ; |
|
- | 667 | } |
|
- | 668 | ||
- | 669 | else |
|
- | 670 | { |
|
651 | stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
671 | stick_nick = (stick_nick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
- | 672 | stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
|
- | 673 | } |
|
- | 674 | ||
- | 675 | if(IntegralFaktor) |
|
- | 676 | { |
|
- | 677 | stick_nick_neutral = stick_nick; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
|
- | 678 | stick_roll_neutral = stick_roll; // beim Umschalten auf HH wird derletzte Stickwert als Neutralposition verwendet, MartinR |
|
- | 679 | // stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: deaktiviert |
|
- | 680 | // stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: deaktiviert |
|
- | 681 | ||
- | 682 | StickNick = stick_nick - (GPS_Nick + GPS_Nick2); // MartinR: GPS nur im ACC-Mode wirksam |
|
- | 683 | StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); // MartinR: GPS nur im ACC-Mode wirksam |
|
- | 684 | } |
|
- | 685 | else // wenn HH , MartinR |
|
- | 686 | { |
|
- | 687 | // stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; // MartinR: deaktiviert |
|
- | 688 | // stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; // MartinR: deaktiviert |
|
- | 689 | StickNick = stick_nick; // MartinR: GPS nur im ACC-Mode wirksam |
|
- | 690 | StickRoll = stick_roll; // MartinR: GPS nur im ACC-Mode wirksam |
|
- | 691 | } |
|
- | 692 | ||
652 | stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
693 | stick_nick += PPM_diff[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_D; |
653 | StickNick = stick_nick - (GPS_Nick + GPS_Nick2); |
- | |
654 | // StickNick = (StickNick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
- | |
Line 655... | Line 694... | ||
655 | 694 | ||
- | 695 | // StickNick = (StickNick * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_NICK]] * EE_Parameter.Stick_P) / 4; |
|
656 | stick_roll = (stick_roll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
696 | |
657 | stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
- | |
Line 658... | Line 697... | ||
658 | StickRoll = stick_roll - (GPS_Roll + GPS_Roll2); |
697 | stick_roll += PPM_diff[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_D; |
Line 659... | Line 698... | ||
659 | 698 | ||
660 | // StickRoll = (StickRoll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
699 | // StickRoll = (StickRoll * 3 + PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]] * EE_Parameter.Stick_P) / 4; |
Line 665... | Line 704... | ||
665 | /* if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]) > MaxStickNick) |
704 | /* if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]) > MaxStickNick) |
666 | MaxStickNick = abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]); else MaxStickNick--; |
705 | MaxStickNick = abs(PPM_in[EE_Parameter.Kanalbelegung[K_NICK]]); else MaxStickNick--; |
667 | if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > MaxStickRoll) |
706 | if(abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]) > MaxStickRoll) |
668 | MaxStickRoll = abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); else MaxStickRoll--; |
707 | MaxStickRoll = abs(PPM_in[EE_Parameter.Kanalbelegung[K_ROLL]]); else MaxStickRoll--; |
669 | */ |
708 | */ |
670 | GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / (256.0/STICK_GAIN); |
- | |
671 | IntegralFaktor = ((float) Parameter_Gyro_I) / (44000 / STICK_GAIN); |
- | |
- | 709 | ||
Line 672... | Line 710... | ||
672 | 710 | ||
673 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
711 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
674 | //+ Digitale Steuerung per DubWise |
712 | //+ Digitale Steuerung per DubWise |
- | 713 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 714 | ||
- | 715 | // To Do: Umschaltung auf HH deaktivieren //MartinR |
|
675 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
716 | |
676 | #define KEY_VALUE (Parameter_ExternalControl * 4) //(Poti3 * 8) |
717 | #define KEY_VALUE (Parameter_ExternalControl * 4) //(Poti3 * 8) |
677 | if(DubWiseKeys[1]) beeptime = 10; |
718 | if(DubWiseKeys[1]) beeptime = 10; |
678 | if(DubWiseKeys[1] & DUB_KEY_UP) tmp_int = KEY_VALUE; else |
719 | if(DubWiseKeys[1] & DUB_KEY_UP) tmp_int = KEY_VALUE; else |
679 | if(DubWiseKeys[1] & DUB_KEY_DOWN) tmp_int = -KEY_VALUE; else tmp_int = 0; |
720 | if(DubWiseKeys[1] & DUB_KEY_DOWN) tmp_int = -KEY_VALUE; else tmp_int = 0; |
Line 691... | Line 732... | ||
691 | StickRoll += (STICK_GAIN * ExternStickRoll) / 8; |
732 | StickRoll += (STICK_GAIN * ExternStickRoll) / 8; |
692 | StickGier += STICK_GAIN * ExternStickGier; |
733 | StickGier += STICK_GAIN * ExternStickGier; |
693 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
734 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
694 | //+ Analoge Steuerung per Seriell |
735 | //+ Analoge Steuerung per Seriell |
695 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
736 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
- | 737 | ||
- | 738 | // To Do: Umschaltung auf HH deaktivieren //MartinR |
|
- | 739 | ||
696 | if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
740 | if(ExternControl.Config & 0x01 && Parameter_ExternalControl > 128) |
697 | { |
741 | { |
698 | StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
742 | StickNick += (int) ExternControl.Nick * (int) EE_Parameter.Stick_P; |
699 | StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
743 | StickRoll += (int) ExternControl.Roll * (int) EE_Parameter.Stick_P; |
700 | StickGier += ExternControl.Gier; |
744 | StickGier += ExternControl.Gier; |
701 | ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
745 | ExternHoehenValue = (int) ExternControl.Hight * (int)EE_Parameter.Hoehe_Verstaerkung; |
702 | if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
746 | if(ExternControl.Gas < StickGas) StickGas = ExternControl.Gas; |
703 | } |
747 | } |
704 | if(StickGas < 0) StickGas = 0; |
748 | if(StickGas < 0) StickGas = 0; |
- | 749 | ||
- | 750 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 751 | //+ Reglermodus // MartinR |
|
- | 752 | //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 753 | ||
- | 754 | GyroFaktor = ((float)Parameter_Gyro_P + 10.0) / (256.0/STICK_GAIN); |
|
- | 755 | IntegralFaktor = ((float) Parameter_Gyro_I) / (44000 / STICK_GAIN); |
|
- | 756 | //IntegralFaktor_Gier = ((float) Parameter_UserParam3) / (44000 / STICK_GAIN); // MartinR |
|
- | 757 | ||
- | 758 | // if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
|
- | 759 | if((EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) || (Parameter_UserParam1 > 50)) IntegralFaktor = 0; // Doppelt!? Doppel wieder aktiviert, da Impuls beim Umschalten. MartinR |
|
Line 705... | Line -... | ||
705 | - | ||
706 | if(EE_Parameter.GlobalConfig & CFG_HEADING_HOLD) IntegralFaktor = 0; |
760 | |
707 | if(GyroFaktor < 0) GyroFaktor = 0; |
761 | if(GyroFaktor < 0) GyroFaktor = 0; |
Line 708... | Line 762... | ||
708 | if(IntegralFaktor < 0) IntegralFaktor = 0; |
762 | if(IntegralFaktor < 0) IntegralFaktor = 0; |
709 | 763 | ||
Line 775... | Line 829... | ||
775 | StickGier = 0; |
829 | StickGier = 0; |
776 | StickNick = 0; |
830 | StickNick = 0; |
777 | StickRoll = 0; |
831 | StickRoll = 0; |
778 | GyroFaktor = (float) 100 / (256.0 / STICK_GAIN); |
832 | GyroFaktor = (float) 100 / (256.0 / STICK_GAIN); |
779 | IntegralFaktor = (float) 120 / (44000 / STICK_GAIN); |
833 | IntegralFaktor = (float) 120 / (44000 / STICK_GAIN); |
- | 834 | // IntegralFaktor_Gier= (float) 120 / (44000 / STICK_GAIN);// MartinR |
|
780 | Looping_Roll = 0; |
835 | Looping_Roll = 0; |
781 | Looping_Nick = 0; |
836 | Looping_Nick = 0; |
782 | } |
837 | } |
Line 790... | Line 845... | ||
790 | MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
845 | MittelIntegralNick += IntegralNick; // Für die Mittelwertbildung aufsummieren |
791 | MittelIntegralRoll += IntegralRoll; |
846 | MittelIntegralRoll += IntegralRoll; |
792 | MittelIntegralNick2 += IntegralNick2; |
847 | MittelIntegralNick2 += IntegralNick2; |
793 | MittelIntegralRoll2 += IntegralRoll2; |
848 | MittelIntegralRoll2 += IntegralRoll2; |
Line -... | Line 849... | ||
- | 849 | ||
794 | 850 | ||
795 | if(Looping_Nick || Looping_Roll) |
851 | if(Looping_Nick || Looping_Roll || !IntegralFaktor) |
796 | { |
852 | { |
797 | IntegralAccNick = 0; |
853 | IntegralAccNick = 0; |
798 | IntegralAccRoll = 0; |
854 | IntegralAccRoll = 0; |
799 | MittelIntegralNick = 0; |
855 | MittelIntegralNick = 0; |
800 | MittelIntegralRoll = 0; |
856 | MittelIntegralRoll = 0; |
801 | MittelIntegralNick2 = 0; |
857 | MittelIntegralNick2 = 0; |
- | 858 | MittelIntegralRoll2 = 0; |
|
- | 859 | ||
- | 860 | ||
- | 861 | IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 862 | IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 863 | Mess_IntegralNick = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 864 | Mess_IntegralRoll = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 865 | Mess_Integral_Gier = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 866 | Mess_Integral_Gier2 = 0; // MartinR: im HH-Modus alle unbenutzten Integratoren = 0 |
|
- | 867 | ||
802 | MittelIntegralRoll2 = 0; |
868 | |
803 | Mess_IntegralNick2 = Mess_IntegralNick; |
869 | Mess_IntegralNick2 = Mess_IntegralNick; |
804 | Mess_IntegralRoll2 = Mess_IntegralRoll; |
870 | Mess_IntegralRoll2 = Mess_IntegralRoll; |
805 | ZaehlMessungen = 0; |
871 | ZaehlMessungen = 0; |
806 | LageKorrekturNick = 0; |
872 | LageKorrekturNick = 0; |
807 | LageKorrekturRoll = 0; |
873 | LageKorrekturRoll = 0; |
Line 808... | Line 874... | ||
808 | } |
874 | } |
809 | 875 | ||
810 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
876 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
811 | if(!Looping_Nick && !Looping_Roll) |
877 | if(!Looping_Nick && !Looping_Roll && IntegralFaktor) |
812 | { |
878 | { |
813 | long tmp_long, tmp_long2; |
879 | long tmp_long, tmp_long2; |
814 | tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
880 | tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
Line 835... | Line 901... | ||
835 | Mess_IntegralNick -= tmp_long; |
901 | Mess_IntegralNick -= tmp_long; |
836 | Mess_IntegralRoll -= tmp_long2; |
902 | Mess_IntegralRoll -= tmp_long2; |
837 | } |
903 | } |
838 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
904 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Line 839... | Line 905... | ||
839 | 905 | ||
840 | if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
906 | if(ZaehlMessungen >= ABGLEICH_ANZAHL) // AbgleichAnzahl: fest definierter Wert |
841 | { |
907 | { |
842 | static int cnt = 0; |
908 | static int cnt = 0; |
843 | static char last_n_p,last_n_n,last_r_p,last_r_n; |
909 | static char last_n_p,last_n_n,last_r_p,last_r_n; |
844 | static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
910 | static long MittelIntegralNick_Alt,MittelIntegralRoll_Alt; |
845 | if(!Looping_Nick && !Looping_Roll && !TrichterFlug) |
911 | if(!Looping_Nick && !Looping_Roll && !TrichterFlug && IntegralFaktor) |
846 | { |
912 | { |
847 | MittelIntegralNick /= ABGLEICH_ANZAHL; |
913 | MittelIntegralNick /= ABGLEICH_ANZAHL; |
848 | MittelIntegralRoll /= ABGLEICH_ANZAHL; |
914 | MittelIntegralRoll /= ABGLEICH_ANZAHL; |
849 | IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
915 | IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
Line 903... | Line 969... | ||
903 | DebugOut.Analog[30] = LageKorrekturRoll * 10; |
969 | DebugOut.Analog[30] = LageKorrekturRoll * 10; |
904 | */ |
970 | */ |
Line 905... | Line 971... | ||
905 | 971 | ||
906 | #define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
972 | #define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
907 | #define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
973 | #define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
908 | #define BEWEGUNGS_LIMIT 20000 |
974 | #define BEWEGUNGS_LIMIT 20000 |
909 | // Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
975 | // Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
910 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
976 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
911 | if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT) |
977 | if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < BEWEGUNGS_LIMIT) |
912 | { |
978 | { |
Line 1092... | Line 1158... | ||
1092 | // DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
1158 | // DebugOut.Analog[17] = FromNaviCtrl_Value.Distance; |
1093 | // DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
1159 | // DebugOut.Analog[18] = (int)FromNaviCtrl_Value.OsdBar; |
1094 | DebugOut.Analog[19] = WinkelOut.CalcState; |
1160 | DebugOut.Analog[19] = WinkelOut.CalcState; |
1095 | DebugOut.Analog[20] = ServoValue; |
1161 | DebugOut.Analog[20] = ServoValue; |
Line -... | Line 1162... | ||
- | 1162 | ||
- | 1163 | ||
- | 1164 | // DebugOut.Analog[26] = MesswertNick; |
|
- | 1165 | // DebugOut.Analog[28] = MesswertRoll; |
|
1096 | 1166 | ||
1097 | DebugOut.Analog[30] = GPS_Nick; |
1167 | DebugOut.Analog[30] = GPS_Nick; |
Line 1098... | Line 1168... | ||
1098 | DebugOut.Analog[31] = GPS_Roll; |
1168 | DebugOut.Analog[31] = GPS_Roll; |
Line 1127... | Line 1197... | ||
1127 | 1197 | ||
1128 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1198 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1129 | // Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
1199 | // Drehgeschwindigkeit und -winkel zu einem Istwert zusammenfassen |
Line 1130... | Line 1200... | ||
1130 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1200 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1131 | 1201 | ||
1132 | if(Looping_Nick) MesswertNick = MesswertNick * GyroFaktor; |
1202 | if(Looping_Nick || !IntegralFaktor) MesswertNick = MesswertNick * GyroFaktor; // erweitert um !Integralfaktor, MartinR |
1133 | else MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
1203 | else MesswertNick = IntegralNick * IntegralFaktor + MesswertNick * GyroFaktor; |
- | 1204 | if(Looping_Roll || !IntegralFaktor) MesswertRoll = MesswertRoll * GyroFaktor; |
|
1134 | if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
1205 | else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
- | 1206 | ||
Line 1135... | Line 1207... | ||
1135 | else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
1207 | MesswertGier = MesswertGier * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor / 2; |
1136 | MesswertGier = MesswertGier * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor / 2; |
1208 | // MesswertGier = MesswertGier * (2 * GyroFaktor) + Integral_Gier * IntegralFaktor_Gier / 2; // Eigener IntegralFaktor für Gier, MartinR |
Line 1137... | Line 1209... | ||
1137 | 1209 | ||
Line 1153... | Line 1225... | ||
1153 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1225 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1154 | //OCR0B = 180 - (Poti1 + 120) / 4; |
1226 | //OCR0B = 180 - (Poti1 + 120) / 4; |
1155 | //DruckOffsetSetting = OCR0B; |
1227 | //DruckOffsetSetting = OCR0B; |
1156 | GasMischanteil *= STICK_GAIN; |
1228 | GasMischanteil *= STICK_GAIN; |
Line -... | Line 1229... | ||
- | 1229 | ||
1157 | 1230 | ||
1158 | if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG)) // Höhenregelung |
1231 | if((EE_Parameter.GlobalConfig & CFG_HOEHENREGELUNG) && !(Parameter_UserParam1 > 50)) // Höhenregelung // MartinR: Höhenregelung bei HH abschalten |
1159 | { |
1232 | { |
1160 | int tmp_int; |
1233 | int tmp_int; |
1161 | if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
1234 | if(EE_Parameter.GlobalConfig & CFG_HOEHEN_SCHALTER) // Regler wird über Schalter gesteuert |
1162 | { |
1235 | { |
Line 1224... | Line 1297... | ||
1224 | 1297 | ||
1225 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1298 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1226 | // Nick-Achse |
1299 | // Nick-Achse |
1227 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1300 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1228 | DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
1301 | DiffNick = MesswertNick - StickNick; // Differenz bestimmen |
- | 1302 | // if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - StickNick; // I-Anteil bei Winkelregelung // so war es, MartinR |
|
- | 1303 | // das IntegralNick ist bereits im MesswertNick. Die SummeNick wird bei mir im ACC-Mode mit sowiso über Ki auf Null gesetzt. MartinR |
|
- | 1304 | ||
- | 1305 | if(IntegralFaktor) SummeNick = (IntegralNick * IntegralFaktor - StickNick + (stick_nick_neutral/4)) / Ki ; // Startwert von SummeNick bei Umschaltung auf HH, MartinR |
|
1229 | if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - StickNick; // I-Anteil bei Winkelregelung |
1306 | // im ACC-Mode wird SummeNick nicht mehr verwendet. SummeNick im ACC-Mode ist nur der Startwert für SummeNick im HH-Mode, MartinR |
- | 1307 | else SummeNick += DiffNick; // I-Anteil bei HH |
|
1230 | else SummeNick += DiffNick; // I-Anteil bei HH |
1308 | |
1231 | if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
1309 | if(SummeNick > (STICK_GAIN * 16000L)) SummeNick = (STICK_GAIN * 16000L); |
- | 1310 | if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
|
- | 1311 | ||
1232 | if(SummeNick < -(16000L * STICK_GAIN)) SummeNick = -(16000L * STICK_GAIN); |
1312 | if(IntegralFaktor) pd_ergebnis = DiffNick; // PI-Regler im ACC-Mode , MartinR |
1233 | pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
1313 | else pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick // bei HH , MartinR |
1234 | // Motor Vorn |
1314 | // Motor Vorn |
1235 | tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
1315 | tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
1236 | if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
1316 | if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
Line 1251... | Line 1331... | ||
1251 | Motor_Hinten = motorwert; |
1331 | Motor_Hinten = motorwert; |
1252 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1332 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1253 | // Roll-Achse |
1333 | // Roll-Achse |
1254 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1334 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1255 | DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
1335 | DiffRoll = MesswertRoll - StickRoll; // Differenz bestimmen |
1256 | if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - StickRoll;// I-Anteil bei Winkelregelung |
1336 | // if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - StickRoll;// I-Anteil bei Winkelregelung |
- | 1337 | if(IntegralFaktor) SummeRoll = (IntegralRoll * IntegralFaktor - StickRoll + (stick_roll_neutral/4)) / Ki; // Startwert von SummeRoll bei Umschaltung auf HH, MartinR |
|
- | 1338 | // im ACC-Mode wird SummeRoll nicht mehr verwendet. SummeRoll im ACC-Mode ist nur der Startwert für SummeRoll im HH-Mode, MartinR |
|
1257 | else SummeRoll += DiffRoll; // I-Anteil bei HH |
1339 | else SummeRoll += DiffRoll; // I-Anteil bei HH |
- | 1340 | ||
1258 | if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
1341 | if(SummeRoll > (STICK_GAIN * 16000L)) SummeRoll = (STICK_GAIN * 16000L); |
1259 | if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
1342 | if(SummeRoll < -(16000L * STICK_GAIN)) SummeRoll = -(16000L * STICK_GAIN); |
- | 1343 | ||
- | 1344 | if(IntegralFaktor) pd_ergebnis = DiffRoll; // PI-Regler im ACC-Mode , MartinR |
|
1260 | pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
1345 | else pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
1261 | tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
1346 | tmp_int = (long)((long)Parameter_DynamicStability * (long)(GasMischanteil + abs(GierMischanteil)/2)) / 64; |
1262 | if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
1347 | if(pd_ergebnis > tmp_int) pd_ergebnis = tmp_int; |
1263 | if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
1348 | if(pd_ergebnis < -tmp_int) pd_ergebnis = -tmp_int; |
1264 | // Motor Links |
1349 | // Motor Links |
1265 | motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |
1350 | motorwert = GasMischanteil + pd_ergebnis - GierMischanteil; |