Rev 419 | Rev 492 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 419 | Rev 469 | ||
---|---|---|---|
Line 664... | Line 664... | ||
664 | ZaehlMessungen = 0; |
664 | ZaehlMessungen = 0; |
665 | I_LageNick = 0; |
665 | I_LageNick = 0; |
666 | I_LageRoll = 0; |
666 | I_LageRoll = 0; |
667 | } |
667 | } |
Line -... | Line 668... | ||
- | 668 | ||
- | 669 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
- | 670 | if(IntegralFaktor && !Looping_Nick && !Looping_Roll) |
|
- | 671 | { |
|
- | 672 | long tmp_long, tmp_long2; |
|
- | 673 | tmp_long = (long)(IntegralNick / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccNick); |
|
- | 674 | tmp_long /= 16; |
|
- | 675 | tmp_long2 = (long)(IntegralRoll / EE_Parameter.GyroAccFaktor - (long)Mittelwert_AccRoll); |
|
- | 676 | tmp_long2 /= 16; |
|
- | 677 | #define AUSGLEICH 32 |
|
- | 678 | if(tmp_long > AUSGLEICH) tmp_long = AUSGLEICH; |
|
- | 679 | if(tmp_long < -AUSGLEICH) tmp_long =-AUSGLEICH; |
|
- | 680 | if(tmp_long2 > AUSGLEICH) tmp_long2 = AUSGLEICH; |
|
- | 681 | if(tmp_long2 <-AUSGLEICH) tmp_long2 =-AUSGLEICH; |
|
- | 682 | Mess_IntegralNick -= tmp_long; |
|
- | 683 | Mess_IntegralRoll -= tmp_long2; |
|
- | 684 | } |
|
- | 685 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
|
668 | 686 | ||
669 | if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
687 | if(ZaehlMessungen >= ABGLEICH_ANZAHL) |
670 | { |
688 | { |
671 | static int cnt = 0; |
689 | static int cnt = 0; |
672 | static char last_n_p,last_n_n,last_r_p,last_r_n; |
690 | static char last_n_p,last_n_n,last_r_p,last_r_n; |
Line 676... | Line 694... | ||
676 | MittelIntegralNick /= ABGLEICH_ANZAHL; |
694 | MittelIntegralNick /= ABGLEICH_ANZAHL; |
677 | MittelIntegralRoll /= ABGLEICH_ANZAHL; |
695 | MittelIntegralRoll /= ABGLEICH_ANZAHL; |
678 | IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
696 | IntegralAccNick = (EE_Parameter.GyroAccFaktor * IntegralAccNick) / ABGLEICH_ANZAHL; |
679 | IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
697 | IntegralAccRoll = (EE_Parameter.GyroAccFaktor * IntegralAccRoll) / ABGLEICH_ANZAHL; |
680 | IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
698 | IntegralAccZ = IntegralAccZ / ABGLEICH_ANZAHL; |
681 | #define MAX_I 32 |
699 | #define MAX_I 1//(Poti2/10) |
682 | // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
700 | // Nick ++++++++++++++++++++++++++++++++++++++++++++++++ |
683 | IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
701 | IntegralFehlerNick = (long)(MittelIntegralNick - (long)IntegralAccNick); |
684 | ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
702 | ausgleichNick = IntegralFehlerNick / EE_Parameter.GyroAccAbgleich; |
685 | if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000) |
703 | if(labs(MittelIntegralNick_Alt - MittelIntegralNick) < 5000) |
686 | { |
704 | { |
Line 705... | Line 723... | ||
705 | } |
723 | } |
706 | else |
724 | else |
707 | { |
725 | { |
708 | I_LageRoll /=2; |
726 | I_LageRoll /=2; |
709 | } |
727 | } |
- | 728 | ||
710 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
729 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
711 | MittelIntegralNick_Alt = MittelIntegralNick; |
730 | MittelIntegralNick_Alt = MittelIntegralNick; |
712 | MittelIntegralRoll_Alt = MittelIntegralRoll; |
731 | MittelIntegralRoll_Alt = MittelIntegralRoll; |
713 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
732 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++ |
714 | Mess_IntegralNick -= ausgleichNick; |
733 | Mess_IntegralNick -= ausgleichNick; |
Line 730... | Line 749... | ||
730 | 749 | ||
731 | // IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
750 | // IntegralFehlerNick = (IntegralFehlerNick * 1 + tmp_long) / 2; |
Line 732... | Line -... | ||
732 | // IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
- | |
733 | 751 | // IntegralFehlerRoll = (IntegralFehlerRoll * 1 + tmp_long2) / 2; |
|
734 | 752 | ||
735 | DebugOut.Analog[30] = I_LageRoll * 10; |
753 | |
736 | DebugOut.Analog[17] = IntegralAccNick / 26; |
754 | DebugOut.Analog[17] = IntegralAccNick / 26; |
737 | DebugOut.Analog[18] = IntegralAccRoll / 26; |
755 | DebugOut.Analog[18] = IntegralAccRoll / 26; |
738 | DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
756 | DebugOut.Analog[19] = IntegralFehlerNick;// / 26; |
739 | DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
757 | DebugOut.Analog[20] = IntegralFehlerRoll;// / 26; |
740 | DebugOut.Analog[21] = MittelIntegralNick / 26; |
758 | DebugOut.Analog[21] = MittelIntegralNick / 26; |
- | 759 | DebugOut.Analog[22] = MittelIntegralRoll / 26; |
|
Line 741... | Line 760... | ||
741 | DebugOut.Analog[22] = MittelIntegralRoll / 26; |
760 | //DebugOut.Analog[28] = ausgleichNick; |
742 | DebugOut.Analog[28] = ausgleichNick; |
761 | DebugOut.Analog[29] = ausgleichRoll; |
Line 743... | Line 762... | ||
743 | DebugOut.Analog[29] = ausgleichRoll; |
762 | DebugOut.Analog[30] = I_LageRoll * 10; |
Line 750... | Line 769... | ||
750 | if(IntegralFehlerNick > FEHLER_LIMIT2) |
769 | if(IntegralFehlerNick > FEHLER_LIMIT2) |
751 | { |
770 | { |
752 | if(last_n_p) |
771 | if(last_n_p) |
753 | { |
772 | { |
754 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
773 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
755 | ausgleichNick = IntegralFehlerNick / 8; |
774 | ausgleichNick = IntegralFehlerNick / 12; |
756 | if(ausgleichNick > 5000) ausgleichNick = 5000; |
775 | if(ausgleichNick > 5000) ausgleichNick = 5000; |
757 | Mess_IntegralNick -= ausgleichNick; |
776 | // Mess_IntegralNick -= ausgleichNick; |
758 | } |
777 | } |
759 | else last_n_p = 1; |
778 | else last_n_p = 1; |
760 | } else last_n_p = 0; |
779 | } else last_n_p = 0; |
761 | if(IntegralFehlerNick < -FEHLER_LIMIT2) |
780 | if(IntegralFehlerNick < -FEHLER_LIMIT2) |
762 | { |
781 | { |
763 | if(last_n_n) |
782 | if(last_n_n) |
764 | { |
783 | { |
765 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
784 | cnt += labs(IntegralFehlerNick) / FEHLER_LIMIT2; |
766 | ausgleichNick = IntegralFehlerNick / 8; |
785 | ausgleichNick = IntegralFehlerNick / 12; |
767 | if(ausgleichNick < -5000) ausgleichNick = -5000; |
786 | if(ausgleichNick < -5000) ausgleichNick = -5000; |
768 | Mess_IntegralNick -= ausgleichNick; |
787 | // Mess_IntegralNick -= ausgleichNick; |
769 | } |
788 | } |
770 | else last_n_n = 1; |
789 | else last_n_n = 1; |
771 | } else last_n_n = 0; |
790 | } else last_n_n = 0; |
Line 772... | Line 791... | ||
772 | 791 | ||
773 | if(cnt > 3) cnt = 3; |
792 | if(cnt > 5) cnt = 5; |
774 | if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
793 | if(IntegralFehlerNick > FEHLER_LIMIT) AdNeutralNick += cnt; |
Line 775... | Line 794... | ||
775 | if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
794 | if(IntegralFehlerNick < -FEHLER_LIMIT) AdNeutralNick -= cnt; |
776 | 795 | ||
Line 780... | Line 799... | ||
780 | if(IntegralFehlerRoll > FEHLER_LIMIT2) |
799 | if(IntegralFehlerRoll > FEHLER_LIMIT2) |
781 | { |
800 | { |
782 | if(last_r_p) |
801 | if(last_r_p) |
783 | { |
802 | { |
784 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
803 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
785 | ausgleichRoll = IntegralFehlerRoll / 4; |
804 | ausgleichRoll = IntegralFehlerRoll / 12; |
786 | if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
805 | if(ausgleichRoll > 5000) ausgleichRoll = 5000; |
787 | Mess_IntegralRoll -= ausgleichRoll; |
806 | // Mess_IntegralRoll -= ausgleichRoll; |
788 | } |
807 | } |
789 | else last_r_p = 1; |
808 | else last_r_p = 1; |
790 | } else last_r_p = 0; |
809 | } else last_r_p = 0; |
791 | if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
810 | if(IntegralFehlerRoll < -FEHLER_LIMIT2) |
792 | { |
811 | { |
793 | if(last_r_n) |
812 | if(last_r_n) |
794 | { |
813 | { |
795 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
814 | cnt += labs(IntegralFehlerRoll) / FEHLER_LIMIT2; |
796 | ausgleichRoll = IntegralFehlerRoll / 4; |
815 | ausgleichRoll = IntegralFehlerRoll / 12; |
797 | if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
816 | if(ausgleichRoll < -5000) ausgleichRoll = -5000; |
798 | Mess_IntegralRoll -= ausgleichRoll; |
817 | // Mess_IntegralRoll -= ausgleichRoll; |
799 | } |
818 | } |
800 | else last_r_n = 1; |
819 | else last_r_n = 1; |
801 | } else last_r_n = 0; |
820 | } else last_r_n = 0; |
Line 802... | Line 821... | ||
802 | 821 | ||
803 | DebugOut.Analog[27] = ausgleichRoll; |
822 | DebugOut.Analog[27] = ausgleichRoll; |
804 | if(cnt > 3) cnt = 3; |
823 | if(cnt > 5) cnt = 5; |
805 | if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
824 | if(IntegralFehlerRoll > FEHLER_LIMIT) AdNeutralRoll += cnt; |
806 | if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
825 | if(IntegralFehlerRoll < -FEHLER_LIMIT) AdNeutralRoll -= cnt; |
- | 826 | DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll); |
|
807 | DebugOut.Analog[24] = 10*(AdNeutralRoll - StartNeutralRoll); |
827 | |
808 | } |
828 | } |
809 | IntegralAccNick = 0; |
829 | IntegralAccNick = 0; |
810 | IntegralAccRoll = 0; |
830 | IntegralAccRoll = 0; |
811 | IntegralAccZ = 0; |
831 | IntegralAccZ = 0; |
812 | MittelIntegralNick = 0; |
832 | MittelIntegralNick = 0; |
813 | MittelIntegralRoll = 0; |
833 | MittelIntegralRoll = 0; |
814 | MittelIntegralNick2 = 0; |
834 | MittelIntegralNick2 = 0; |
815 | MittelIntegralRoll2 = 0; |
835 | MittelIntegralRoll2 = 0; |
816 | ZaehlMessungen = 0; |
836 | ZaehlMessungen = 0; |
- | 837 | } |
|
Line 817... | Line 838... | ||
817 | } |
838 | //DebugOut.Analog[31] = StickRoll / (26*IntegralFaktor); |
818 | 839 | ||
819 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
840 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
820 | // Gieren |
841 | // Gieren |
Line 906... | Line 927... | ||
906 | if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
927 | if(Looping_Roll) MesswertRoll = MesswertRoll * GyroFaktor; |
907 | else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
928 | else MesswertRoll = IntegralRoll * IntegralFaktor + MesswertRoll * GyroFaktor; |
908 | // MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor; |
929 | // MesswertGier = MesswertGier * (GyroFaktor/2) + Integral_Gier * IntegralFaktor; |
909 | MesswertGier = MesswertGier * (GyroFaktor) + Integral_Gier * IntegralFaktor/2; |
930 | MesswertGier = MesswertGier * (GyroFaktor) + Integral_Gier * IntegralFaktor/2; |
Line -... | Line 931... | ||
- | 931 | ||
- | 932 | DebugOut.Analog[28] = MesswertRoll; |
|
- | 933 | DebugOut.Analog[25] = IntegralRoll * IntegralFaktor; |
|
- | 934 | DebugOut.Analog[31] = StickRoll;// / (26*IntegralFaktor); |
|
910 | 935 | ||
911 | // Maximalwerte abfangen |
936 | // Maximalwerte abfangen |
912 | #define MAX_SENSOR 2048 |
937 | #define MAX_SENSOR 2048 |
913 | if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
938 | if(MesswertNick > MAX_SENSOR) MesswertNick = MAX_SENSOR; |
914 | if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
939 | if(MesswertNick < -MAX_SENSOR) MesswertNick = -MAX_SENSOR; |
Line 981... | Line 1006... | ||
981 | if(GasMischanteil < 20) GierMischanteil = 0; |
1006 | if(GasMischanteil < 20) GierMischanteil = 0; |
982 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1007 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
983 | // Nick-Achse |
1008 | // Nick-Achse |
984 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1009 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
985 | DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick)); // Differenz bestimmen |
1010 | DiffNick = Kp * (MesswertNick - (StickNick - GPS_Nick)); // Differenz bestimmen |
- | 1011 | if(IntegralRoll) SummeNick += IntegralNick * IntegralFaktor - StickNick; |
|
986 | SummeNick += DiffNick; // I-Anteil |
1012 | else SummeNick += DiffNick; // I-Anteil |
987 | if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1; |
1013 | if(SummeNick > 0) SummeNick-= (abs(SummeNick)/256 + 1); else SummeNick += abs(SummeNick)/256 + 1; |
988 | if(SummeNick > 16000) SummeNick = 16000; |
1014 | if(SummeNick > 16000) SummeNick = 16000; |
989 | if(SummeNick < -16000) SummeNick = -16000; |
1015 | if(SummeNick < -16000) SummeNick = -16000; |
990 | pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
1016 | pd_ergebnis = DiffNick + Ki * SummeNick; // PI-Regler für Nick |
991 | // Motor Vorn |
1017 | // Motor Vorn |
Line 1006... | Line 1032... | ||
1006 | Motor_Hinten = motorwert; |
1032 | Motor_Hinten = motorwert; |
1007 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1033 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1008 | // Roll-Achse |
1034 | // Roll-Achse |
1009 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1035 | // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
1010 | DiffRoll = Kp * (MesswertRoll - (StickRoll - GPS_Roll)); // Differenz bestimmen |
1036 | DiffRoll = Kp * (MesswertRoll - (StickRoll - GPS_Roll)); // Differenz bestimmen |
- | 1037 | if(IntegralRoll) SummeRoll += IntegralRoll * IntegralFaktor - StickRoll; |
|
1011 | SummeRoll += DiffRoll; // I-Anteil |
1038 | else SummeRoll += DiffRoll; // I-Anteil |
1012 | if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1; |
1039 | if(SummeRoll > 0) SummeRoll-= (abs(SummeRoll)/256 + 1); else SummeRoll += abs(SummeRoll)/256 + 1; |
1013 | if(SummeRoll > 16000) SummeRoll = 16000; |
1040 | if(SummeRoll > 16000) SummeRoll = 16000; |
1014 | if(SummeRoll < -16000) SummeRoll = -16000; |
1041 | if(SummeRoll < -16000) SummeRoll = -16000; |
1015 | pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
1042 | pd_ergebnis = DiffRoll + Ki * SummeRoll; // PI-Regler für Roll |
1016 | if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |
1043 | if(pd_ergebnis > MUL * (GasMischanteil + abs(GierMischanteil))) pd_ergebnis = MUL * (GasMischanteil + abs(GierMischanteil)); |