Subversion Repositories FlightCtrl

Rev

Rev 1344 | Rev 1523 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1344 Rev 1490
Line 36... Line 36...
36
 
36
 
37
// Cosinus with argument in degree at an angular resolution of 1 degree and a discretisation of 13 bit.
37
// Cosinus with argument in degree at an angular resolution of 1 degree and a discretisation of 13 bit.
38
int16_t c_cos_8192(int16_t angle)
38
int16_t c_cos_8192(int16_t angle)
39
{
39
{
40
        return (c_sin_8192(90 - angle));
-
 
41
}
-
 
42
 
-
 
43
 
-
 
44
// Arcustangens returns degree in a range of +/. 180 deg
-
 
45
const uint8_t pgm_atanlookup[346] PROGMEM = {0,1,2,3,4,4,5,6,7,8,9,10,11,11,12,13,14,15,16,17,17,18,19,20,21,21,22,23,24,24,25,26,27,27,28,29,29,30,31,31,32,33,33,34,35,35,36,36,37,37,38,39,39,40,40,41,41,42,42,43,43,44,44,45,45,45,46,46,47,47,48,48,48,49,49,50,50,50,51,51,51,52,52,52,53,53,53,54,54,54,55,55,55,55,56,56,56,57,57,57,57,58,58,58,58,59,59,59,59,60,60,60,60,60,61,61,61,61,62,62,62,62,62,63,63,63,63,63,63,64,64,64,64,64,64,65,65,65,65,65,65,66,66,66,66,66,66,66,67,67,67,67,67,67,67,68,68,68,68,68,68,68,68,69,69,69,69,69,69,69,69,69,70,70,70,70,70,70,70,70,70,71,71,71,71,71,71,71,71,71,71,71,72,72,72,72,72,72,72,72,72,72,72,73,73,73,73,73,73,73,73,73,73,73,73,73,73,74,74,74,74,74,74,74,74,74,74,74,74,74,74,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,75,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,76,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,77,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79,79};
-
 
46
 
-
 
47
int16_t c_atan2(int16_t y, int16_t x)
-
 
48
{
-
 
49
        int16_t index, angle;
-
 
50
        int8_t m;
-
 
51
 
-
 
52
        if (!x && !y) return 0;         //atan2(0, 0) is undefined
-
 
53
 
-
 
54
        if (y < 0) m = -1;
-
 
55
        else m = 1;
-
 
56
 
-
 
57
        if (!x) return (90 * m);                // atan2(y,0) = +/- 90 deg
-
 
58
 
-
 
59
        index = (int16_t)(((int32_t)y * 64) / x);// calculate index for lookup table
-
 
60
        if (index < 0) index = -index;
-
 
61
 
-
 
62
        if (index < 346) angle = pgm_read_byte(&pgm_atanlookup[index]); // lookup for 0 deg to 79 deg
-
 
63
        else if (index > 7334) angle = 90;                                              // limit is 90 deg
-
 
64
        else if (index > 2444) angle = 89;                                              // 89 deg to 80 deg is mapped via intervalls
-
 
65
        else if (index > 1465) angle = 88;
-
 
66
        else if (index > 1046) angle = 87;
-
 
67
        else if (index > 813) angle = 86;
-
 
68
        else if (index > 664) angle = 85;
-
 
69
        else if (index > 561) angle = 84;
-
 
70
        else if (index > 486) angle = 83;
-
 
71
        else if (index > 428) angle = 82;
-
 
72
        else if (index > 382) angle = 81;
-
 
73
        else angle = 80; // (index>345)
-
 
74
 
-
 
75
        if (x > 0) return (angle * m);  // 1st and 4th quadrant
-
 
76
        else if ((x < 0) && (m > 0)) return (180 - angle);      // 2nd quadrant
-
 
77
        else return (angle - 180); // ( (x < 0) && (y < 0))     3rd quadrant
-
 
78
}
-
 
79
 
-
 
80
 
-
 
81
// Integer square root
-
 
82
// For details of the algorithm see the article http://www.embedded.com/98/9802fe2.htm
-
 
83
uint32_t c_sqrt(uint32_t a)
-
 
84
{
-
 
85
        uint32_t rem = 0;
-
 
86
        uint32_t root = 0;
-
 
87
        uint8_t i;
-
 
88
 
-
 
89
        for(i = 0; i < 16; i++)
-
 
90
        {
-
 
91
                root <<= 1;
-
 
92
                rem = ((rem << 2) + (a >> 30));
-
 
93
                a <<= 2;
-
 
94
                root++;
-
 
95
                if(root <= rem)
-
 
96
                {
-
 
97
                        rem -= root;
-
 
98
                        root++;
-
 
99
                }
-
 
100
                else root--;
-
 
101
        }
-
 
102
        return (root >> 1);
40
        return (c_sin_8192(90 - angle));
103
}
-
 
104
 
-
 
105
 
-
 
106
 
41
}