Subversion Repositories DashDisplay

Rev

Rev 46 | Blame | Last modification | View Log | Download | RSS feed

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