Subversion Repositories DashDisplay

Rev

Rev 30 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/*
2
 * ap_math.c
3
 
4
 *
5
 *  Created on: 31 Jan 2016
6
 *      Author: Mike
7
 */
8
#include <math.h>
30 mjames 9
#include "stm32l1xx_hal.h"
2 mjames 10
#include "ap_math.h"
11
/* this is an approximate maths library where all the answers are accurate enough */
46 mjames 12
static uint8_t sintab[SINE_STEPS];
2 mjames 13
void ap_init(void)
14
{
46 mjames 15
        uint16_t i;
16
        for(i=0;i<SINE_STEPS;i++)
2 mjames 17
        {
46 mjames 18
          sintab[i]=sin(i/(SINE_STEPS*2.0)*3.14159)*AP_K;
2 mjames 19
        }
20
}
21
 
22
/* returns 255 * sin(ang) where ang is in degrees */
23
int ap_sin(int ang)
24
{
25
        /* wrap into range */
26
        while(ang<0)
27
        {
46 mjames 28
                ang+= SINE_STEPS * 4;
2 mjames 29
        }
46 mjames 30
while(ang>=SINE_STEPS * 4)
2 mjames 31
        {
46 mjames 32
                ang-= SINE_STEPS * 4;
2 mjames 33
        }
34
 
46 mjames 35
        if(ang>=0 && ang<SINE_STEPS)
2 mjames 36
        {
37
                return(sintab[ang]);
38
        }
39
        else
46 mjames 40
        if(ang==SINE_STEPS)
2 mjames 41
        {
42
                return AP_K;
43
        }
44
        else
46 mjames 45
        if(ang>SINE_STEPS && ang<=SINE_STEPS*2)
2 mjames 46
        {
46 mjames 47
                return(sintab[SINE_STEPS*2-ang]);
2 mjames 48
        }
49
        else
46 mjames 50
        if(ang==3*SINE_STEPS)
2 mjames 51
        {
52
            return -AP_K;
53
        }
46 mjames 54
        if(ang>SINE_STEPS *2 && ang< SINE_STEPS*3)
2 mjames 55
        {
46 mjames 56
                return(-sintab[ang-SINE_STEPS*2]);
2 mjames 57
        }
58
        else
59
    /* ang > 270 and ang < 360 */
60
        {
46 mjames 61
        return(-sintab[SINE_STEPS*4-ang]);
2 mjames 62
        }
63
}
64
 
65
/* returns 255 * cos(ang) where ang is in degrees */
66
int ap_cos(int ang)
67
{
46 mjames 68
        return ap_sin(SINE_STEPS-ang);
2 mjames 69
}
70
 
71