Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed SDFileSystem_
Diff: main.cpp
- Revision:
- 13:df67ca499051
- Parent:
- 11:2d5fcf102778
- Child:
- 14:2707af31e02f
--- a/main.cpp Mon Aug 30 08:47:17 2021 +0000 +++ b/main.cpp Wed Sep 01 11:37:07 2021 +0000 @@ -29,14 +29,24 @@ //DigitalIn hx_dt(PB_6); //I2C i2cacc(p_sda, p_scl) -#include "H3LIS331DL.h" +//#include "H3LIS331DL.h" + +//#define TIMEINTERVAL -#define TIMEINTERVAL +//キャリブレーション 仮値 +#define OFFSET_X 0 +#define OFFSET_Y 0 +#define OFFSET_Z 0 -H3LIS331DL h3dacc(PB_7,PB_6); +HAL_StatusTypeDef writeEEPROMByte(uint32_t address, uint8_t data); +uint8_t readEEPROMByte(uint32_t address); + + +//H3LIS331DL h3dacc(PB_7,PB_6); +I2C i2c(PB_7,PB_6); //NUCLEO pin assign RawSerial pc(PA_9, PA_10,115200); //console UART -LowPowerTicker interrupt; +//LowPowerTicker interrupt; //Ticker interrupt; SPI STSPI(PB_15, PB_14, PB_13); //mosi,miso,clk DigitalOut STSPICS(PB_12); @@ -46,126 +56,103 @@ DigitalOut led(PB_5); int initLIS3DH(); int read3axes(short *tx,short *ty,short *tz); +int initLIS331(); +int read3axes331(short *tx,short *ty,short *tz); +int int_sqrt(unsigned int x); //int readTemp(short *tmp); FILE *fp1,*fp2;//fp1:H3LIS331DL, fp2:LIS3DH -int timecount = 0; -//static uint8_t buffer[512] = {}; -//char buffer1[512] = {}; -//char buffer2[512] = {}; -//char stracc[32] = {}; -//bool write1 = false,write2 = false; -//double xyz[3] = {}; - -/* -void timer(void) -{ - short x=0,y=0,z=0; - float lis3dh_acc = 0; - double xyz[3]= {},h3lis331dl_acc=0; - //char stracc[32] = {}; - -//H3LIS331DL - h3dacc.getAcceleration(xyz); - //pc.printf("x:%f,y:%f,z:%f\r\n",(float)xyz[0],(float)xyz[1],(float)xyz[2]); //!!!If you read here, you cannot get acceleration!!! - h3lis331dl_acc = sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1] + xyz[2]*xyz[2]); - sprintf(stracc1,"%ld,%lf\r\n",timecount*200,h3lis331dl_acc); - pc.printf("h3lis331dl:%s",stracc1); - if(strlen(buffer1)+strlen(stracc1) > 512) { - //pc.printf("buffer over. write file2\r\n"); - write1 = true; - } else { - sprintf(buffer1,"%s%s",buffer1,stracc1); - } - - if(timecount == 10) { - //pc.printf("calc lis3dh acc\r\n"); - //LIS3DH - read3axes(&x,&y,&z); - lis3dh_acc = sqrt( (float)x/1024.0f * (float)x/1024 + (float)y/1024.0f * (float)y/1024 + (float)z/1024.0f * (float)z/1024); - sprintf(stracc2,"%ld,%lf\r\n",time(NULL),lis3dh_acc); - pc.printf("lis3dh:%s",stracc2); - if(strlen(buffer1)+ strlen(stracc1)> 512) { - write2 = true; - } else { - sprintf(buffer2,"%s%s",buffer2,stracc2); - } - timecount = 0; - } +unsigned long timecount = 0; +int oldcount = 0; +//uint8_t maxacc = 0; +long max_g=0; +long now_g; +int update; +char buffer1[512] = {}; +char buffer2[512] = {}; +char stracc1[32] = {}, stracc2[32] = {}; + int lognum1 = 0, lognum2 = 0; +char filename1[32]= {}; +char filename2[32]= {}; +int ret = 0; - timecount++; -} -*/ - -int main() -{ - int lognum1 = 0, lognum2 = 0; - char filename1[32]= {}; - char filename2[32]= {}; - int ret = 0; - short x=0,y=0,z=0; - double xyz[3] = {}, h3lis331dl_acc = 0; - float lis3dh_acc = 0; - int count = 0; - char buffer1[512] = {}; - char buffer2[512] = {}; - char stracc1[32] = {}, stracc2[32] = {}; - - initLIS3DH(); - - h3dacc.init(H3LIS331DL_ODR_50Hz, H3LIS331DL_NORMAL,H3LIS331DL_FULLSCALE_8);//これで初期化している FULLSCALE_8=400G - h3dacc.setHPFMode(H3LIS331DL_HPM_NORMAL_MODE_RES);//High Pass Filter ON - //h3dacc.setHPFCutOFF(H3LIS331DL_HPFCF_1); - - sprintf(filename1,"/sd/lis3dh_%d",lognum1); - sprintf(filename2,"/sd/h3lis_%d",lognum2); - - fp1 = fopen(filename1,"a"); - if(!fp1) { - pc.printf("fp1(%s) open failed\r\n",filename1); +void timer(){ + short tx=0,ty=0,tz=0; + long scr=0; + //static long ax,ay,az,as; + //static int cnt; + + read3axes331(&tx,&ty,&tz); + //キャリブレーションの補正 + tx += OFFSET_X; + ty += OFFSET_Y; + tz += OFFSET_Z; + + //スカラー値変換 + scr = int_sqrt( tx*tx + ty*ty + tz*tz); + now_g = scr; + + //ax+= tx; + //ay+= ty; + //az+= tz; + //as+= scr; + //cnt++; + pc.printf("new x:%d y:%d,z:%d scaler = %d max g=%2.2fG \r\n",tx,ty,tz,scr, (float)max_g/11.0f); + if ( max_g < scr) { + max_g = scr; + update=1; + //pc.printf("x:%d y:%d,z:%d scaler = %d max g=%2.2fG \r\n",tx,ty,tz,scr, (float)scr/11.0f); + //pc.printf("new x:%d y:%d,z:%d scaler = %d max g=%2.2fG \r\n",tx,ty,tz,scr, (float)max_g/11.0f); + //Save EEPROM + writeEEPROMByte(0, max_g); } - fp2 = fopen(filename2,"a"); - if(!fp2) { - pc.printf("fp2(%s) open failed\r\n",filename2); - } - - //interrupt.attach_us(&timer,200000);//200ms - - while(1) { - //H3LIS331DL - h3dacc.getAcceleration(xyz); - //pc.printf("x:%f,y:%f,z:%f\r\n",(float)xyz[0],(float)xyz[1],(float)xyz[2]); //!!!If you read here, you cannot get acceleration!!! - h3lis331dl_acc = sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1] + xyz[2]*xyz[2]); - sprintf(stracc1,"%ld,%lf\r\n",count*20,h3lis331dl_acc); - //pc.printf("h3lis331dl:%s",stracc1); - if(strlen(buffer1)+strlen(stracc1) > 512) { + + sprintf(stracc1,"%d,%lf\r\n",timecount,scr); + //pc.printf("h3lis331dl:%s",stracc1); + if(strlen(buffer1)+strlen(stracc1) > 512) { //pc.printf("buffer over. write file2\r\n"); ret = fprintf(fp1,"%s",buffer1); + if(ret == 0){ + pc.printf("fp1 write failed. Reboot!!!\r\n"); + NVIC_SystemReset(); + } memset(buffer1,0,sizeof(buffer1)); sprintf(buffer1,"%s",stracc1); - //write1 = false; } else { sprintf(buffer1,"%s%s",buffer1,stracc1); } - - if(count == 10) { + + /* + //16回平均 + if ((cnt & 0x0f)== 0) { + float asc = (float)as / 11.0f /16.0f; + pc.printf("avarage x:%d\ty:%d\tz:%d\tscaler=%d\t%2.2fG \r\n",ax/16,ay/16,az/16,as/16, asc ); + as=ax=ay=az=0; + } + */ + + if(oldcount == 10){ //LIS3DH - read3axes(&x,&y,&z); - lis3dh_acc = sqrt( (float)x/1024.0f * (float)x/1024 + (float)y/1024.0f * (float)y/1024 + (float)z/1024.0f * (float)z/1024); - sprintf(stracc2,"%ld,%lf\r\n",timecount*20*10,lis3dh_acc); + read3axes(&tx,&ty,&tz); + scr = int_sqrt( tx*tx + ty*ty + tz*tz); + pc.printf("old x:%d y:%d,z:%d scaler = %d max g=%2.2fG \r\n",tx,ty,tz,scr, (float)max_g/11.0f); + sprintf(stracc2,"%d,%lf\r\n",timecount,scr); //pc.printf("lis3dh:%s",stracc2); if(strlen(buffer2)+ strlen(stracc2)> 512) { ret = fprintf(fp2,"%s",buffer2); - //pc.printf("write buffer:%d\r\n",ret); + if(ret == 0){ + pc.printf("fp2 write failed. Reboot!!!\r\n"); + NVIC_SystemReset(); + } memset(buffer2,0,sizeof(buffer2)); sprintf(buffer2,"%s",stracc2); } else { sprintf(buffer2,"%s%s",buffer2,stracc2); } - count = 0; + oldcount = 0; } - - if(time(NULL) > 86400){ + + if(time(NULL) > 86400){ //Create New File set_time(NULL); timecount = 0; @@ -173,26 +160,59 @@ fclose(fp2); lognum1++; lognum2++; - sprintf(filename1,"/sd/lis3dh_%d",lognum1); - sprintf(filename2,"/sd/h3lis331dl_%d",lognum2); + sprintf(filename1,"/sd/new_%d",lognum1); + sprintf(filename2,"/sd/old_%d",lognum2); fp1 = fopen(filename1,"a"); if(!fp1){ pc.printf("fp1 create file failed\r\n"); + NVIC_SystemReset(); } fp2 = fopen(filename2,"a"); if(!fp2){ pc.printf("fp2 create file failed\r\n"); + NVIC_SystemReset(); } } - - led = !led; +} + +int main() +{ + //h3dacc.init(H3LIS331DL_ODR_50Hz, H3LIS331DL_NORMAL,H3LIS331DL_FULLSCALE_8);//これで初期化している FULLSCALE_8=400G + //h3dacc.setHPFMode(H3LIS331DL_HPM_NORMAL_MODE_RES);//High Pass Filter ON + //h3dacc.setHPFCutOFF(H3LIS331DL_HPFCF_1); + + sprintf(filename1,"/sd/new_%d",lognum1); + sprintf(filename2,"/sd/old_%d",lognum2); + + fp1 = fopen(filename1,"a"); + if(!fp1) { + pc.printf("fp1(%s) open failed\r\n",filename1); + //NVIC_SystemReset(); + } + fp2 = fopen(filename2,"a"); + if(!fp2) { + pc.printf("fp2(%s) open failed\r\n",filename2); + //NVIC_SystemReset(); + } + + //interrupt.attach_us(&timer,200000);//200ms + + while(ret) { + ret = initLIS3DH(); + ret = initLIS331(); + pc.printf(" init acc sensor %d\r\n",ret); + wait_ms(100); + } + while(1) + { + timer(); timecount++; - count++; + oldcount++; wait_ms(20); } + } /*********** porting **************/ - void spiFormat(int b,int m) { STSPI.format(b,m); /* 8bit */ @@ -210,7 +230,45 @@ return ( STSPI.write(wd)); } -void error(const char* format, ...) +/******************************************************* + EEPROM WRITE +********************************************************/ +HAL_StatusTypeDef writeEEPROMByte(uint32_t address, uint8_t data) + { + HAL_StatusTypeDef status; + address = address + 0x08080000; + HAL_FLASHEx_DATAEEPROM_Unlock(); //Unprotect the EEPROM to allow writing + status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_BYTE, address, data); + HAL_FLASHEx_DATAEEPROM_Lock(); // Reprotect the EEPROM + return status; +} + +/******************************************************* + EEPROM READ +********************************************************/ +uint8_t readEEPROMByte(uint32_t address) { + volatile uint8_t tmp ; + address = address + 0x08080000; + tmp = *(__IO uint8_t*)address; + return tmp; +} + +/*************************** + integer sqrt + 整数 sqrt √演算を整数で ライブラリより速い +****************************/ +int int_sqrt(unsigned int x) { - return; + 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; } \ No newline at end of file