默れ

ADXL345应用——计步器设计(寄存器设置程序)

0
阅读(5509)

    SPI通讯程序和OCM12864的显示程序与之前的一样,在此不再赘述。主要发一下ADXL345的寄存器设置和ADuC初始化的程序。在myxl345.c中,主要进行ADXL345的设置,软件滤波。

 

#include "myxl345.h"
#include "./ocm12864/ocm12864.h"
extern unsigned int fifo_flag;
extern unsigned int r_data[];
extern long long_r_data[];
extern unsigned int xl345_all[];
extern long mean_x;
extern long mean_y;
extern long mean_z;
extern long static_x;
extern long static_y;
extern long static_z;
extern long timer_counter;
extern long run_step;
extern long step;
extern unsigned int status;
extern unsigned int calorie;
extern unsigned int weight;
void My_IRQ_Function(void);
void ADuC7026_all()
{
    int i;
    SPI_ADXL345_WRITE(XL345_POWER_CTL,0x08);
    for(i=XL345_THRESH_TAP; i<=XL345_FIFO_STATUS; i++)
    {
        xl345_all[i-XL345_THRESH_TAP] = SPI_ADXL345_READ(i);
        long_delay(2000);
    }
}
void ADuC7026_once_2()
{
    SPI_ADXL345_WRITE(XL345_POWER_CTL,0x08);
    SPI_ADXL345_WRITE(XL345_FIFO_CTL,0x00);
    SPI_ADXL345_M_READ(XL345_DATAX0,6);
    static_x=tran_int2long(r_data[0],r_data[1]);
    static_y=tran_int2long(r_data[2],r_data[3]);
    static_z=tran_int2long(r_data[4],r_data[5]);
}
void ADuC7026_once()
{
    SPI_ADXL345_WRITE(XL345_POWER_CTL,0x08);
    SPI_ADXL345_M_READ(XL345_DATAX0,6);
    long_r_data[0]=tran_int2long(r_data[0],r_data[1]);
    long_r_data[1]=tran_int2long(r_data[2],r_data[3]);
    long_r_data[2]=tran_int2long(r_data[4],r_data[5]);
}
void ADuC7026_static_rotate_2()
{
    SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
    SPI_ADXL345_WRITE(XL345_POWER_CTL,0x08);
    SPI_ADXL345_WRITE(XL345_ACT_INACT_CTL,0xa0);
    SPI_ADXL345_WRITE(XL345_FIFO_CTL,0x28);
    SPI_ADXL345_WRITE(XL345_THRESH_ACT,10);

    SPI_ADXL345_WRITE(XL345_THRESH_TAP,0X32);
    SPI_ADXL345_WRITE(XL345_DUR,0X30);
    SPI_ADXL345_WRITE(XL345_LATENT,0X22);
    SPI_ADXL345_WRITE(XL345_WINDOW,0Xff);
    SPI_ADXL345_WRITE(XL345_TAP_AXES,0X04);

    //SPI_ADXL345_READ(XL345_INT_SOURCE);
    SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x10);
}
void ADuC7026_static_rotate()
{
    SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
    SPI_ADXL345_WRITE(XL345_POWER_CTL,0x08);
    SPI_ADXL345_WRITE(XL345_ACT_INACT_CTL,0xaf);
    SPI_ADXL345_WRITE(XL345_FIFO_CTL,0x21);
    SPI_ADXL345_WRITE(XL345_THRESH_ACT,10);
    SPI_ADXL345_WRITE(XL345_THRESH_TAP,0X32);
    SPI_ADXL345_WRITE(XL345_DUR,0X30);
    SPI_ADXL345_WRITE(XL345_LATENT,0X22);
    SPI_ADXL345_WRITE(XL345_WINDOW,0Xff);
    SPI_ADXL345_WRITE(XL345_TAP_AXES,0X04);

    SPI_ADXL345_WRITE(XL345_THRESH_INACT,5);
    SPI_ADXL345_WRITE(XL345_TIME_INACT,5);
    SPI_ADXL345_WRITE(XL345_INT_MAP,0x10);
    SPI_ADXL345_READ(XL345_INT_SOURCE);
    
    //SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x08);
}
void ADuC7026_static_rotate_3()
{
    SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
    SPI_ADXL345_WRITE(XL345_POWER_CTL,0x08);
    SPI_ADXL345_WRITE(XL345_ACT_INACT_CTL,0xaf);
    SPI_ADXL345_WRITE(XL345_FIFO_CTL,0x21);
    SPI_ADXL345_WRITE(XL345_THRESH_ACT,10);
    SPI_ADXL345_WRITE(XL345_THRESH_TAP,0X32);
    SPI_ADXL345_WRITE(XL345_DUR,0X30);
    SPI_ADXL345_WRITE(XL345_LATENT,0X22);
    SPI_ADXL345_WRITE(XL345_WINDOW,0Xff);
    SPI_ADXL345_WRITE(XL345_TAP_AXES,0X04);

    SPI_ADXL345_WRITE(XL345_THRESH_INACT,5);
    SPI_ADXL345_WRITE(XL345_TIME_INACT,5);
    SPI_ADXL345_WRITE(XL345_INT_MAP,0x10);
    SPI_ADXL345_READ(XL345_INT_SOURCE);
    
    SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x40);
}
void ADuC7026_static_rotate_4()
{
    SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
    SPI_ADXL345_WRITE(XL345_POWER_CTL,0x08);
    SPI_ADXL345_WRITE(XL345_ACT_INACT_CTL,0xaf);
    SPI_ADXL345_WRITE(XL345_FIFO_CTL,0x21);
    SPI_ADXL345_WRITE(XL345_THRESH_ACT,10);
    SPI_ADXL345_WRITE(XL345_THRESH_TAP,0X32);
    SPI_ADXL345_WRITE(XL345_DUR,0X30);
    SPI_ADXL345_WRITE(XL345_LATENT,0X22);
    SPI_ADXL345_WRITE(XL345_WINDOW,0Xff);
    SPI_ADXL345_WRITE(XL345_TAP_AXES,0X04);

    SPI_ADXL345_WRITE(XL345_THRESH_INACT,5);
    SPI_ADXL345_WRITE(XL345_TIME_INACT,5);
    SPI_ADXL345_WRITE(XL345_INT_MAP,0x10);
    SPI_ADXL345_READ(XL345_INT_SOURCE);
    
    SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x68);
}
void long_delay(long i)
{
  while(i)i--;
}
void delay(int i){
    while(i)i--;
}
long tran_int2long(unsigned int data1, unsigned int data2)
{
  long result=0,temp=0;
  temp=data2;
  temp = temp<<8;
  result=temp;
  result+=data1;
  temp=result&0xf000;
  temp = temp<<16;
  if(temp)
  {
    result=result|0xffff0000;
  }
  return result;
}
void putchar(unsigned char ch)          /* Write character to Serial Port  */  
{          
    COMTX = ch;                         //COMTX is an 8-bit transmit register.
    while(!(0x020==(COMSTA0 & 0x020)))
    {;}
}


void ADuC7026_Initiate(void)
{
//  Clock Initial   //
    POWKEY1 = 0x01;             //Start PLL Setting
        POWCON = 0x00;              //Set PLL Active Mode With CD = 0  CPU CLOCK DIVIDER = 41.78MHz
        POWKEY2 = 0xF4;             //Finish PLL Setting

//  GPIO SETTING    //
    GP1CON = 0x02222211;        //P1.7 as GPIO, PIN set up for SPI, I2C and UART
        GP2DAT = 0x80800000;
        GP0CON = 0x00;          //p0.4 int1, p0.5 int2
//  UART Initial    //
    COMCON0 = 0x80;             //Baud Rate = 115200				
    COMDIV0 = 0x0B;     			
    COMDIV1 = 0x00;
    COMCON0 = 0x07;
    COMDIV2 = 0x883E;
// Timer_counter
    T1LD = 44*1000000/16;                   	// Counter Value
    //T1CON = 0xC4;                     // Enabled,Periodic,Binary and CLK/16
//  SPI SETTING //
    SPIDIV = 0x05;              //SPI speed in MHz = 3.482, Serial Clock=UCLK/[2*(1+SPIDIV)]					
    SPICON = 0x104F;            //enable SPI master in continuous transfer mode, serial clock idles high		 

    IRQ = My_IRQ_Function;
    COMIEN0 = 0x01;             //Enable Receive Buffer Full Interrupt					
    IRQEN=XIRQ0_BIT+XIRQ1_BIT;             //Enable INT0 1 Interrupt
}
void My_IRQ_Function() {
    unsigned int source;
    unsigned char str[20];
    double length;
    if ((FIQSIG & XIRQ0_BIT) != 0)
    {
        SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
        long_delay(5000);
        source= SPI_ADXL345_READ(XL345_INT_SOURCE);
        long_delay(5000);
        if(source&0x20) //double_tap
    	{
            SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
            fifo_flag=3;
    	}
        else if(source&0x40)
    	{
            SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
            fifo_flag=2;
    	}
        else if(source&0x08)
    	{
            SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
            fifo_flag=4;
    	}
        long_delay(50000);
    }
    else if((FIQSIG & XIRQ1_BIT) != 0)
    {
        unsigned int source;
        source= SPI_ADXL345_READ(XL345_INT_SOURCE);
        if(source&0x10)
    	{
            SPI_ADXL345_WRITE(XL345_INT_ENABLE,0x00);
            fifo_flag=1;
    	}
    }
    else if ((IRQSIG & GP_TIMER_BIT) != 0)
    {
            int2str(step - run_step,str,8);
            disp_str(0,2,"V:        s/sec ");
            disp_str(0,4,"cal:          mc");
            disp_str(16, 2, str);
    		
            if(step - run_step<3)
    		{
                length=status/5.0;
    		}
            else if(step - run_step==3)
                length = status/4.0;
            else if(step - run_step==4)
                length = status/3.0;
            else if(step - run_step==5)
                length = status/2.0;
            else if(step - run_step>5&&step - run_step<8)
                length = status;
            else length = 1.2*status;
            calorie=(unsigned int)(2.5*length*(step - run_step)*weight);
            int2str(calorie,str,8);
            disp_str(32, 4, str);
            if(step - run_step>4)
                 disp_str(0, 6, "run            ");
            else if(step - run_step<4&&step - run_step>0) 
                disp_str(0,6,"walk            ");
        	else
                disp_str(0,6,"static          ");
            run_step = step;
            T1CLRI =0X01;		
    }
    return ;
}