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