UD-GS1 デバグ用 3D Acc 動かない
Fork of UDNS1_mbed-dev by
main.cpp
- Committer:
- hakusan270
- Date:
- 2018-09-15
- Revision:
- 170:e086a9b46bd7
- Parent:
- 169:a343cdc10e0c
- Child:
- 171:42f0cccc956f
File content as of revision 170:e086a9b46bd7:
#include "mbed.h" #define ONE_G_ACCELERATION 9.8 //重力加速度 #define EXP_BIAS 12 #define TTFloat_MIN 0.000245094f #define TTFloat_MAX 1046528.0f #define GRAV 9.8f #define GRATE 413.0f SPI STSPI(SPI_MOSI, SPI_MISO, SPI_SCK); DigitalOut STSPICS(PB_9); Serial pc(PA_9, PA_10,9600 ); //console Serial pclpwa(PB_10, PB_11,115200); DigitalOut myled(PB_14); DigitalOut ext7(PB_15); char buffer[100];; int read3axes(short *tx,short *ty,short *tz); float UDGS1_decodeFloat(unsigned short v); unsigned short UDGS1_encodeFloat(float v); int int_sqrt(unsigned int x); int initLIS3DH(); int main() { int i=0; short x,y,z; printf("\r\n**** Hello UD-GS1 by mbed ******\r\n"); initLIS3DH(); read3axes(&x,&y,&z); printf("3D acc x=%d y=%d z=%d\r\n",x,y,z); pclpwa.set_flow_control(Serial::RTSCTS,PB_1,PB_13); while (1) { ext7=1; myled =0; wait(0.7); // 700 ms ext7=0; myled =1; wait(1.7); // 1700 ms // pc.write((const uint8_t *)"ACBD\r\n",6,NULL); // pc.puts("ASDFGREWA\r\n"); printf("PC12345ABCD cnt=%d\n\r",i++); pclpwa.printf("PC12345ABCD cnt=%d\n\r",i); read3axes(&x,&y,&z); printf("3D acc x=%d y=%d z=%d\r\n",x,y,z); } } /************************************************* Read a regster from SPI *************************************************/ unsigned char spireadReg(unsigned char ad){ unsigned char r; STSPICS = 0; wait_us(1); STSPI.write(ad | 0x80); r = STSPI.write(0); wait_us(1); STSPICS = 1; return(r); } /************************************************* Read multi regsters from SPI *************************************************/ unsigned char spireadRegs(unsigned char ad,unsigned char *p,int bytes){ #if 1 while(bytes--) { *p = spireadReg( ad ); p++; ad++; } #else STSPICS=0; wait_us(1); STSPI.write(ad | 0xc0 ); while(bytes--) { *p++ = STSPI.write(0); } wait_us(1); STSPICS=1; #endif return(0); } /************************************************* Write a regster via SPI *************************************************/ unsigned char spiwriteReg(unsigned char ad,unsigned char val){ unsigned char r; STSPICS=0; wait_us(1); STSPI.write(ad); r = STSPI.write(val); wait_us(1); STSPICS=1; return(r); } /**************************************** tyny 13bit浮動小数点からfloatに変換 *****************************************/ float UDGS1_decodeFloat(unsigned short v){ volatile float r; if(v==0) return(0.0f); *(unsigned long *)&r = ((v & 0xff) << (23-8)) | (((v>>8) + 115) << 23) ; return(r); } /**************************************** float から tiny 13bit浮動小数点に変換 *****************************************/ unsigned short UDGS1_encodeFloat(float v){ register unsigned long tf; register unsigned short exp; if(v <= 0.0000235f)return(0); if(v > 1046528.0f)return(0x1fff); tf = *(unsigned long *)&v; exp = ((tf >> 23) & 0xff ) - (127-EXP_BIAS); return( ((tf >> 15) & 0xff) | (exp << 8) ); } /*************************** integer sqrt 整数 sqrt ****************************/ int int_sqrt(unsigned int x) { register int a = 0, c = 0, y = 0, i = 0, t = x; while(t >>= 1){ ++i; } for(i += i & 1; i >= 0; i -= 2){ c = (y << 1 | 1) <= x >> i; a = a << 1 | c; y = y << 1 | c; x -= c * y << i; y += c; } return a; } /***************************************** init LIS3DH ST micro 3-axes accelerometer SPI interface *****************************************/ int initLIS3DH() { // STSPI = new SPI(SPI_MOSI, SPI_MISO, SPI_SCK, D6); STSPI.format(8,3); STSPI.frequency(1000000); STSPICS=1; wait_us(1); printf("Who am I %02x\r\n", spireadReg(0x0f)); spiwriteReg(0x20,0x27); spiwriteReg(0x23,0x98); return (spireadReg(0x0f)== 0x44); } /************************************************* read 3-axes from LIS3DH *************************************************/ int read3axes(short *tx,short *ty,short *tz) { int timeout=5; unsigned char regs[6]; // STSPI.frequency(1000); while((spireadReg(0x07)&7)==0 && timeout--){wait_us(5);}; spireadRegs(0x28,regs,6);// 12bit signed 1G = 413 9.8m/s**2 // STSPI.frequency(); //1MHz *tx = (short)(regs[0] | (regs[1]<<8)) >> 4; *ty = (short)(regs[2] | (regs[3]<<8)) >> 4; *tz = (short)(regs[4] | (regs[5]<<8)) >> 4; return(0); }