ADXL345应用——计步器设计(寄存器设置程序)
0赞
发表于 4/16/2012 1:01:23 PM
阅读(6771)
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 ;
}
