Rev 492 | Rev 499 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 492 | Rev 498 | ||
---|---|---|---|
Line 88... | Line 88... | ||
88 | volatile unsigned char SenderOkay = 0; |
88 | volatile unsigned char SenderOkay = 0; |
89 | int StickNick = 0,StickRoll = 0,StickGier = 0; |
89 | int StickNick = 0,StickRoll = 0,StickGier = 0; |
90 | char MotorenEin = 0; |
90 | char MotorenEin = 0; |
91 | int HoehenWert = 0; |
91 | int HoehenWert = 0; |
92 | int SollHoehe = 0; |
92 | int SollHoehe = 0; |
93 | int I_LageRoll = 0,I_LageNick = 0; |
93 | int LageKorrekturRoll = 0,LageKorrekturNick = 0; |
94 | float Kp = FAKTOR_P; |
94 | float Kp = FAKTOR_P; |
95 | float Ki = FAKTOR_I; |
95 | float Ki = FAKTOR_I; |
96 | unsigned char Looping_Nick = 0,Looping_Roll = 0; |
96 | unsigned char Looping_Nick = 0,Looping_Roll = 0; |
97 | unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
97 | unsigned char Looping_Links = 0, Looping_Rechts = 0, Looping_Unten = 0, Looping_Oben = 0; |
Line 210... | Line 210... | ||
210 | else tmpl = tmpl2 = 0; |
210 | else tmpl = tmpl2 = 0; |
211 | // Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
211 | // Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
212 | MesswertRoll += tmpl; |
212 | MesswertRoll += tmpl; |
213 | MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109 |
213 | MesswertRoll += (tmpl2*Parameter_AchsGegenKopplung1)/512L; //109 |
214 | Mess_IntegralRoll2 += MesswertRoll; |
214 | Mess_IntegralRoll2 += MesswertRoll; |
215 | Mess_IntegralRoll += MesswertRoll - I_LageRoll; |
215 | Mess_IntegralRoll += MesswertRoll - LageKorrekturRoll; |
216 | if(Mess_IntegralRoll > Umschlag180Roll) |
216 | if(Mess_IntegralRoll > Umschlag180Roll) |
217 | { |
217 | { |
218 | Mess_IntegralRoll = -(Umschlag180Roll - 10000L); |
218 | Mess_IntegralRoll = -(Umschlag180Roll - 10000L); |
219 | Mess_IntegralRoll2 = Mess_IntegralRoll; |
219 | Mess_IntegralRoll2 = Mess_IntegralRoll; |
220 | } |
220 | } |
Line 237... | Line 237... | ||
237 | } |
237 | } |
238 | // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
238 | // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
239 | MesswertNick -= tmpl2; |
239 | MesswertNick -= tmpl2; |
240 | MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; |
240 | MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; |
241 | Mess_IntegralNick2 += MesswertNick; |
241 | Mess_IntegralNick2 += MesswertNick; |
242 | Mess_IntegralNick += MesswertNick - I_LageNick; |
242 | Mess_IntegralNick += MesswertNick - LageKorrekturNick; |
243 | if(Mess_IntegralNick > Umschlag180Nick) |
243 | if(Mess_IntegralNick > Umschlag180Nick) |
244 | { |
244 | { |
245 | Mess_IntegralNick = -(Umschlag180Nick - 10000L); |
245 | Mess_IntegralNick = -(Umschlag180Nick - 10000L); |
246 | Mess_IntegralNick2 = Mess_IntegralNick; |
246 | Mess_IntegralNick2 = Mess_IntegralNick; |
247 | } |
247 | } |
Line 680... | Line 680... | ||
680 | MittelIntegralNick2 = 0; |
680 | MittelIntegralNick2 = 0; |
681 | MittelIntegralRoll2 = 0; |
681 | MittelIntegralRoll2 = 0; |
682 | Mess_IntegralNick2 = Mess_IntegralNick; |
682 | Mess_IntegralNick2 = Mess_IntegralNick; |
683 | Mess_IntegralRoll2 = Mess_IntegralRoll; |
683 | Mess_IntegralRoll2 = Mess_IntegralRoll; |
684 | ZaehlMessungen = 0; |
684 | ZaehlMessungen = 0; |
685 | I_LageNick = 0; |
685 | LageKorrekturNick = 0; |
686 | I_LageRoll = 0; |
686 | LageKorrekturRoll = 0; |
687 | } |
687 | } |
Line 688... | Line 688... | ||
688 | 688 | ||
689 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
689 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
690 | if(IntegralFaktor && !Looping_Nick && !Looping_Roll) |
690 | if(!Looping_Nick && !Looping_Roll) |
691 | { |
691 | { |
692 | long tmp_long, tmp_long2; |
692 | long tmp_long, tmp_long2; |
693 | tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
693 | tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
694 | tmp_long /= 16; |
694 | tmp_long /= 16; |
Line 718... | Line 718... | ||
718 | IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
718 | IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
719 | #define MAX_I 0//(Poti2/10) |
719 | #define MAX_I 0//(Poti2/10) |
720 | // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
720 | // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
721 | IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
721 | IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
722 | ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
722 | ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
723 | /* if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000) |
- | |
724 | { |
- | |
725 | tmp_long = IntegralFehlerNick / 256L; |
723 | LageKorrekturNick = ausgleichNick / ABGLEICH_ANZAHL; |
726 | if(tmp_long > MAX_I) tmp_long = MAX_I; |
- | |
727 | if(tmp_long <-MAX_I) tmp_long =-MAX_I; |
- | |
728 | I_LageNick = tmp_long; |
- | |
729 | } |
- | |
730 | else |
- | |
731 | { |
- | |
732 | I_LageNick /= 2; |
- | |
733 | } |
- | |
734 | */ |
- | |
735 | // Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
724 | // Roll ++++++++++++++++++++++++++++++++++++++++++++++++ |
736 | IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
725 | IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
737 | ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
726 | ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
738 | /* if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < 5000) |
- | |
739 | { |
- | |
740 | tmp_long2 = IntegralFehlerRoll / 256L; |
727 | LageKorrekturRoll = ausgleichRoll / ABGLEICH_ANZAHL; |
741 | if(tmp_long2 > MAX_I) tmp_long2 = MAX_I; |
- | |
742 | if(tmp_long2 <-MAX_I) tmp_long2 =-MAX_I; |
- | |
743 | I_LageRoll = tmp_long2; |
- | |
744 | } |
- | |
745 | else |
- | |
746 | { |
- | |
747 | I_LageRoll /=2; |
- | |
748 | } |
- | |
749 | */ |
728 | |
750 | Mess_IntegralNick -= ausgleichNick; |
729 | // Mess_IntegralNick -= ausgleichNick; |
751 | Mess_IntegralRoll -= ausgleichRoll; |
730 | // Mess_IntegralRoll -= ausgleichRoll; |
Line 752... | Line 731... | ||
752 | 731 | ||
753 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
732 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
754 | // Gyro-Drift ermitteln |
733 | // Gyro-Drift ermitteln |
755 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
734 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
Line 776... | Line 755... | ||
776 | DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
755 | DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
777 | DebugOut.Analog[21] = MittelIntegralNick / 26; |
756 | DebugOut.Analog[21] = MittelIntegralNick / 26; |
778 | DebugOut.Analog[22] = MittelIntegralRoll / 26; |
757 | DebugOut.Analog[22] = MittelIntegralRoll / 26; |
779 | //DebugOut.Analog[28] = ausgleichNick; |
758 | //DebugOut.Analog[28] = ausgleichNick; |
780 | DebugOut.Analog[29] = ausgleichRoll; |
759 | DebugOut.Analog[29] = ausgleichRoll; |
781 | DebugOut.Analog[30] = I_LageRoll * 10; |
760 | DebugOut.Analog[30] = LageKorrekturRoll * 10; |
Line 782... | Line 761... | ||
782 | 761 | ||
783 | #define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
762 | #define FEHLER_LIMIT (ABGLEICH_ANZAHL * 4) |
784 | #define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
763 | #define FEHLER_LIMIT2 (ABGLEICH_ANZAHL * 16) |
785 | #define BEWEGUNGS_LIMIT 20000 |
764 | #define BEWEGUNGS_LIMIT 20000 |
Line 792... | Line 771... | ||
792 | if(last_n_p) |
771 | if(last_n_p) |
793 | { |
772 | { |
794 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
773 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
795 | ausgleichNick = IntegralFehlerNick / 8; |
774 | ausgleichNick = IntegralFehlerNick / 8; |
796 | if(ausgleichNick > 5000) ausgleichNick = 5000; |
775 | if(ausgleichNick > 5000) ausgleichNick = 5000; |
- | 776 | LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
|
797 | Mess_IntegralNick -= ausgleichNick; |
777 | // Mess_IntegralNick -= ausgleichNick; |
798 | } |
778 | } |
799 | else last_n_p = 1; |
779 | else last_n_p = 1; |
800 | } else last_n_p = 0; |
780 | } else last_n_p = 0; |
801 | if(IntegralFehlerNick < -FEHLER_LIMIT2) |
781 | if(IntegralFehlerNick < -FEHLER_LIMIT2) |
802 | { |
782 | { |
803 | if(last_n_n) |
783 | if(last_n_n) |
804 | { |
784 | { |
805 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
785 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
806 | ausgleichNick = IntegralFehlerNick / 8; |
786 | ausgleichNick = IntegralFehlerNick / 8; |
807 | if(ausgleichNick < -5000) ausgleichNick = -5000; |
787 | if(ausgleichNick < -5000) ausgleichNick = -5000; |
- | 788 | LageKorrekturNick += ausgleichNick / ABGLEICH_ANZAHL; |
|
808 | Mess_IntegralNick -= ausgleichNick; |
789 | // Mess_IntegralNick -= ausgleichNick; |
809 | } |
790 | } |
810 | else last_n_n = 1; |
791 | else last_n_n = 1; |
811 | } else last_n_n = 0; |
792 | } else last_n_n = 0; |
812 | } else cnt = 0; |
793 | } else cnt = 0; |
813 | if(cnt > 4) cnt = 4; |
794 | if(cnt > 4) cnt = 4; |
Line 816... | Line 797... | ||
816 | if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
797 | if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
Line 817... | Line 798... | ||
817 | 798 | ||
818 | // Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
799 | // Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
Line 819... | Line 800... | ||
819 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
800 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
820 | 801 | ||
821 | ausgleichRoll = 0; |
802 | ausgleichRoll = 0; |
822 | if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT) |
803 | if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < BEWEGUNGS_LIMIT) |
823 | { |
804 | { |
824 | if(IntegralFehlerRoll > FEHLER_LIMIT2) |
805 | if(IntegralFehlerRoll > FEHLER_LIMIT2) |
825 | { |
806 | { |
826 | if(last_r_p) |
807 | if(last_r_p) |
827 | { |
808 | { |
828 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
809 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
829 | ausgleichRoll = IntegralFehlerRoll / 8; |
810 | ausgleichRoll = IntegralFehlerRoll / 8; |
830 | if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
811 | if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
831 | Mess_IntegralRoll -= ausgleichRoll; |
812 | LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
832 | // beeptime = 50; |
813 | // Mess_IntegralRoll -= ausgleichRoll; |
833 | } |
814 | } |
834 | else last_r_p = 1; |
815 | else last_r_p = 1; |
835 | } else last_r_p = 0; |
816 | } else last_r_p = 0; |
836 | if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
817 | if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
837 | { |
818 | { |
838 | if(last_r_n) |
819 | if(last_r_n) |
839 | { |
820 | { |
840 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
821 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
841 | ausgleichRoll = IntegralFehlerRoll / 8; |
822 | ausgleichRoll = IntegralFehlerRoll / 8; |
842 | if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
823 | if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
843 | Mess_IntegralRoll -= ausgleichRoll; |
824 | // Mess_IntegralRoll -= ausgleichRoll; |
844 | // beeptime = 50; |
825 | LageKorrekturRoll += ausgleichRoll / ABGLEICH_ANZAHL; |
845 | } |
826 | } |
846 | else last_r_n = 1; |
827 | else last_r_n = 1; |
847 | } else last_r_n = 0; |
828 | } else last_r_n = 0; |
848 | } else |
- | |
849 | { |
829 | } else |
850 | beeptime = 50; |
830 | { |
851 | cnt = 0; |
831 | cnt = 0; |
852 | } |
832 | } |
853 | DebugOut.Analog[27] = ausgleichRoll; |
833 | DebugOut.Analog[27] = ausgleichRoll; |
854 | if(cnt > 4) cnt = 4; |
- | |
- | 834 | if(cnt > 4) cnt = 4; |
|
855 | // if(cnt > Poti2 / 40) cnt = Poti2 / 40; |
835 | // if(cnt > Poti2 / 40) cnt = Poti2 / 40; |
856 | 836 | //if(cnt > 1) beeptime = 50; |
|
857 | if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
837 | if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
858 | if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
838 | if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
859 | DebugOut.Analog[23] = AdNeutralNick;//10*(AdNeutralNick - StartNeutralNick); |
- | |
860 | DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll); |
839 | DebugOut.Analog[23] = AdNeutralNick;//10*(AdNeutralNick - StartNeutralNick); |
- | 840 | DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll); |
|
- | 841 | } |
|
- | 842 | else |
|
- | 843 | { |
|
- | 844 | LageKorrekturRoll = 0; |
|
- | 845 | LageKorrekturNick = 0; |
|
861 | 846 | } |
|
862 | } |
847 | if(!IntegralFaktor) { LageKorrekturRoll = 0; LageKorrekturNick = 0;} // z.B. bei HH |
863 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
848 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
864 | MittelIntegralNick_Alt = MittelIntegralNick; |
849 | MittelIntegralNick_Alt = MittelIntegralNick; |
865 | MittelIntegralRoll_Alt = MittelIntegralRoll; |
850 | MittelIntegralRoll_Alt = MittelIntegralRoll; |
Line 1044... | Line 1029... | ||
1044 | if(GasMischanteil < 20) GierMischanteil = 0; |
1029 | if(GasMischanteil < 20) GierMischanteil = 0; |
1045 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1030 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1046 | // Nick-Achse |
1031 | // Nick-Achse |
1047 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1032 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1048 | DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick)); // Differenz bestimmen |
1033 | DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick)); // Differenz bestimmen |
1049 | if(IntegralRoll) SummeNick += IntegralNick * IntegralFaktor - StickNick; |
1034 | if(IntegralFaktor) SummeNick += IntegralNick * IntegralFaktor - (StickNick - GPS_Nick); // I-Anteil bei Winkelregelung |
1050 | else SummeNick += DiffNick; // I-Anteil |
1035 | else SummeNick += DiffNick; // I-Anteil bei HH |
1051 | if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1; |
1036 | if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1; |
1052 | if(SummeNick > 16000) SummeNick = 16000; |
1037 | if(SummeNick > 16000) SummeNick = 16000; |
1053 | if(SummeNick < -16000) SummeNick = -16000; |
1038 | if(SummeNick < -16000) SummeNick = -16000; |
1054 | pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
1039 | pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
1055 | // Motor Vorn |
1040 | // Motor Vorn |
Line 1070... | Line 1055... | ||
1070 | Motor_Hinten = motorwert; |
1055 | Motor_Hinten = motorwert; |
1071 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1056 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1072 | // Roll-Achse |
1057 | // Roll-Achse |
1073 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1058 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1074 | DiffRoll = Kp * (MesswertRoll - (StickRoll - GPS_Roll)); // Differenz bestimmen |
1059 | DiffRoll = Kp * (MesswertRoll - (StickRoll - GPS_Roll)); // Differenz bestimmen |
1075 | if(IntegralRoll) SummeRoll += IntegralRoll * IntegralFaktor - StickRoll; |
1060 | if(IntegralFaktor) SummeRoll += IntegralRoll * IntegralFaktor - (StickRoll - GPS_Roll);// I-Anteil bei Winkelregelung |
1076 | else SummeRoll += DiffRoll; // I-Anteil |
1061 | else SummeRoll += DiffRoll; // I-Anteil bei HH |
1077 | if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1; |
1062 | if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1; |
1078 | if(SummeRoll > 16000) SummeRoll = 16000; |
1063 | if(SummeRoll > 16000) SummeRoll = 16000; |
1079 | if(SummeRoll < -16000) SummeRoll = -16000; |
1064 | if(SummeRoll < -16000) SummeRoll = -16000; |
1080 | pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
1065 | pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
1081 | if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |
1066 | if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |