Rev 395 | Rev 419 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 395 | Rev 401 | ||
---|---|---|---|
Line 57... | Line 57... | ||
57 | #include "eeprom.c" |
57 | #include "eeprom.c" |
Line 58... | Line 58... | ||
58 | 58 | ||
59 | unsigned char h,m,s; |
59 | unsigned char h,m,s; |
60 | volatile unsigned int I2CTimeout = 100; |
60 | volatile unsigned int I2CTimeout = 100; |
61 | volatile int MesswertNick,MesswertRoll,MesswertGier; |
61 | volatile int MesswertNick,MesswertRoll,MesswertGier; |
62 | volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0; |
62 | volatile int AdNeutralNick = 0,AdNeutralRoll = 0,AdNeutralGier = 0,StartNeutralRoll = 0,StartNeutralNick = 0; |
63 | volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
63 | volatile int Mittelwert_AccNick, Mittelwert_AccRoll,Mittelwert_AccHoch, NeutralAccX=0, NeutralAccY=0; |
64 | volatile float NeutralAccZ = 0; |
64 | volatile float NeutralAccZ = 0; |
65 | unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
65 | unsigned char CosinusNickWinkel = 0, CosinusRollWinkel = 0; |
66 | volatile long IntegralNick = 0,IntegralNick2 = 0; |
66 | volatile long IntegralNick = 0,IntegralNick2 = 0; |
Line 149... | Line 149... | ||
149 | } |
149 | } |
Line 150... | Line 150... | ||
150 | 150 | ||
151 | AdNeutralNick= AdWertNick; |
151 | AdNeutralNick= AdWertNick; |
152 | AdNeutralRoll= AdWertRoll; |
152 | AdNeutralRoll= AdWertRoll; |
153 | AdNeutralGier= AdWertGier; |
- | |
- | 153 | AdNeutralGier= AdWertGier; |
|
- | 154 | StartNeutralRoll = AdNeutralRoll; |
|
154 | 155 | StartNeutralNick = AdNeutralNick; |
|
155 | NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
156 | NeutralAccY = abs(Mittelwert_AccRoll) / ACC_AMPLIFY; |
156 | NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
157 | NeutralAccX = abs(Mittelwert_AccNick) / ACC_AMPLIFY; |
Line 157... | Line 158... | ||
157 | NeutralAccZ = Aktuell_az; |
158 | NeutralAccZ = Aktuell_az; |
Line 181... | Line 182... | ||
181 | { |
182 | { |
182 | static signed long tmpl,tmpl2; |
183 | static signed long tmpl,tmpl2; |
183 | MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
184 | MesswertGier = (signed int) AdNeutralGier - AdWertGier; |
184 | MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
185 | MesswertRoll = (signed int) AdWertRoll - AdNeutralRoll; |
185 | MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
186 | MesswertNick = (signed int) AdWertNick - AdNeutralNick; |
186 | if(PlatinenVersion != 10) |
- | |
187 | { |
- | |
188 | MesswertGier *= 2; |
- | |
189 | MesswertRoll *= 2; |
- | |
190 | MesswertNick *= 2; |
- | |
191 | } |
187 | |
192 | // Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
188 | // Beschleunigungssensor ++++++++++++++++++++++++++++++++++++++++++++++++ |
193 | Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
189 | Mittelwert_AccNick = ((long)Mittelwert_AccNick * 1 + ((ACC_AMPLIFY * (long)AdWertAccNick))) / 2L; |
194 | Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L; |
190 | Mittelwert_AccRoll = ((long)Mittelwert_AccRoll * 1 + ((ACC_AMPLIFY * (long)AdWertAccRoll))) / 2L; |
195 | Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L; |
191 | Mittelwert_AccHoch = ((long)Mittelwert_AccHoch * 1 + ((long)AdWertAccHoch)) / 2L; |
196 | IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
192 | IntegralAccNick += ACC_AMPLIFY * AdWertAccNick; |
Line 227... | Line 223... | ||
227 | Mess_IntegralRoll = (Umschlag180Roll - 10000L); |
223 | Mess_IntegralRoll = (Umschlag180Roll - 10000L); |
228 | Mess_IntegralRoll2 = Mess_IntegralRoll; |
224 | Mess_IntegralRoll2 = Mess_IntegralRoll; |
229 | } |
225 | } |
230 | if(AdWertRoll < 15) MesswertRoll = -1000; |
226 | if(AdWertRoll < 15) MesswertRoll = -1000; |
231 | if(AdWertRoll < 7) MesswertRoll = -2000; |
227 | if(AdWertRoll < 7) MesswertRoll = -2000; |
- | 228 | if(PlatinenVersion == 10) |
|
- | 229 | { |
|
232 | if(AdWertRoll > 1010) MesswertRoll = +1000; |
230 | if(AdWertRoll > 1010) MesswertRoll = +1000; |
233 | if(AdWertRoll > 1017) MesswertRoll = +2000; |
231 | if(AdWertRoll > 1017) MesswertRoll = +2000; |
- | 232 | } |
|
- | 233 | else |
|
- | 234 | { |
|
- | 235 | if(AdWertRoll > 2020) MesswertRoll = +1000; |
|
- | 236 | if(AdWertRoll > 2034) MesswertRoll = +2000; |
|
- | 237 | } |
|
234 | // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
238 | // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
235 | MesswertNick -= tmpl2; |
239 | MesswertNick -= tmpl2; |
236 | MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; |
240 | MesswertNick -= (tmpl*Parameter_AchsGegenKopplung1)/512L; |
237 | Mess_IntegralNick2 += MesswertNick; |
241 | Mess_IntegralNick2 += MesswertNick; |
238 | Mess_IntegralNick += MesswertNick - I_LageNick; |
242 | Mess_IntegralNick += MesswertNick - I_LageNick; |
Line 246... | Line 250... | ||
246 | Mess_IntegralNick = (Umschlag180Nick - 10000L); |
250 | Mess_IntegralNick = (Umschlag180Nick - 10000L); |
247 | Mess_IntegralNick2 = Mess_IntegralNick; |
251 | Mess_IntegralNick2 = Mess_IntegralNick; |
248 | } |
252 | } |
249 | if(AdWertNick < 15) MesswertNick = -1000; |
253 | if(AdWertNick < 15) MesswertNick = -1000; |
250 | if(AdWertNick < 7) MesswertNick = -2000; |
254 | if(AdWertNick < 7) MesswertNick = -2000; |
- | 255 | if(PlatinenVersion == 10) |
|
- | 256 | { |
|
251 | if(AdWertNick > 1010) MesswertNick = +1000; |
257 | if(AdWertNick > 1010) MesswertNick = +1000; |
252 | if(AdWertNick > 1017) MesswertNick = +2000; |
258 | if(AdWertNick > 1017) MesswertNick = +2000; |
- | 259 | } |
|
- | 260 | else |
|
- | 261 | { |
|
- | 262 | if(AdWertNick > 2020) MesswertNick = +1000; |
|
- | 263 | if(AdWertNick > 2034) MesswertNick = +2000; |
|
- | 264 | } |
|
253 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
265 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
254 | // ADC einschalten |
266 | // ADC einschalten |
255 | ANALOG_ON; |
267 | ANALOG_ON; |
256 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
268 | //++++++++++++++++++++++++++++++++++++++++++++++++ |
- | 269 | DebugOut.Analog[11] = MesswertRoll; |
|
Line 257... | Line 270... | ||
257 | 270 | ||
258 | Integral_Gier = Mess_Integral_Gier; |
271 | Integral_Gier = Mess_Integral_Gier; |
259 | IntegralNick = Mess_IntegralNick; |
272 | IntegralNick = Mess_IntegralNick; |
260 | IntegralRoll = Mess_IntegralRoll; |
273 | IntegralRoll = Mess_IntegralRoll; |
Line 663... | Line 676... | ||
663 | MittelIntegralNick /= ABGLEICH_ANZAHL; |
676 | MittelIntegralNick /= ABGLEICH_ANZAHL; |
664 | MittelIntegralRoll /= ABGLEICH_ANZAHL; |
677 | MittelIntegralRoll /= ABGLEICH_ANZAHL; |
665 | IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
678 | IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
666 | IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
679 | IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
667 | IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
680 | IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
668 | - | ||
669 | //DebugOut.Analog[6] = labs(MittelIntegralNick_Alt - MittelIntegralNick) / 10; |
681 | #define MAX_I 32 |
670 | // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
682 | // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
671 | IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
683 | IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
672 | ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
684 | ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
673 | if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000) |
685 | if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000) |
674 | { |
686 | { |
675 | tmp_long = IntegralFehlerNick / 700L; |
687 | tmp_long = IntegralFehlerNick / 700L; |
676 | if(tmp_long > 40) tmp_long = 40; |
688 | if(tmp_long > MAX_I) tmp_long = MAX_I; |
677 | if(tmp_long <-40) tmp_long =-40; |
689 | if(tmp_long <-MAX_I) tmp_long =-MAX_I; |
678 | I_LageNick = tmp_long; |
690 | I_LageNick = tmp_long; |
679 | } |
691 | } |
680 | else |
692 | else |
681 | { |
693 | { |
682 | I_LageNick /= 2; |
694 | I_LageNick /= 2; |
Line 685... | Line 697... | ||
685 | IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
697 | IntegralFehlerRoll = (long)(MittelIntegralRoll - (long)IntegralAccRoll); |
686 | ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
698 | ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
687 | if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < 5000) |
699 | if(labs(MittelIntegralRoll_Alt - MittelIntegralRoll) < 5000) |
688 | { |
700 | { |
689 | tmp_long2 = IntegralFehlerRoll / 700L; |
701 | tmp_long2 = IntegralFehlerRoll / 700L; |
690 | if(tmp_long2 > 40) tmp_long2 = 40; |
702 | if(tmp_long2 > MAX_I) tmp_long2 = MAX_I; |
691 | if(tmp_long2 <-40) tmp_long2 =-40; |
703 | if(tmp_long2 <-MAX_I) tmp_long2 =-MAX_I; |
692 | I_LageRoll = tmp_long2; |
704 | I_LageRoll = tmp_long2; |
693 | } |
705 | } |
694 | else |
706 | else |
695 | { |
707 | { |
696 | I_LageRoll /=2; |
708 | I_LageRoll /=2; |
Line 714... | Line 726... | ||
714 | IntegralFehlerNick = tmp_long; |
726 | IntegralFehlerNick = tmp_long; |
715 | IntegralFehlerRoll = tmp_long2; |
727 | IntegralFehlerRoll = tmp_long2; |
716 | Mess_IntegralNick2 -= IntegralFehlerNick; |
728 | Mess_IntegralNick2 -= IntegralFehlerNick; |
717 | Mess_IntegralRoll2 -= IntegralFehlerRoll; |
729 | Mess_IntegralRoll2 -= IntegralFehlerRoll; |
Line 718... | Line -... | ||
718 | - | ||
719 | if(PlatinenVersion != 10) |
- | |
720 | { |
- | |
721 | tmp_long /= 2; |
- | |
722 | tmp_long2 /= 2; |
- | |
723 | } |
- | |
724 | 730 | ||
725 | // IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
731 | // IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
Line 726... | Line 732... | ||
726 | // IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
732 | // IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
727 | 733 | ||
728 | 734 | ||
729 | DebugOut.Analog[30] = I_LageRoll; |
735 | DebugOut.Analog[30] = I_LageRoll * 10; |
730 | DebugOut.Analog[17] = IntegralAccNick / 26; |
736 | DebugOut.Analog[17] = IntegralAccNick / 26; |
731 | DebugOut.Analog[18] = IntegralAccRoll / 26; |
737 | DebugOut.Analog[18] = IntegralAccRoll / 26; |
732 | DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
738 | DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
733 | DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
739 | DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
734 | DebugOut.Analog[21] = MittelIntegralNick / 26; |
740 | DebugOut.Analog[21] = MittelIntegralNick / 26; |
Line 735... | Line 741... | ||
735 | DebugOut.Analog[22] = MittelIntegralRoll / 26; |
741 | DebugOut.Analog[22] = MittelIntegralRoll / 26; |
736 | DebugOut.Analog[28] = ausgleichNick; |
742 | DebugOut.Analog[28] = ausgleichNick; |
Line 737... | Line 743... | ||
737 | DebugOut.Analog[29] = ausgleichRoll; |
743 | DebugOut.Analog[29] = ausgleichRoll; |
738 | 744 | ||
739 | #define FEHLER_LIMIT (ABGLEICH_ANZAHL/2) |
745 | #define FEHLER_LIMIT (ABGLEICH_ANZAHL/2) |
740 | #define FEHLER_LIMIT2 4096 |
746 | #define FEHLER_LIMIT2 (ABGLEICH_ANZAHL*4) |
741 | 747 | ||
742 | // Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
748 | // Nick +++++++++++++++++++++++++++++++++++++++++++++++++ |
743 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
749 | cnt = 1;// + labs(IntegralFehlerNick) / 4096; |
744 | if(IntegralFehlerNick > FEHLER_LIMIT2) |
750 | if(IntegralFehlerNick > FEHLER_LIMIT2) |
745 | { |
751 | { |
746 | if(last_n_p) |
752 | if(last_n_p) |
747 | { |
753 | { |
748 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
754 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
749 | ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
755 | ausgleichNick = IntegralFehlerNick / 4; |
750 | if(ausgleichNick > 10000) ausgleichNick = 10000; |
756 | if(ausgleichNick > 5000) ausgleichNick = 5000; |
751 | Mess_IntegralNick += ausgleichNick; |
757 | Mess_IntegralNick -= ausgleichNick; |
752 | } |
758 | } |
753 | else last_n_p = 1; |
759 | else last_n_p = 1; |
754 | } else last_n_p = 0; |
760 | } else last_n_p = 0; |
755 | if(IntegralFehlerNick < -FEHLER_LIMIT2) |
761 | if(IntegralFehlerNick < -FEHLER_LIMIT2) |
756 | { |
762 | { |
757 | if(last_n_n) |
763 | if(last_n_n) |
758 | { |
764 | { |
759 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
765 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
760 | ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
766 | ausgleichNick = IntegralFehlerNick / 4; |
Line 761... | Line 767... | ||
761 | if(ausgleichNick < -10000) ausgleichNick = -10000; |
767 | if(ausgleichNick < -5000) ausgleichNick = -5000; |
762 | Mess_IntegralNick += ausgleichNick; |
768 | Mess_IntegralNick -= ausgleichNick; |
763 | } |
769 | } |
764 | else last_n_n = 1; |
- | |
765 | } else last_n_n = 0; |
- | |
- | 770 | else last_n_n = 1; |
|
766 | 771 | } else last_n_n = 0; |
|
767 | if(cnt > 2) cnt = 2; |
772 | |
- | 773 | if(cnt > 3) cnt = 3; |
|
768 | if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
774 | if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
769 | if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
775 | if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
770 | // if(IntegralFehlerNick > FEHLER_LIMIT) { AdNeutralNick += (cnt + last_n_p/20); if(last_n_p++ == 4) {last_n_p = 4;}} else last_n_p = 0; |
776 | |
771 | // if(IntegralFehlerNick < -FEHLER_LIMIT) { AdNeutralNick -= (cnt + last_n_n/20); if(last_n_n++ == 4) {last_n_n = 4;}} else last_n_n = 0; |
777 | // Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
772 | // Roll +++++++++++++++++++++++++++++++++++++++++++++++++ |
778 | cnt = 1;// + labs(IntegralFehlerRoll) / 4096; |
773 | cnt = 1;// + labs(IntegralFehlerRoll) / 4096; |
779 | ausgleichRoll = 0; |
774 | if(IntegralFehlerRoll > FEHLER_LIMIT2) |
780 | if(IntegralFehlerRoll > FEHLER_LIMIT2) |
775 | { |
781 | { |
776 | if(last_r_p) |
782 | if(last_r_p) |
777 | { |
783 | { |
778 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
784 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
779 | ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
785 | ausgleichRoll = IntegralFehlerRoll / 4; |
780 | if(ausgleichRoll > 10000) ausgleichRoll = 10000; |
786 | if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
781 | Mess_IntegralRoll += ausgleichRoll; |
787 | Mess_IntegralRoll -= ausgleichRoll; |
782 | } |
788 | } |
783 | else last_r_p = 1; |
789 | else last_r_p = 1; |
784 | } else last_r_p = 0; |
790 | } else last_r_p = 0; |
785 | if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
791 | if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
786 | { |
792 | { |
787 | if(last_r_n) |
793 | if(last_r_n) |
788 | { |
794 | { |
789 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
795 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
Line -... | Line 796... | ||
- | 796 | ausgleichRoll = IntegralFehlerRoll / 4; |
|
- | 797 | if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
|
790 | ausgleichRoll = IntegralFehlerRoll / EE_Parameter.GyroAccAbgleich; |
798 | Mess_IntegralRoll -= ausgleichRoll; |
791 | if(ausgleichRoll < -10000) ausgleichRoll = -10000; |
799 | } |
792 | Mess_IntegralRoll += ausgleichRoll; |
- | |
793 | } |
- | |
794 | else last_r_n = 1; |
- | |
795 | } else last_r_n = 0; |
- | |
796 | - | ||
797 | if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
- | |
798 | if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
- | |
799 | if(cnt > 2) cnt = 2; |
800 | else last_r_n = 1; |
800 | // if(IntegralFehlerRoll > FEHLER_LIMIT) { AdNeutralRoll += (cnt + last_r_p/20); if(last_r_p++ == 4) {beeptime =500;last_r_p = 4;}} else last_r_p = 0; |
801 | } else last_r_n = 0; |
801 | // if(IntegralFehlerRoll < -FEHLER_LIMIT) { AdNeutralRoll -= (cnt + last_r_n/20); if(last_r_n++ == 4) {beeptime = 60;last_r_n = 4;}} else last_r_n = 0; |
802 | |
802 | 803 | DebugOut.Analog[27] = ausgleichRoll; |
|
803 | // if(Mess_Integral_Gier2 > 500/DRIFT_FAKTOR) AdNeutralGier--; // macht nur mit Referenz (Kompass Sinn) |
804 | if(cnt > 3) cnt = 3; |
804 | // if(Mess_Integral_Gier2 <-500/DRIFT_FAKTOR) AdNeutralGier++; // macht nur mit Referenz (Kompass Sinn) |
805 | if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |