Rev 159 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 159 | Rev 160 | ||
---|---|---|---|
1 | /* |
1 | /* |
2 | This program (files gps.c and gps.h) is free software; you can redistribute it and/or modify |
2 | This program (files gps.c and gps.h) is free software; you can redistribute it and/or modify |
3 | it under the terms of the GNU General Public License as published by the Free Software Foundation; |
3 | it under the terms of the GNU General Public License as published by the Free Software Foundation; |
4 | either version 3 of the License, or (at your option) any later version. |
4 | either version 3 of the License, or (at your option) any later version. |
5 | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
5 | This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
6 | without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
6 | without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7 | GNU General Public License for more details. You should have received a copy of the GNU General Public License |
7 | GNU General Public License for more details. You should have received a copy of the GNU General Public License |
8 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
8 | along with this program. If not, see <http://www.gnu.org/licenses/>. |
9 | 9 | ||
10 | Please note: All the other files for the project "Mikrokopter" by H.Buss are under the license (license_buss.txt) published by www.mikrokopter.de |
10 | Please note: All the other files for the project "Mikrokopter" by H.Buss are under the license (license_buss.txt) published by www.mikrokopter.de |
11 | */ |
11 | */ |
12 | /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
12 | /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
13 | Peter Muehlenbrock |
13 | Peter Muehlenbrock |
14 | Auswertung der Daten vom GPS im ublox Format |
14 | Auswertung der Daten vom GPS im ublox Format |
15 | Regelung fuer GPS noch nicht implementiert |
15 | Regelung fuer GPS noch nicht implementiert |
16 | Stand 16.9.2007 |
16 | Stand 16.9.2007 |
17 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
17 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
18 | */ |
18 | */ |
19 | #include "main.h" |
19 | #include "main.h" |
20 | //#include "gps.h" |
20 | //#include "gps.h" |
21 | 21 | ||
22 | // Defines fuer ublox Messageformat um Auswertung zu steuern |
22 | // Defines fuer ublox Messageformat um Auswertung zu steuern |
23 | #define UBLOX_IDLE 0 |
23 | #define UBLOX_IDLE 0 |
24 | #define UBLOX_SYNC1 1 |
24 | #define UBLOX_SYNC1 1 |
25 | #define UBLOX_SYNC2 2 |
25 | #define UBLOX_SYNC2 2 |
26 | #define UBLOX_CLASS 3 |
26 | #define UBLOX_CLASS 3 |
27 | #define UBLOX_ID 4 |
27 | #define UBLOX_ID 4 |
28 | #define UBLOX_LEN1 5 |
28 | #define UBLOX_LEN1 5 |
29 | #define UBLOX_LEN2 6 |
29 | #define UBLOX_LEN2 6 |
30 | #define UBLOX_CKA 7 |
30 | #define UBLOX_CKA 7 |
31 | #define UBLOX_CKB 8 |
31 | #define UBLOX_CKB 8 |
32 | #define UBLOX_PAYLOAD 9 |
32 | #define UBLOX_PAYLOAD 9 |
33 | 33 | ||
34 | // ublox Protokoll Identifier |
34 | // ublox Protokoll Identifier |
35 | #define UBLOX_NAV_POSUTM 0x08 |
35 | #define UBLOX_NAV_POSUTM 0x08 |
36 | #define UBLOX_NAV_STATUS 0x03 |
36 | #define UBLOX_NAV_STATUS 0x03 |
37 | #define UBLOX_NAV_VELED 0x12 |
37 | #define UBLOX_NAV_VELED 0x12 |
38 | #define UBLOX_NAV_CLASS 0x01 |
38 | #define UBLOX_NAV_CLASS 0x01 |
39 | #define UBLOX_SYNCH1_CHAR 0xB5 |
39 | #define UBLOX_SYNCH1_CHAR 0xB5 |
40 | #define UBLOX_SYNCH2_CHAR 0x62 |
40 | #define UBLOX_SYNCH2_CHAR 0x62 |
41 | 41 | ||
42 | signed int GPS_Nick = 0; |
42 | signed int GPS_Nick = 0; |
43 | signed int GPS_Roll = 0; |
43 | signed int GPS_Roll = 0; |
44 | short int ublox_msg_state = UBLOX_IDLE; |
44 | short int ublox_msg_state = UBLOX_IDLE; |
45 | static uint8_t chk_a =0; //Checksum |
45 | static uint8_t chk_a =0; //Checksum |
46 | static uint8_t chk_b =0; |
46 | static uint8_t chk_b =0; |
47 | short int gps_state; |
47 | short int gps_state; |
48 | short int gps_updte_flag; |
48 | short int gps_updte_flag; |
49 | signed int GPS_hdng_abs_2trgt; //Winkel zum Ziel bezogen auf Nordpol |
49 | signed int GPS_hdng_abs_2trgt; //Winkel zum Ziel bezogen auf Nordpol |
50 | signed int GPS_hdng_rel_2trgt; //Winkel zum Ziel bezogen auf Nordachse des Kopters |
50 | signed int GPS_hdng_rel_2trgt; //Winkel zum Ziel bezogen auf Nordachse des Kopters |
51 | signed int GPS_dist_2trgt; //vorzeichenlose Distanz zum Ziel |
51 | signed int GPS_dist_2trgt; //vorzeichenlose Distanz zum Ziel |
52 | signed int gps_int_x,gps_int_y,gps_reg_x,gps_reg_y; |
52 | signed int gps_int_x,gps_int_y,gps_reg_x,gps_reg_y; |
53 | signed int ; |
53 | signed int ; |
54 | static unsigned int rx_len; |
54 | static unsigned int rx_len; |
55 | unsigned int cnt0,cnt1,cnt2; //******Provisorisch |
55 | unsigned int cnt0,cnt1,cnt2; //******Provisorisch |
56 | static unsigned int ptr_payload_data_end; |
56 | static unsigned int ptr_payload_data_end; |
57 | 57 | ||
58 | static uint8_t *ptr_payload_data; |
58 | static uint8_t *ptr_payload_data; |
59 | static uint8_t *ptr_pac_status; |
59 | static uint8_t *ptr_pac_status; |
60 | 60 | ||
61 | short int Get_GPS_data(void); |
61 | short int Get_GPS_data(void); |
62 | 62 | ||
63 | NAV_POSUTM_t actual_pos; // Aktuelle Nav Daten werden hier im ublox Format abgelegt |
63 | NAV_POSUTM_t actual_pos; // Aktuelle Nav Daten werden hier im ublox Format abgelegt |
64 | NAV_STATUS_t actual_status; // Aktueller Nav Status |
64 | NAV_STATUS_t actual_status; // Aktueller Nav Status |
65 | NAV_VELNED_t actual_speed; // Aktueller Geschwindigkeits und Richtungsdaten |
65 | NAV_VELNED_t actual_speed; // Aktueller Geschwindigkeits und Richtungsdaten |
66 | 66 | ||
67 | GPS_ABS_POSITION_t gps_act_position; // Alle wichtigen Daten zusammengefasst |
67 | GPS_ABS_POSITION_t gps_act_position; // Alle wichtigen Daten zusammengefasst |
68 | GPS_ABS_POSITION_t gps_home_position; // Die Startposition, beim Kalibrieren ermittelt |
68 | GPS_ABS_POSITION_t gps_home_position; // Die Startposition, beim Kalibrieren ermittelt |
69 | GPS_REL_POSITION_t gps_rel_act_position; // Die aktuelle relative Position bezogen auf Home Position |
69 | GPS_REL_POSITION_t gps_rel_act_position; // Die aktuelle relative Position bezogen auf Home Position |
70 | GPS_REL_POSITION_t gps_rel_hold_position; // Die gespeicherte Sollposition fuer GPS_ Hold Mode |
70 | GPS_REL_POSITION_t gps_rel_hold_position; // Die gespeicherte Sollposition fuer GPS_ Hold Mode |
71 | 71 | ||
72 | // Initialisierung |
72 | // Initialisierung |
73 | void GPS_Neutral(void) |
73 | void GPS_Neutral(void) |
74 | { |
74 | { |
75 | short int n; |
- | |
76 | ublox_msg_state = UBLOX_IDLE; |
75 | ublox_msg_state = UBLOX_IDLE; |
77 | gps_state = GPS_CRTL_IDLE; |
76 | gps_state = GPS_CRTL_IDLE; |
78 | actual_pos.status = 0; |
77 | actual_pos.status = 0; |
79 | actual_speed.status = 0; |
78 | actual_speed.status = 0; |
80 | actual_status.status = 0; |
79 | actual_status.status = 0; |
81 | gps_home_position.status = 0; // Noch keine gueltige Home Position |
80 | gps_home_position.status = 0; // Noch keine gueltige Home Position |
82 | gps_act_position.status = 0; |
81 | gps_act_position.status = 0; |
83 | gps_rel_act_position.status = 0; |
82 | gps_rel_act_position.status = 0; |
84 | GPS_Nick = 0; |
83 | GPS_Nick = 0; |
85 | GPS_Roll = 0; |
84 | GPS_Roll = 0; |
86 | gps_updte_flag = 0; |
85 | gps_updte_flag = 0; |
87 | gps_int_x = 0; |
86 | gps_int_x = 0; |
88 | gps_int_y = 0; |
87 | gps_int_y = 0; |
89 | 88 | ||
90 | } |
89 | } |
91 | 90 | ||
92 | // Home Position sichern falls Daten verfuegbar sind. |
91 | // Home Position sichern falls Daten verfuegbar sind. |
93 | void GPS_Save_Home(void) |
92 | void GPS_Save_Home(void) |
94 | { |
93 | { |
95 | short int n; |
94 | short int n; |
96 | n = Get_GPS_data(); |
95 | n = Get_GPS_data(); |
97 | if (n == 0) // Gueltige und aktuelle Daten ? |
96 | if (n == 0) // Gueltige und aktuelle Daten ? |
98 | { |
97 | { |
99 | // Neue GPS Daten liegen vor |
98 | // Neue GPS Daten liegen vor |
100 | gps_home_position.utm_east = gps_act_position.utm_east; |
99 | gps_home_position.utm_east = gps_act_position.utm_east; |
101 | gps_home_position.utm_north = gps_act_position.utm_north; |
100 | gps_home_position.utm_north = gps_act_position.utm_north; |
102 | gps_home_position.utm_alt = gps_act_position.utm_alt; |
101 | gps_home_position.utm_alt = gps_act_position.utm_alt; |
103 | gps_home_position.status = 1; // Home Position gueltig |
102 | gps_home_position.status = 1; // Home Position gueltig |
104 | } |
103 | } |
105 | } |
104 | } |
106 | 105 | ||
107 | // Relative Position zur Home Position bestimmen |
106 | // Relative Position zur Home Position bestimmen |
108 | // Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig |
107 | // Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig |
109 | short int Get_Rel_Position(void) |
108 | short int Get_Rel_Position(void) |
110 | { |
109 | { |
111 | short int n = 0; |
110 | short int n = 0; |
112 | n = Get_GPS_data(); |
111 | n = Get_GPS_data(); |
113 | if (n >=1) return (n); // nix zu tun, weil keine neue Daten da sind |
112 | if (n >=1) return (n); // nix zu tun, weil keine neue Daten da sind |
114 | if (gps_home_position.status > 0) //Nur wenn Home Position vorliegt |
113 | if (gps_home_position.status > 0) //Nur wenn Home Position vorliegt |
115 | { |
114 | { |
116 | gps_rel_act_position.utm_east = (int) (gps_act_position.utm_east - gps_home_position.utm_east); |
115 | gps_rel_act_position.utm_east = (int) (gps_act_position.utm_east - gps_home_position.utm_east); |
117 | gps_rel_act_position.utm_north = (int) (gps_act_position.utm_north - gps_home_position.utm_north); |
116 | gps_rel_act_position.utm_north = (int) (gps_act_position.utm_north - gps_home_position.utm_north); |
118 | gps_rel_act_position.status = 1; // gueltige Positionsdaten |
117 | gps_rel_act_position.status = 1; // gueltige Positionsdaten |
119 | n = 0; |
118 | n = 0; |
120 | gps_updte_flag = 1; // zeigt an, dass neue Daten vorliegen. |
119 | gps_updte_flag = 1; // zeigt an, dass neue Daten vorliegen. |
121 | } |
120 | } |
122 | else |
121 | else |
123 | { |
122 | { |
124 | n = 2; //keine gueltigen Daten vorhanden |
123 | n = 2; //keine gueltigen Daten vorhanden |
125 | gps_rel_act_position.status = 0; //keine gueltige Position weil keine home Position da ist. |
124 | gps_rel_act_position.status = 0; //keine gueltige Position weil keine home Position da ist. |
126 | } |
125 | } |
127 | return (n); |
126 | return (n); |
128 | } |
127 | } |
129 | 128 | ||
130 | // Daten aus aktuellen ublox Messages extrahieren |
129 | // Daten aus aktuellen ublox Messages extrahieren |
131 | // Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig |
130 | // Rueckgabewert 0= Daten sind aktuell und gueltig. 1= Keine Aenderung. 2= Daten ungueltig |
132 | short int Get_GPS_data(void) |
131 | short int Get_GPS_data(void) |
133 | { |
132 | { |
134 | short int n = 1; |
133 | short int n = 1; |
135 | 134 | ||
136 | if (actual_pos.status == 0) return (1); //damit es schnell geht, wenn nix zu tun ist |
135 | if (actual_pos.status == 0) return (1); //damit es schnell geht, wenn nix zu tun ist |
137 | if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0)) |
136 | if ((actual_pos.status > 0) && (actual_status.status > 0) && (actual_speed.status > 0)) |
138 | { |
137 | { |
139 | cnt1++; //**** noch Rausschmeissen |
138 | cnt1++; //**** noch Rausschmeissen |
140 | if (((actual_status.gpsfix_type & 0x03) >=2) && ((actual_status.nav_status_flag & 0x01) >=1)) // nur wenn Daten aktuell und gueltig sind |
139 | if (((actual_status.gpsfix_type & 0x03) >=2) && ((actual_status.nav_status_flag & 0x01) >=1)) // nur wenn Daten aktuell und gueltig sind |
141 | { |
140 | { |
142 | gps_act_position.utm_east = actual_pos.utm_east/10; |
141 | gps_act_position.utm_east = actual_pos.utm_east/10; |
143 | gps_act_position.utm_north = actual_pos.utm_north/10; |
142 | gps_act_position.utm_north = actual_pos.utm_north/10; |
144 | gps_act_position.utm_alt = actual_pos.utm_alt/10; |
143 | gps_act_position.utm_alt = actual_pos.utm_alt/10; |
145 | gps_act_position.speed_gnd = actual_speed.speed_gnd/10; |
144 | gps_act_position.speed_gnd = actual_speed.speed_gnd/10; |
146 | gps_act_position.speed_gnd = actual_speed.speed_gnd/10; |
145 | gps_act_position.speed_gnd = actual_speed.speed_gnd/10; |
147 | gps_act_position.heading = actual_speed.heading/100000; |
146 | gps_act_position.heading = actual_speed.heading/100000; |
148 | gps_act_position.status = 1; |
147 | gps_act_position.status = 1; |
149 | n = 0; //Daten gueltig |
148 | n = 0; //Daten gueltig |
150 | } |
149 | } |
151 | else |
150 | else |
152 | { |
151 | { |
153 | gps_act_position.status = 0; //Keine gueltigen Daten |
152 | gps_act_position.status = 0; //Keine gueltigen Daten |
154 | n = 2; |
153 | n = 2; |
155 | } |
154 | } |
156 | actual_pos.status = 0; //neue ublox Messages anfordern |
155 | actual_pos.status = 0; //neue ublox Messages anfordern |
157 | actual_status.status = 0; |
156 | actual_status.status = 0; |
158 | actual_speed.status = 0; |
157 | actual_speed.status = 0; |
159 | } |
158 | } |
160 | return (n); |
159 | return (n); |
161 | } |
160 | } |
162 | 161 | ||
163 | 162 | ||
164 | /* |
163 | /* |
165 | Daten vom GPS im ublox MSG Format auswerten |
164 | Daten vom GPS im ublox MSG Format auswerten |
166 | Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul durch den UART IRQ aufgerufen |
165 | Die Routine wird bei jedem Empfang eines Zeichens vom GPS Modul durch den UART IRQ aufgerufen |
167 | // Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein |
166 | // Die UBX Messages NAV_POSUTM, NAV_STATUS und NAV_VALED muessen aktiviert sein |
168 | */ |
167 | */ |
169 | void Get_Ublox_Msg(uint8_t rx) |
168 | void Get_Ublox_Msg(uint8_t rx) |
170 | { |
169 | { |
171 | 170 | ||
172 | switch (ublox_msg_state) |
171 | switch (ublox_msg_state) |
173 | { |
172 | { |
174 | 173 | ||
175 | case UBLOX_IDLE: // Zuerst Synchcharacters pruefen |
174 | case UBLOX_IDLE: // Zuerst Synchcharacters pruefen |
176 | if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1; |
175 | if ( rx == UBLOX_SYNCH1_CHAR ) ublox_msg_state = UBLOX_SYNC1; |
177 | else ublox_msg_state = UBLOX_IDLE; |
176 | else ublox_msg_state = UBLOX_IDLE; |
178 | break; |
177 | break; |
179 | 178 | ||
180 | case UBLOX_SYNC1: |
179 | case UBLOX_SYNC1: |
181 | 180 | ||
182 | if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2; |
181 | if (rx == UBLOX_SYNCH2_CHAR) ublox_msg_state = UBLOX_SYNC2; |
183 | else ublox_msg_state = UBLOX_IDLE; |
182 | else ublox_msg_state = UBLOX_IDLE; |
184 | chk_a = 0,chk_b = 0; |
183 | chk_a = 0,chk_b = 0; |
185 | break; |
184 | break; |
186 | 185 | ||
187 | case UBLOX_SYNC2: |
186 | case UBLOX_SYNC2: |
188 | if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS; |
187 | if (rx == UBLOX_NAV_CLASS) ublox_msg_state = UBLOX_CLASS; |
189 | else ublox_msg_state = UBLOX_IDLE; |
188 | else ublox_msg_state = UBLOX_IDLE; |
190 | break; |
189 | break; |
191 | 190 | ||
192 | case UBLOX_CLASS: // Nur NAV Meldungen auswerten |
191 | case UBLOX_CLASS: // Nur NAV Meldungen auswerten |
193 | switch (rx) |
192 | switch (rx) |
194 | { |
193 | { |
195 | case UBLOX_NAV_POSUTM: |
194 | case UBLOX_NAV_POSUTM: |
196 | ptr_pac_status = &actual_pos.status; |
195 | ptr_pac_status = &actual_pos.status; |
197 | if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden |
196 | if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; //Abbruch weil Daten noch nicht verwendet wurden |
198 | else |
197 | else |
199 | { |
198 | { |
200 | ptr_payload_data = &actual_pos; |
199 | ptr_payload_data = &actual_pos; |
201 | ptr_payload_data_end = &actual_pos.status; |
200 | ptr_payload_data_end = &actual_pos.status; |
202 | ublox_msg_state = UBLOX_LEN1; |
201 | ublox_msg_state = UBLOX_LEN1; |
203 | } |
202 | } |
204 | break; |
203 | break; |
205 | 204 | ||
206 | case UBLOX_NAV_STATUS: |
205 | case UBLOX_NAV_STATUS: |
207 | ptr_pac_status = &actual_status.status; |
206 | ptr_pac_status = &actual_status.status; |
208 | if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; |
207 | if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; |
209 | else |
208 | else |
210 | { |
209 | { |
211 | ptr_payload_data = &actual_status; |
210 | ptr_payload_data = &actual_status; |
212 | ptr_payload_data_end = &actual_status.status; |
211 | ptr_payload_data_end = &actual_status.status; |
213 | ublox_msg_state = UBLOX_LEN1; |
212 | ublox_msg_state = UBLOX_LEN1; |
214 | } |
213 | } |
215 | break; |
214 | break; |
216 | 215 | ||
217 | case UBLOX_NAV_VELED: |
216 | case UBLOX_NAV_VELED: |
218 | ptr_pac_status = &actual_speed.status; |
217 | ptr_pac_status = &actual_speed.status; |
219 | if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; |
218 | if (*ptr_pac_status > 0) ublox_msg_state = UBLOX_IDLE; |
220 | else |
219 | else |
221 | { |
220 | { |
222 | ptr_payload_data = &actual_speed; |
221 | ptr_payload_data = &actual_speed; |
223 | ptr_payload_data_end = &actual_speed.status; |
222 | ptr_payload_data_end = &actual_speed.status; |
224 | ublox_msg_state = UBLOX_LEN1; |
223 | ublox_msg_state = UBLOX_LEN1; |
225 | } |
224 | } |
226 | break; |
225 | break; |
227 | 226 | ||
228 | default: |
227 | default: |
229 | ublox_msg_state = UBLOX_IDLE; |
228 | ublox_msg_state = UBLOX_IDLE; |
230 | break; |
229 | break; |
231 | } |
230 | } |
232 | chk_a = UBLOX_NAV_CLASS + rx; |
231 | chk_a = UBLOX_NAV_CLASS + rx; |
233 | chk_b = UBLOX_NAV_CLASS + chk_a; |
232 | chk_b = UBLOX_NAV_CLASS + chk_a; |
234 | break; |
233 | break; |
235 | 234 | ||
236 | case UBLOX_LEN1: // Laenge auswerten |
235 | case UBLOX_LEN1: // Laenge auswerten |
237 | rx_len = rx; |
236 | rx_len = rx; |
238 | chk_a += rx; |
237 | chk_a += rx; |
239 | chk_b += chk_a; |
238 | chk_b += chk_a; |
240 | ublox_msg_state = UBLOX_LEN2; |
239 | ublox_msg_state = UBLOX_LEN2; |
241 | break; |
240 | break; |
242 | 241 | ||
243 | 242 | ||
244 | case UBLOX_LEN2: // Laenge auswerten |
243 | case UBLOX_LEN2: // Laenge auswerten |
245 | rx_len = rx_len + (rx *256); // Laenge ermitteln |
244 | rx_len = rx_len + (rx *256); // Laenge ermitteln |
246 | chk_a += rx; |
245 | chk_a += rx; |
247 | chk_b += chk_a; |
246 | chk_b += chk_a; |
248 | ublox_msg_state = UBLOX_PAYLOAD; |
247 | ublox_msg_state = UBLOX_PAYLOAD; |
249 | break; |
248 | break; |
250 | 249 | ||
251 | case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen |
250 | case UBLOX_PAYLOAD: // jetzt Nutzdaten einlesen |
252 | if (rx_len > 0) |
251 | if (rx_len > 0) |
253 | { |
252 | { |
254 | *ptr_payload_data = rx; |
253 | *ptr_payload_data = rx; |
255 | chk_a += rx; |
254 | chk_a += rx; |
256 | chk_b += chk_a; |
255 | chk_b += chk_a; |
257 | --rx_len; |
256 | --rx_len; |
258 | if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end)) |
257 | if ((rx_len > 0) && (ptr_payload_data <= ptr_payload_data_end)) |
259 | { |
258 | { |
260 | ptr_payload_data++; |
259 | ptr_payload_data++; |
261 | ublox_msg_state = UBLOX_PAYLOAD; |
260 | ublox_msg_state = UBLOX_PAYLOAD; |
262 | } |
261 | } |
263 | else ublox_msg_state = UBLOX_CKA; |
262 | else ublox_msg_state = UBLOX_CKA; |
264 | } |
263 | } |
265 | else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler |
264 | else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler |
266 | break; |
265 | break; |
267 | 266 | ||
268 | case UBLOX_CKA: // Checksum pruefen |
267 | case UBLOX_CKA: // Checksum pruefen |
269 | if (rx == chk_a) ublox_msg_state = UBLOX_CKB; |
268 | if (rx == chk_a) ublox_msg_state = UBLOX_CKB; |
270 | else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler |
269 | else ublox_msg_state = UBLOX_IDLE; // Abbruch wegen Fehler |
271 | break; |
270 | break; |
272 | 271 | ||
273 | case UBLOX_CKB: // Checksum pruefen |
272 | case UBLOX_CKB: // Checksum pruefen |
274 | if (rx == chk_b) *ptr_pac_status = 1; // Paket ok |
273 | if (rx == chk_b) *ptr_pac_status = 1; // Paket ok |
275 | ublox_msg_state = UBLOX_IDLE; |
274 | ublox_msg_state = UBLOX_IDLE; |
276 | break; |
275 | break; |
277 | 276 | ||
278 | default: |
277 | default: |
279 | ublox_msg_state = UBLOX_IDLE; |
278 | ublox_msg_state = UBLOX_IDLE; |
280 | break; |
279 | break; |
281 | } |
280 | } |
282 | } |
281 | } |
283 | 282 | ||
284 | //Zentrale Statemachine fuer alle GPS relevanten Regelungsablauefe |
283 | //Zentrale Statemachine fuer alle GPS relevanten Regelungsablauefe |
285 | short int GPS_CRTL(short int cmd) |
284 | short int GPS_CRTL(short int cmd) |
286 | { |
285 | { |
287 | static unsigned int cnt; //Zaehler fuer diverse Verzoegerungen |
286 | static unsigned int cnt; //Zaehler fuer diverse Verzoegerungen |
288 | 287 | int n; |
|
- | 288 | long int dist; |
|
289 | switch (cmd) |
289 | switch (cmd) |
290 | { |
290 | { |
291 | case GPS_CMD_REQ_HOLD: // Die Lageregelung soll aktiviert werden. |
291 | case GPS_CMD_REQ_HOLD: // Die Lageregelung soll aktiviert werden. |
292 | if (gps_state != GPS_CRTL_HOLD_ACTIVE) |
292 | if (gps_state != GPS_CRTL_HOLD_ACTIVE) |
293 | { |
293 | { |
294 | cnt++; |
294 | cnt++; |
295 | if (cnt > 300) // erst nach Verzoegerung |
295 | if (cnt > 500) // erst nach Verzoegerung |
296 | { |
296 | { |
297 | cnt = 0; |
297 | cnt = 0; |
298 | // aktuelle positionsdaten abespeichern |
298 | // aktuelle positionsdaten abespeichern |
299 | if (gps_rel_act_position.status > 0) |
299 | if (gps_rel_act_position.status > 0) |
300 | { |
300 | { |
301 | gps_rel_hold_position.utm_east = gps_rel_act_position.utm_east; |
301 | gps_rel_hold_position.utm_east = gps_rel_act_position.utm_east; |
302 | gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north; |
302 | gps_rel_hold_position.utm_north = gps_rel_act_position.utm_north; |
303 | gps_rel_hold_position.status = 1; // gueltige Positionsdaten |
303 | gps_rel_hold_position.status = 1; // gueltige Positionsdaten |
304 | gps_state = GPS_CRTL_HOLD_ACTIVE; |
304 | gps_state = GPS_CRTL_HOLD_ACTIVE; |
305 | return (GPS_STST_OK); |
305 | return (GPS_STST_OK); |
306 | } |
306 | } |
307 | else |
307 | else |
308 | { |
308 | { |
309 | gps_rel_hold_position.status = 0; //Keine Daten verfuegbar |
309 | gps_rel_hold_position.status = 0; //Keine Daten verfuegbar |
310 | gps_state = GPS_CRTL_IDLE; |
310 | gps_state = GPS_CRTL_IDLE; |
311 | return(GPS_STST_ERR); // Keine Daten da |
311 | return(GPS_STST_ERR); // Keine Daten da |
312 | } |
312 | } |
313 | } |
313 | } |
314 | else return(GPS_STST_PEND); // noch warten |
314 | else return(GPS_STST_PEND); // noch warten |
315 | } |
315 | } |
316 | break; |
316 | break; |
317 | 317 | ||
318 | case GPS_CMD_STOP_HOLD: // Lageregelung beenden |
318 | case GPS_CMD_STOP_HOLD: // Lageregelung beenden |
319 | cnt = 0; |
319 | cnt = 0; |
320 | GPS_Nick = 0; |
320 | GPS_Nick = 0; |
321 | GPS_Roll = 0; |
321 | GPS_Roll = 0; |
322 | gps_state = GPS_CRTL_IDLE; |
322 | gps_state = GPS_CRTL_IDLE; |
323 | gps_int_x = 0; |
323 | gps_int_x = 0; |
324 | gps_int_y = 0; |
324 | gps_int_y = 0; |
325 | return (GPS_STST_OK); |
325 | return (GPS_STST_OK); |
326 | break; |
326 | break; |
327 | 327 | ||
328 | default: |
328 | default: |
329 | return (GPS_STST_ERR); |
329 | return (GPS_STST_ERR); |
330 | break; |
330 | break; |
331 | } |
331 | } |
332 | 332 | ||
333 | switch (gps_state) |
333 | switch (gps_state) |
334 | { |
334 | { |
335 | case GPS_CRTL_IDLE: |
335 | case GPS_CRTL_IDLE: |
336 | cnt = 0; |
336 | cnt = 0; |
337 | return (GPS_STST_OK); |
337 | return (GPS_STST_OK); |
338 | break; |
338 | break; |
339 | 339 | ||
340 | case GPS_CRTL_HOLD_ACTIVE: // Hier werden die Daten fuer Nick und Roll errechnet |
340 | case GPS_CRTL_HOLD_ACTIVE: // Hier werden die Daten fuer Nick und Roll errechnet |
341 | if (gps_updte_flag == 1) //nur wenn neue GPS Daten vorliegen |
341 | if (gps_updte_flag == 1) //nur wenn neue GPS Daten vorliegen |
342 | { |
342 | { |
343 | gps_updte_flag = 0; |
343 | gps_updte_flag = 0; |
344 | // ab hier wird geregelt |
344 | // ab hier wird geregelt |
345 | signed int dist_north,dist_east; |
345 | signed int dist_north,dist_east; |
346 | dist_east = gps_rel_hold_position.utm_east - gps_rel_act_position.utm_east; |
346 | dist_east = gps_rel_hold_position.utm_east - gps_rel_act_position.utm_east; |
347 | dist_north = gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north; |
347 | dist_north = gps_rel_hold_position.utm_north - gps_rel_act_position.utm_north; |
348 | 348 | ||
349 | //PI Regler |
349 | //PI Regler |
350 | gps_int_x = gps_int_x + (dist_east * Parameter_UserParam1)/16; // Integrator |
350 | gps_int_x = gps_int_x + (dist_east * Parameter_UserParam1)/16; // Integrator |
351 | gps_int_y = gps_int_y + (dist_north * Parameter_UserParam1)/16; |
351 | gps_int_y = gps_int_y + (dist_north * Parameter_UserParam1)/16; |
352 | if ((gps_int_x >= 4096) || (gps_int_y >= 4096) || (gps_int_x < - 4096) || (gps_int_y <= -4096)) |
352 | if ((gps_int_x >= 4096) || (gps_int_y >= 4096) || (gps_int_x < - 4096) || (gps_int_y <= -4096)) |
353 | { |
353 | { |
354 | gps_int_x -= (dist_east * Parameter_UserParam1)/16; // Integrator stoppen |
354 | gps_int_x -= (dist_east * Parameter_UserParam1)/16; // Integrator stoppen |
355 | gps_int_y -= (dist_north * Parameter_UserParam1)/16; |
355 | gps_int_y -= (dist_north * Parameter_UserParam1)/16; |
356 | } |
356 | } |
357 | gps_reg_x = gps_int_x + (dist_east * Parameter_UserParam2)/16; // P Anteil dazu |
357 | gps_reg_x = gps_int_x + (dist_east * Parameter_UserParam2)/16; // P Anteil dazu |
358 | gps_reg_y = gps_int_y + (dist_north * Parameter_UserParam2)/16; |
358 | gps_reg_y = gps_int_y + (dist_north * Parameter_UserParam2)/16; |
359 | 359 | ||
360 | //Richtung bezogen auf Nordpol bestimmen |
360 | //Richtung bezogen auf Nordpol bestimmen |
361 | GPS_hdng_abs_2trgt = arctan_i((long)gps_reg_x,(long)gps_reg_y); |
361 | GPS_hdng_abs_2trgt = arctan_i((long)gps_reg_x,(long)gps_reg_y); |
362 | 362 | ||
363 | //in Winkel 0..360 grad umrechnen |
363 | //in Winkel 0..360 grad umrechnen |
364 | if ((dist_east >= 0) && (dist_north < 0)) GPS_hdng_abs_2trgt = ( 90-GPS_hdng_abs_2trgt); |
364 | if ((gps_reg_x >= 0) && (gps_reg_y < 0)) GPS_hdng_abs_2trgt = ( 90-GPS_hdng_abs_2trgt); |
365 | else if ((dist_east < 0) ) GPS_hdng_abs_2trgt = (270 - GPS_hdng_abs_2trgt); |
365 | else if ((gps_reg_x < 0) ) GPS_hdng_abs_2trgt = (270 - GPS_hdng_abs_2trgt); |
366 | // Relative Richtung in bezug auf Nordachse des Kopters errechen |
366 | // Relative Richtung in bezug auf Nordachse des Kopters errechen |
367 | int n,m; |
- | |
368 | n= GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT; |
367 | n= GyroKomp_Int/GYROKOMP_INC_GRAD_DEFAULT; |
369 | GPS_hdng_rel_2trgt = GPS_hdng_abs_2trgt - n; |
368 | GPS_hdng_rel_2trgt = GPS_hdng_abs_2trgt - n; |
370 | if ((GPS_hdng_rel_2trgt >180) && (GPS_hdng_abs_2trgt >=180))GPS_hdng_rel_2trgt = GPS_hdng_rel_2trgt-360; |
369 | if ((GPS_hdng_rel_2trgt >180) && (GPS_hdng_abs_2trgt >=180))GPS_hdng_rel_2trgt = GPS_hdng_rel_2trgt-360; |
371 | else if (GPS_hdng_rel_2trgt >180) GPS_hdng_rel_2trgt = 360 - GPS_hdng_rel_2trgt; |
370 | else if (GPS_hdng_rel_2trgt >180) GPS_hdng_rel_2trgt = 360 - GPS_hdng_rel_2trgt; |
372 | else if (GPS_hdng_rel_2trgt <-180) GPS_hdng_rel_2trgt = 360 + GPS_hdng_rel_2trgt; |
371 | else if (GPS_hdng_rel_2trgt <-180) GPS_hdng_rel_2trgt = 360 + GPS_hdng_rel_2trgt; |
- | 372 | ||
- | 373 | // Regelabweichung aus x,y zu Ziel in Distanz umrechnen |
|
- | 374 | ||
- | 375 | if (abs(gps_reg_x) > abs(gps_reg_y) ) |
|
- | 376 | { |
|
- | 377 | dist = (long)gps_reg_x; //Groesseren Wert wegen besserer genauigkeit nehmen |
|
- | 378 | dist = abs((dist *1000) / (long) cos_i(GPS_hdng_rel_2trgt)); |
|
- | 379 | } |
|
- | 380 | else |
|
- | 381 | { |
|
- | 382 | dist = (long)gps_reg_y; |
|
- | 383 | dist = abs((dist *1000) / (long) sin_i(GPS_hdng_rel_2trgt)); |
|
- | 384 | } |
|
373 | 385 | if (dist > 30000) dist = 30000; |
|
- | 386 | GPS_dist_2trgt = (int )dist; |
|
- | 387 | ||
- | 388 | // Winkel und Distanz in Nick und Roll groessen umrechnen |
|
- | 389 | long int a,b; |
|
374 | // Distanz zum Ziel ermitteln |
390 | GPS_Roll = (int) -((dist * sin_i(GPS_hdng_rel_2trgt))/(1000*4)); |
- | 391 | GPS_Nick = (int) -((dist * cos_i(GPS_hdng_rel_2trgt))/(1000*4)); |
|
- | 392 | ||
- | 393 | if (GPS_Roll > GPS_ROLL_MAX) GPS_Roll = GPS_ROLL_MAX; //Auf Maxwerte begrenzen |
|
- | 394 | else if (GPS_Roll < -GPS_ROLL_MAX) GPS_Roll = - GPS_ROLL_MAX; |
|
- | 395 | if (GPS_Nick > GPS_NICK_MAX) GPS_Nick = GPS_NICK_MAX; |
|
- | 396 | else if (GPS_Nick < -GPS_NICK_MAX) GPS_Nick = - GPS_NICK_MAX; |
|
375 | GPS_dist_2trgt = abs(dist_north) + abs(dist_east);//ACHTUNG: Noch Nicht korrekt |
397 | |
376 | return (GPS_STST_OK); |
398 | return (GPS_STST_OK); |
377 | } |
399 | } |
378 | else return (GPS_STST_OK); |
400 | else return (GPS_STST_OK); |
379 | break; |
401 | break; |
380 | 402 | ||
381 | default: |
403 | default: |
382 | gps_state = GPS_CRTL_IDLE; |
404 | gps_state = GPS_CRTL_IDLE; |
383 | return (GPS_STST_ERR); |
405 | return (GPS_STST_ERR); |
384 | break; |
406 | break; |
385 | } |
407 | } |
386 | return (GPS_STST_ERR); |
408 | return (GPS_STST_ERR); |
387 | 409 | ||
388 | } |
410 | } |
389 | 411 | ||
390 | 412 |