Subversion Repositories FlightCtrl

Rev

Rev 155 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 155 Rev 161
1
/*
1
/*
2
This program (files math.c and math.h) is free software; you can redistribute it and/or modify
2
This program (files math.c and math.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
Winkelfunktionen sin, cos und arctan in
14
Winkelfunktionen sin, cos und arctan in
15
brute-force Art: Sehr Schnell, nicht sonderlich genau, aber ausreichend
15
brute-force Art: Sehr Schnell, nicht sonderlich genau, aber ausreichend
16
Stand 11.9.2007
16
Stand 20.9.2007
17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
17
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
18
*/
18
*/
19
#include "main.h"
19
#include "main.h"
20
 
20
 
21
 
21
 
22
// arctan Funktion: Eingabewert x,y Rueckgabe =arctan(x,y) in grad
22
// arctan Funktion: Eingabewert x,y Rueckgabe =arctan(x,y) in grad
23
int arctan_i(long signed int x, long signed int y)
23
int arctan_i(long signed int x, long signed int y)
24
{
24
{
25
        short int change_xy = 0;
25
        short int change_xy = 0;
26
        signed int i;
26
        signed int i;
27
        long signed int wert;
27
        long signed int wert;
28
        int return_value;
28
        int return_value;
29
 
29
 
30
        if ((abs(x)) > (abs(y)))  // x,y Werte vertauschen damit arctan <45 grad bleibt
30
        if ((abs(x)) > (abs(y)))  // x,y Werte vertauschen damit arctan <45 grad bleibt
31
        {      
31
        {      
32
                change_xy       = 1;
32
                change_xy       = 1;
33
                i                       = x;
33
                i                       = x;
34
                x                       = y;
34
                x                       = y;
35
                y                       = i;
35
                y                       = i;
36
        }
36
        }
37
       
37
       
38
        // Quadranten ermitteln
38
        // Quadranten ermitteln
39
 
39
 
40
        // Wert durch lineare Interpolation ermitteln 
40
        // Wert durch lineare Interpolation ermitteln 
41
        wert= abs((x*1000)/y);
41
        wert= abs((x*1000)/y);
42
 
42
 
43
        if (wert <=268) //0...0.0,268  entsprechend 0..15 Grad
43
        if (wert <=268) //0...0.0,268  entsprechend 0..15 Grad
44
        {
44
        {
45
                return_value = (int)((wert*100)/(268-0)*(15-0)/100) +0;
45
                return_value = (int)((wert*100)/(268-0)*(15-0)/100) +0;
46
        }
46
        }
47
        else if (wert <=578) //0,268...0.0,568  entsprechend 15..30 Grad
47
        else if (wert <=578) //0,268...0.0,568  entsprechend 15..30 Grad
48
        {      
48
        {      
49
                return_value = (int)((((wert-268)*100)/(578-268)*(30-15))/100) +15;            
49
                return_value = (int)((((wert-268)*100)/(578-268)*(30-15))/100) +15;            
50
        }
50
        }
51
        else //0,568...1  entsprechend 30..45 Grad
51
        else //0,568...1  entsprechend 30..45 Grad
52
        {      
52
        {      
53
                return_value = (int)((((wert-578)*50)/(1000-578)*(45-30))/50) +30;             
53
                return_value = (int)((((wert-578)*50)/(1000-578)*(45-30))/50) +30;             
54
        }
54
        }
55
 
55
 
56
        if (change_xy > 0)  return_value = 90-return_value; //Quadrant 45..90 Grad
56
        if (change_xy == 0)  return_value = 90-return_value; //Quadrant 45..90 Grad
57
        if ((x > 0) && (y <0)) return_value = - return_value;
57
        if ((x >= 0) && (y <0)) return_value = - return_value;
58
        else if ((x < 0) && (y > 0)) return_value = - return_value;
58
        else if ((x < 0) && (y >= 0)) return_value = - return_value;
59
 
59
 
60
return return_value;
60
return return_value;
61
}
61
}
62
 
62
 
63
 
63
 
64
// cosinus Funktion: Eingabewert Winkel in Grad, Rueckgabe =cos(winkel)*1000
64
// cosinus Funktion: Eingabewert Winkel in Grad, Rueckgabe =cos(winkel)*1000
65
signed int cos_i(signed int winkel)
65
signed int cos_i(signed int winkel)
66
{
66
{
67
  winkel = sin_i(90-winkel);
67
  winkel = sin_i(90-winkel);
68
  return winkel;
68
  return winkel;
69
}
69
}
70
 
70
 
71
 
71
 
72
// sinus Funktion: Eingabewert Winkel in Grad, Rueckgabe =sin(winkel)*1000
72
// sinus Funktion: Eingabewert Winkel in Grad, Rueckgabe =sin(winkel)*1000
73
signed int sin_i(signed int winkel)
73
signed int sin_i(signed int winkel)
74
{
74
{
75
 short int m;
75
 short int m;
76
 winkel = winkel % 360;
76
 winkel = winkel % 360;
77
 // Quadranten auswerten
77
 // Quadranten auswerten
78
 if ((winkel >= 90 ) && (winkel <180))
78
 if ((winkel >= 90 ) && (winkel <180))
79
 {
79
 {
80
        winkel = 180 - winkel;
80
        winkel = 180 - winkel;
81
        m = 1;
81
        m = 1;
82
 }
82
 }
83
 else if ((winkel >= 180 ) && (winkel <270))
83
 else if ((winkel >= 180 ) && (winkel <270))
84
 {
84
 {
85
        winkel = winkel - 180;
85
        winkel = winkel - 180;
86
        m = -1;
86
        m = -1;
87
 }
87
 }
88
 else if ((winkel >= 270 ) && (winkel < 360))
88
 else if ((winkel >= 270 ) && (winkel < 360))
89
 {
89
 {
90
        winkel = 360 -winkel ;
90
        winkel = 360 -winkel ;
91
        m = -1;
91
        m = -1;
92
 }
92
 }
93
 else if ((winkel < 0) && (winkel > -90))
93
 else if ((winkel < 0) && (winkel > -90))
94
 {
94
 {
95
        winkel = (abs(winkel));
95
        winkel = (abs(winkel));
96
        m = -1;
96
        m = -1;
97
 }
97
 }
98
else if ((winkel < -90) && (winkel > -180))
98
else if ((winkel < -90) && (winkel > -180))
99
 {
99
 {
100
        winkel = 180-(abs(winkel));
100
        winkel = 180-(abs(winkel));
101
        m = -1;
101
        m = -1;
102
 }
102
 }
103
else if ((winkel < -180) && (winkel > -270))
103
else if ((winkel < -180) && (winkel > -270))
104
 {
104
 {
105
        winkel = (abs(winkel))-180;
105
        winkel = (abs(winkel))-180;
106
        m = +1;
106
        m = +1;
107
 }
107
 }
108
else if ((winkel < -270) && (winkel > -360))
108
else if ((winkel < -270) && (winkel > -360))
109
 {
109
 {
110
        winkel = 360-abs(winkel);
110
        winkel = 360-abs(winkel);
111
        m = +1;
111
        m = +1;
112
 }
112
 }
113
 else  
113
 else  
114
 {
114
 {
115
        m = +1;
115
        m = +1;
116
 }
116
 }
117
 
117
 
118
 
118
 
119
 //Aus Tabelle Werte holen
119
 //Aus Tabelle Werte holen
120
        switch (winkel)
120
        switch (winkel)
121
        {
121
        {
122
                case 1:
122
                case 1:
123
                        winkel = 17;
123
                        winkel = 17;
124
                        break;
124
                        break;
125
                case 2:
125
                case 2:
126
                        winkel = 35;
126
                        winkel = 35;
127
                        break;
127
                        break;
128
                case 3:
128
                case 3:
129
                        winkel = 52;
129
                        winkel = 52;
130
                        break;
130
                        break;
131
                case 4:
131
                case 4:
132
                        winkel = 70;
132
                        winkel = 70;
133
                        break;
133
                        break;
134
                case 5:
134
                case 5:
135
                        winkel = 87;
135
                        winkel = 87;
136
                        break;
136
                        break;
137
                case 6:
137
                case 6:
138
                        winkel = 105;
138
                        winkel = 105;
139
                        break;
139
                        break;
140
                case 7:
140
                case 7:
141
                        winkel = 122;
141
                        winkel = 122;
142
                        break;
142
                        break;
143
                case 8:
143
                case 8:
144
                        winkel = 139;
144
                        winkel = 139;
145
                        break;
145
                        break;
146
                case 9:
146
                case 9:
147
                        winkel = 156;
147
                        winkel = 156;
148
                        break;
148
                        break;
149
                case 10:
149
                case 10:
150
                        winkel = 174;
150
                        winkel = 174;
151
                        break;
151
                        break;
152
                case 11:
152
                case 11:
153
                        winkel = 191;
153
                        winkel = 191;
154
                        break;
154
                        break;
155
                case 12:
155
                case 12:
156
                        winkel = 208;
156
                        winkel = 208;
157
                        break;
157
                        break;
158
                case 13:
158
                case 13:
159
                        winkel = 225;
159
                        winkel = 225;
160
                        break;
160
                        break;
161
                case 14:
161
                case 14:
162
                        winkel = 242;
162
                        winkel = 242;
163
                        break;
163
                        break;
164
                case 15:
164
                case 15:
165
                        winkel = 259;
165
                        winkel = 259;
166
                        break;
166
                        break;
167
                case 16:
167
                case 16:
168
                        winkel = 276;
168
                        winkel = 276;
169
                        break;
169
                        break;
170
                case 17:
170
                case 17:
171
                        winkel = 292;
171
                        winkel = 292;
172
                        break;
172
                        break;
173
                case 18:
173
                case 18:
174
                        winkel = 309;
174
                        winkel = 309;
175
                        break;
175
                        break;
176
                case 19:
176
                case 19:
177
                        winkel = 326;
177
                        winkel = 326;
178
                        break;
178
                        break;
179
                case 20:
179
                case 20:
180
                        winkel = 342;
180
                        winkel = 342;
181
                        break;
181
                        break;
182
                case 21:
182
                case 21:
183
                        winkel = 359;
183
                        winkel = 359;
184
                        break;
184
                        break;
185
                case 22:
185
                case 22:
186
                        winkel = 375;
186
                        winkel = 375;
187
                        break;
187
                        break;
188
                case 23:
188
                case 23:
189
                        winkel = 391;
189
                        winkel = 391;
190
                        break;
190
                        break;
191
                case 24:
191
                case 24:
192
                        winkel = 407;
192
                        winkel = 407;
193
                        break;
193
                        break;
194
                case 25:
194
                case 25:
195
                        winkel = 423;
195
                        winkel = 423;
196
                        break;
196
                        break;
197
                case 26:
197
                case 26:
198
                        winkel = 438;
198
                        winkel = 438;
199
                        break;
199
                        break;
200
                case 27:
200
                case 27:
201
                        winkel = 454;
201
                        winkel = 454;
202
                        break;
202
                        break;
203
                case 28:
203
                case 28:
204
                        winkel = 469;
204
                        winkel = 469;
205
                        break;
205
                        break;
206
                case 29:
206
                case 29:
207
                        winkel = 485;
207
                        winkel = 485;
208
                        break;
208
                        break;
209
                case 30:
209
                case 30:
210
                        winkel = 500;
210
                        winkel = 500;
211
                        break;
211
                        break;
212
                case 31:
212
                case 31:
213
                        winkel = 515;
213
                        winkel = 515;
214
                        break;
214
                        break;
215
                case 32:
215
                case 32:
216
                        winkel = 530;
216
                        winkel = 530;
217
                        break;
217
                        break;
218
                case 33:
218
                case 33:
219
                        winkel = 545;
219
                        winkel = 545;
220
                        break;
220
                        break;
221
                case 34:
221
                case 34:
222
                        winkel = 559;
222
                        winkel = 559;
223
                        break;
223
                        break;
224
                case 35:
224
                case 35:
225
                        winkel = 574;
225
                        winkel = 574;
226
                        break;
226
                        break;
227
                case 36:
227
                case 36:
228
                        winkel = 588;
228
                        winkel = 588;
229
                        break;
229
                        break;
230
                case 37:
230
                case 37:
231
                        winkel = 602;
231
                        winkel = 602;
232
                        break;
232
                        break;
233
                case 38:
233
                case 38:
234
                        winkel = 616;
234
                        winkel = 616;
235
                        break;
235
                        break;
236
                case 39:
236
                case 39:
237
                        winkel = 630;
237
                        winkel = 630;
238
                        break;
238
                        break;
239
                case 40:
239
                case 40:
240
                        winkel = 643;
240
                        winkel = 643;
241
                        break;
241
                        break;
242
                case 41:
242
                case 41:
243
                        winkel = 656;
243
                        winkel = 656;
244
                        break;
244
                        break;
245
                case 42:
245
                case 42:
246
                        winkel = 682;
246
                        winkel = 682;
247
                        break;
247
                        break;
248
                case 43:
248
                case 43:
249
                        winkel = 682;
249
                        winkel = 682;
250
                        break;
250
                        break;
251
                case 44:
251
                case 44:
252
                        winkel = 695;
252
                        winkel = 695;
253
                        break;
253
                        break;
254
                case 45:
254
                case 45:
255
                        winkel = 707;
255
                        winkel = 707;
256
                        break;
256
                        break;
257
                case 46:
257
                case 46:
258
                        winkel = 719;
258
                        winkel = 719;
259
                        break;
259
                        break;
260
                case 47:
260
                case 47:
261
                        winkel = 731;
261
                        winkel = 731;
262
                case 48:
262
                case 48:
263
                        winkel = 743;
263
                        winkel = 743;
264
                        break;
264
                        break;
265
                case 49:
265
                case 49:
266
                        winkel = 755;
266
                        winkel = 755;
267
                        break;
267
                        break;
268
                case 50:
268
                case 50:
269
                        winkel = 766;
269
                        winkel = 766;
270
                        break;
270
                        break;
271
                case 51:
271
                case 51:
272
                        winkel = 777;
272
                        winkel = 777;
273
                        break;
273
                        break;
274
                case 52:
274
                case 52:
275
                        winkel = 788;
275
                        winkel = 788;
276
                        break;
276
                        break;
277
                case 53:
277
                case 53:
278
                        winkel = 799;
278
                        winkel = 799;
279
                        break;
279
                        break;
280
                case 54:
280
                case 54:
281
                        winkel = 809;
281
                        winkel = 809;
282
                        break;
282
                        break;
283
                case 55:
283
                case 55:
284
                        winkel = 819;
284
                        winkel = 819;
285
                        break;
285
                        break;
286
                case 56:
286
                case 56:
287
                        winkel = 829;
287
                        winkel = 829;
288
                        break;
288
                        break;
289
                case 57:
289
                case 57:
290
                        winkel = 839;
290
                        winkel = 839;
291
                        break;
291
                        break;
292
                case 58:
292
                case 58:
293
                        winkel = 848;
293
                        winkel = 848;
294
                        break;
294
                        break;
295
                case 59:
295
                case 59:
296
                        winkel = 857;
296
                        winkel = 857;
297
                        break;
297
                        break;
298
                case 60:
298
                case 60:
299
                        winkel = 866;
299
                        winkel = 866;
300
                        break;
300
                        break;
301
                case 61:
301
                case 61:
302
                        winkel = 875;
302
                        winkel = 875;
303
                        break;
303
                        break;
304
                case 62:
304
                case 62:
305
                        winkel = 883;
305
                        winkel = 883;
306
                        break;
306
                        break;
307
                case 63:
307
                case 63:
308
                        winkel = 891;
308
                        winkel = 891;
309
                        break;
309
                        break;
310
                case 64:
310
                case 64:
311
                        winkel = 899;
311
                        winkel = 899;
312
                        break;
312
                        break;
313
                case 65:
313
                case 65:
314
                        winkel = 906;
314
                        winkel = 906;
315
                        break;
315
                        break;
316
                case 66:
316
                case 66:
317
                        winkel = 914;
317
                        winkel = 914;
318
                        break;
318
                        break;
319
                case 67:
319
                case 67:
320
                        winkel = 921;
320
                        winkel = 921;
321
                        break;
321
                        break;
322
                case 68:
322
                case 68:
323
                        winkel = 927;
323
                        winkel = 927;
324
                        break;
324
                        break;
325
                case 69:
325
                case 69:
326
                        winkel = 934;
326
                        winkel = 934;
327
                        break;
327
                        break;
328
                case 70:
328
                case 70:
329
                        winkel = 940;
329
                        winkel = 940;
330
                        break;
330
                        break;
331
                case 71:
331
                case 71:
332
                        winkel = 946;
332
                        winkel = 946;
333
                        break;
333
                        break;
334
                case 72:
334
                case 72:
335
                        winkel = 951;
335
                        winkel = 951;
336
                        break;
336
                        break;
337
                case 73:
337
                case 73:
338
                        winkel = 956;
338
                        winkel = 956;
339
                        break;
339
                        break;
340
                case 74:
340
                case 74:
341
                        winkel = 961;
341
                        winkel = 961;
342
                        break;
342
                        break;
343
                case 75:
343
                case 75:
344
                        winkel = 966;
344
                        winkel = 966;
345
                        break;
345
                        break;
346
                case 76:
346
                case 76:
347
                        winkel = 970;
347
                        winkel = 970;
348
                        break;
348
                        break;
349
                case 77:
349
                case 77:
350
                        winkel = 974;
350
                        winkel = 974;
351
                        break;
351
                        break;
352
                case 78:
352
                case 78:
353
                        winkel = 978;
353
                        winkel = 978;
354
                        break;
354
                        break;
355
                case 79:
355
                case 79:
356
                        winkel = 982;
356
                        winkel = 982;
357
                        break;
357
                        break;
358
                case 80:
358
                case 80:
359
                        winkel = 985;
359
                        winkel = 985;
360
                        break;
360
                        break;
361
                case 81:
361
                case 81:
362
                        winkel = 988;
362
                        winkel = 988;
363
                        break;
363
                        break;
364
                case 82:
364
                case 82:
365
                        winkel = 990;
365
                        winkel = 990;
366
                        break;
366
                        break;
367
                case 83:
367
                case 83:
368
                        winkel = 993;
368
                        winkel = 993;
369
                        break;
369
                        break;
370
                case 84:
370
                case 84:
371
                        winkel = 995;
371
                        winkel = 995;
372
                        break;
372
                        break;
373
                case 85:
373
                case 85:
374
                        winkel = 996;
374
                        winkel = 996;
375
                        break;
375
                        break;
376
                case 86:
376
                case 86:
377
                        winkel = 998;
377
                        winkel = 998;
378
                        break;
378
                        break;
379
                case 87:
379
                case 87:
380
                        winkel = 999;
380
                        winkel = 999;
381
                        break;
381
                        break;
382
                case 88:
382
                case 88:
383
                        winkel = 999;
383
                        winkel = 999;
384
                        break;
384
                        break;
385
                case 89:
385
                case 89:
386
                        winkel = 1000;
386
                        winkel = 1000;
387
                        break;
387
                        break;
388
                case 90:
388
                case 90:
389
                        winkel = 1000;
389
                        winkel = 1000;
390
                        break;
390
                        break;
391
                default:
391
                default:
392
                        winkel = 0;
392
                        winkel = 0;
393
                        break;
393
                        break;
394
 
394
 
395
        }
395
        }
396
return (winkel*m);
396
return (winkel*m);
397
 
397
 
398
}
398
}
399
 
399
 
400
 
400
 
401
 
401