I-O DATA DEV2 / Mbed 2 deprecated ud-gs4-R_400G_SD_Log_No2

Dependencies:   mbed SDFileSystem_

Committer:
tnanbu
Date:
Wed Sep 01 11:37:07 2021 +0000
Revision:
13:df67ca499051
Parent:
11:2d5fcf102778
Child:
14:2707af31e02f
b2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hakusan270 0:b76e4ba14765 1 #include "mbed.h"
rgoto 6:bf4321ef0330 2 #include "SDFileSystem.h"
tnanbu 8:7f80139df48d 3 #include <time.h>
tnanbu 8:7f80139df48d 4
hakusan270 0:b76e4ba14765 5 /*
hakusan270 0:b76e4ba14765 6 This basic example just shows how to read the ADC internal channels raw values.
hakusan270 0:b76e4ba14765 7 Please look in the corresponding device reference manual for a complete
hakusan270 0:b76e4ba14765 8 description of how to make a temperature sensor, VBat or Vref measurement.
hakusan270 0:b76e4ba14765 9 */
hakusan270 0:b76e4ba14765 10
hakusan270 0:b76e4ba14765 11 AnalogIn adc_temp(ADC_TEMP);
hakusan270 0:b76e4ba14765 12 AnalogIn adc_vref(ADC_VREF);
tnanbu 11:2d5fcf102778 13 /* UD-GS2 H/W define
tnanbu 11:2d5fcf102778 14 PIO_SWin PB_4
tnanbu 11:2d5fcf102778 15 PIO_wkup PA_4
hakusan270 0:b76e4ba14765 16 PIO_enable PB_0
hakusan270 0:b76e4ba14765 17 PIO_intout1 PB_2
hakusan270 0:b76e4ba14765 18 PIO_led PB_5
hakusan270 0:b76e4ba14765 19 PIO_v20v PC_13
hakusan270 0:b76e4ba14765 20 PIO_v18v PH_0
hakusan270 0:b76e4ba14765 21 PIO_intout2 PH_1
hakusan270 0:b76e4ba14765 22 PIO_spics PB_12
hakusan270 0:b76e4ba14765 23 PIO_battryMonEn PA_5
hakusan270 5:fbeb85ebd47b 24 PB_7 SDA
hakusan270 5:fbeb85ebd47b 25 PB_6 SCL
tnanbu 11:2d5fcf102778 26
hakusan270 0:b76e4ba14765 27 */
hakusan270 5:fbeb85ebd47b 28 //DigitalOut hx_clk(PB_7);
hakusan270 5:fbeb85ebd47b 29 //DigitalIn hx_dt(PB_6);
hakusan270 5:fbeb85ebd47b 30 //I2C i2cacc(p_sda, p_scl)
hakusan270 5:fbeb85ebd47b 31
tnanbu 13:df67ca499051 32 //#include "H3LIS331DL.h"
tnanbu 13:df67ca499051 33
tnanbu 13:df67ca499051 34 //#define TIMEINTERVAL
hakusan270 5:fbeb85ebd47b 35
tnanbu 13:df67ca499051 36 //キャリブレーション 仮値
tnanbu 13:df67ca499051 37 #define OFFSET_X 0
tnanbu 13:df67ca499051 38 #define OFFSET_Y 0
tnanbu 13:df67ca499051 39 #define OFFSET_Z 0
tnanbu 11:2d5fcf102778 40
tnanbu 13:df67ca499051 41 HAL_StatusTypeDef writeEEPROMByte(uint32_t address, uint8_t data);
tnanbu 13:df67ca499051 42 uint8_t readEEPROMByte(uint32_t address);
tnanbu 13:df67ca499051 43
tnanbu 13:df67ca499051 44
tnanbu 13:df67ca499051 45 //H3LIS331DL h3dacc(PB_7,PB_6);
tnanbu 13:df67ca499051 46 I2C i2c(PB_7,PB_6); //NUCLEO pin assign
hakusan270 5:fbeb85ebd47b 47
hakusan270 0:b76e4ba14765 48 RawSerial pc(PA_9, PA_10,115200); //console UART
tnanbu 13:df67ca499051 49 //LowPowerTicker interrupt;
tnanbu 11:2d5fcf102778 50 //Ticker interrupt;
hakusan270 0:b76e4ba14765 51 SPI STSPI(PB_15, PB_14, PB_13); //mosi,miso,clk
hakusan270 0:b76e4ba14765 52 DigitalOut STSPICS(PB_12);
rgoto 6:bf4321ef0330 53
rgoto 6:bf4321ef0330 54 SDFileSystem *sd = new SDFileSystem(PA_12, PA_11, PB_3, PA_15, "sd"); // mosi, miso, sclk, cs, name
rgoto 6:bf4321ef0330 55
hakusan270 0:b76e4ba14765 56 DigitalOut led(PB_5);
hakusan270 1:025596ffc973 57 int initLIS3DH();
hakusan270 1:025596ffc973 58 int read3axes(short *tx,short *ty,short *tz);
tnanbu 13:df67ca499051 59 int initLIS331();
tnanbu 13:df67ca499051 60 int read3axes331(short *tx,short *ty,short *tz);
tnanbu 13:df67ca499051 61 int int_sqrt(unsigned int x);
tnanbu 7:b69fa9bb320d 62 //int readTemp(short *tmp);
tnanbu 11:2d5fcf102778 63 FILE *fp1,*fp2;//fp1:H3LIS331DL, fp2:LIS3DH
tnanbu 13:df67ca499051 64 unsigned long timecount = 0;
tnanbu 13:df67ca499051 65 int oldcount = 0;
tnanbu 13:df67ca499051 66 //uint8_t maxacc = 0;
tnanbu 13:df67ca499051 67 long max_g=0;
tnanbu 13:df67ca499051 68 long now_g;
tnanbu 13:df67ca499051 69 int update;
tnanbu 13:df67ca499051 70 char buffer1[512] = {};
tnanbu 13:df67ca499051 71 char buffer2[512] = {};
tnanbu 13:df67ca499051 72 char stracc1[32] = {}, stracc2[32] = {};
tnanbu 13:df67ca499051 73 int lognum1 = 0, lognum2 = 0;
tnanbu 13:df67ca499051 74 char filename1[32]= {};
tnanbu 13:df67ca499051 75 char filename2[32]= {};
tnanbu 13:df67ca499051 76 int ret = 0;
tnanbu 11:2d5fcf102778 77
tnanbu 13:df67ca499051 78 void timer(){
tnanbu 13:df67ca499051 79 short tx=0,ty=0,tz=0;
tnanbu 13:df67ca499051 80 long scr=0;
tnanbu 13:df67ca499051 81 //static long ax,ay,az,as;
tnanbu 13:df67ca499051 82 //static int cnt;
tnanbu 13:df67ca499051 83
tnanbu 13:df67ca499051 84 read3axes331(&tx,&ty,&tz);
tnanbu 13:df67ca499051 85 //キャリブレーションの補正
tnanbu 13:df67ca499051 86 tx += OFFSET_X;
tnanbu 13:df67ca499051 87 ty += OFFSET_Y;
tnanbu 13:df67ca499051 88 tz += OFFSET_Z;
tnanbu 13:df67ca499051 89
tnanbu 13:df67ca499051 90 //スカラー値変換
tnanbu 13:df67ca499051 91 scr = int_sqrt( tx*tx + ty*ty + tz*tz);
tnanbu 13:df67ca499051 92 now_g = scr;
tnanbu 13:df67ca499051 93
tnanbu 13:df67ca499051 94 //ax+= tx;
tnanbu 13:df67ca499051 95 //ay+= ty;
tnanbu 13:df67ca499051 96 //az+= tz;
tnanbu 13:df67ca499051 97 //as+= scr;
tnanbu 13:df67ca499051 98 //cnt++;
tnanbu 13:df67ca499051 99 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);
tnanbu 13:df67ca499051 100 if ( max_g < scr) {
tnanbu 13:df67ca499051 101 max_g = scr;
tnanbu 13:df67ca499051 102 update=1;
tnanbu 13:df67ca499051 103 //pc.printf("x:%d y:%d,z:%d scaler = %d max g=%2.2fG \r\n",tx,ty,tz,scr, (float)scr/11.0f);
tnanbu 13:df67ca499051 104 //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);
tnanbu 13:df67ca499051 105 //Save EEPROM
tnanbu 13:df67ca499051 106 writeEEPROMByte(0, max_g);
tnanbu 8:7f80139df48d 107 }
tnanbu 13:df67ca499051 108
tnanbu 13:df67ca499051 109 sprintf(stracc1,"%d,%lf\r\n",timecount,scr);
tnanbu 13:df67ca499051 110 //pc.printf("h3lis331dl:%s",stracc1);
tnanbu 13:df67ca499051 111 if(strlen(buffer1)+strlen(stracc1) > 512) {
tnanbu 11:2d5fcf102778 112 //pc.printf("buffer over. write file2\r\n");
tnanbu 8:7f80139df48d 113 ret = fprintf(fp1,"%s",buffer1);
tnanbu 13:df67ca499051 114 if(ret == 0){
tnanbu 13:df67ca499051 115 pc.printf("fp1 write failed. Reboot!!!\r\n");
tnanbu 13:df67ca499051 116 NVIC_SystemReset();
tnanbu 13:df67ca499051 117 }
tnanbu 8:7f80139df48d 118 memset(buffer1,0,sizeof(buffer1));
tnanbu 8:7f80139df48d 119 sprintf(buffer1,"%s",stracc1);
tnanbu 11:2d5fcf102778 120
tnanbu 11:2d5fcf102778 121 } else {
tnanbu 11:2d5fcf102778 122 sprintf(buffer1,"%s%s",buffer1,stracc1);
tnanbu 7:b69fa9bb320d 123 }
tnanbu 13:df67ca499051 124
tnanbu 13:df67ca499051 125 /*
tnanbu 13:df67ca499051 126 //16回平均
tnanbu 13:df67ca499051 127 if ((cnt & 0x0f)== 0) {
tnanbu 13:df67ca499051 128 float asc = (float)as / 11.0f /16.0f;
tnanbu 13:df67ca499051 129 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 );
tnanbu 13:df67ca499051 130 as=ax=ay=az=0;
tnanbu 13:df67ca499051 131 }
tnanbu 13:df67ca499051 132 */
tnanbu 13:df67ca499051 133
tnanbu 13:df67ca499051 134 if(oldcount == 10){
tnanbu 11:2d5fcf102778 135 //LIS3DH
tnanbu 13:df67ca499051 136 read3axes(&tx,&ty,&tz);
tnanbu 13:df67ca499051 137 scr = int_sqrt( tx*tx + ty*ty + tz*tz);
tnanbu 13:df67ca499051 138 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);
tnanbu 13:df67ca499051 139 sprintf(stracc2,"%d,%lf\r\n",timecount,scr);
tnanbu 11:2d5fcf102778 140 //pc.printf("lis3dh:%s",stracc2);
tnanbu 11:2d5fcf102778 141 if(strlen(buffer2)+ strlen(stracc2)> 512) {
tnanbu 11:2d5fcf102778 142 ret = fprintf(fp2,"%s",buffer2);
tnanbu 13:df67ca499051 143 if(ret == 0){
tnanbu 13:df67ca499051 144 pc.printf("fp2 write failed. Reboot!!!\r\n");
tnanbu 13:df67ca499051 145 NVIC_SystemReset();
tnanbu 13:df67ca499051 146 }
tnanbu 11:2d5fcf102778 147 memset(buffer2,0,sizeof(buffer2));
tnanbu 11:2d5fcf102778 148 sprintf(buffer2,"%s",stracc2);
tnanbu 11:2d5fcf102778 149 } else {
tnanbu 11:2d5fcf102778 150 sprintf(buffer2,"%s%s",buffer2,stracc2);
tnanbu 7:b69fa9bb320d 151 }
tnanbu 13:df67ca499051 152 oldcount = 0;
tnanbu 11:2d5fcf102778 153 }
tnanbu 13:df67ca499051 154
tnanbu 13:df67ca499051 155 if(time(NULL) > 86400){
tnanbu 8:7f80139df48d 156 //Create New File
tnanbu 8:7f80139df48d 157 set_time(NULL);
tnanbu 11:2d5fcf102778 158 timecount = 0;
tnanbu 8:7f80139df48d 159 fclose(fp1);
tnanbu 8:7f80139df48d 160 fclose(fp2);
tnanbu 8:7f80139df48d 161 lognum1++;
tnanbu 8:7f80139df48d 162 lognum2++;
tnanbu 13:df67ca499051 163 sprintf(filename1,"/sd/new_%d",lognum1);
tnanbu 13:df67ca499051 164 sprintf(filename2,"/sd/old_%d",lognum2);
tnanbu 8:7f80139df48d 165 fp1 = fopen(filename1,"a");
tnanbu 8:7f80139df48d 166 if(!fp1){
tnanbu 11:2d5fcf102778 167 pc.printf("fp1 create file failed\r\n");
tnanbu 13:df67ca499051 168 NVIC_SystemReset();
tnanbu 8:7f80139df48d 169 }
tnanbu 8:7f80139df48d 170 fp2 = fopen(filename2,"a");
tnanbu 11:2d5fcf102778 171 if(!fp2){
tnanbu 11:2d5fcf102778 172 pc.printf("fp2 create file failed\r\n");
tnanbu 13:df67ca499051 173 NVIC_SystemReset();
tnanbu 11:2d5fcf102778 174 }
tnanbu 7:b69fa9bb320d 175 }
tnanbu 13:df67ca499051 176 }
tnanbu 13:df67ca499051 177
tnanbu 13:df67ca499051 178 int main()
tnanbu 13:df67ca499051 179 {
tnanbu 13:df67ca499051 180 //h3dacc.init(H3LIS331DL_ODR_50Hz, H3LIS331DL_NORMAL,H3LIS331DL_FULLSCALE_8);//これで初期化している FULLSCALE_8=400G
tnanbu 13:df67ca499051 181 //h3dacc.setHPFMode(H3LIS331DL_HPM_NORMAL_MODE_RES);//High Pass Filter ON
tnanbu 13:df67ca499051 182 //h3dacc.setHPFCutOFF(H3LIS331DL_HPFCF_1);
tnanbu 13:df67ca499051 183
tnanbu 13:df67ca499051 184 sprintf(filename1,"/sd/new_%d",lognum1);
tnanbu 13:df67ca499051 185 sprintf(filename2,"/sd/old_%d",lognum2);
tnanbu 13:df67ca499051 186
tnanbu 13:df67ca499051 187 fp1 = fopen(filename1,"a");
tnanbu 13:df67ca499051 188 if(!fp1) {
tnanbu 13:df67ca499051 189 pc.printf("fp1(%s) open failed\r\n",filename1);
tnanbu 13:df67ca499051 190 //NVIC_SystemReset();
tnanbu 13:df67ca499051 191 }
tnanbu 13:df67ca499051 192 fp2 = fopen(filename2,"a");
tnanbu 13:df67ca499051 193 if(!fp2) {
tnanbu 13:df67ca499051 194 pc.printf("fp2(%s) open failed\r\n",filename2);
tnanbu 13:df67ca499051 195 //NVIC_SystemReset();
tnanbu 13:df67ca499051 196 }
tnanbu 13:df67ca499051 197
tnanbu 13:df67ca499051 198 //interrupt.attach_us(&timer,200000);//200ms
tnanbu 13:df67ca499051 199
tnanbu 13:df67ca499051 200 while(ret) {
tnanbu 13:df67ca499051 201 ret = initLIS3DH();
tnanbu 13:df67ca499051 202 ret = initLIS331();
tnanbu 13:df67ca499051 203 pc.printf(" init acc sensor %d\r\n",ret);
tnanbu 13:df67ca499051 204 wait_ms(100);
tnanbu 13:df67ca499051 205 }
tnanbu 13:df67ca499051 206 while(1)
tnanbu 13:df67ca499051 207 {
tnanbu 13:df67ca499051 208 timer();
tnanbu 11:2d5fcf102778 209 timecount++;
tnanbu 13:df67ca499051 210 oldcount++;
tnanbu 11:2d5fcf102778 211 wait_ms(20);
hakusan270 0:b76e4ba14765 212 }
tnanbu 13:df67ca499051 213
hakusan270 0:b76e4ba14765 214 }
tnanbu 11:2d5fcf102778 215 /*********** porting **************/
tnanbu 11:2d5fcf102778 216 void spiFormat(int b,int m)
tnanbu 11:2d5fcf102778 217 {
tnanbu 11:2d5fcf102778 218 STSPI.format(b,m); /* 8bit */
hakusan270 1:025596ffc973 219 }
tnanbu 11:2d5fcf102778 220 void spiFrequency(int f)
tnanbu 11:2d5fcf102778 221 {
hakusan270 1:025596ffc973 222 STSPI.frequency(f); /* 1Mbps */
hakusan270 1:025596ffc973 223 }
tnanbu 11:2d5fcf102778 224 void spiWriteCS(int cs)
tnanbu 11:2d5fcf102778 225 {
hakusan270 1:025596ffc973 226 STSPICS=cs;
hakusan270 1:025596ffc973 227 }
tnanbu 11:2d5fcf102778 228 int spiWrite(int wd)
tnanbu 11:2d5fcf102778 229 {
tnanbu 11:2d5fcf102778 230 return ( STSPI.write(wd));
tnanbu 11:2d5fcf102778 231 }
tnanbu 7:b69fa9bb320d 232
tnanbu 13:df67ca499051 233 /*******************************************************
tnanbu 13:df67ca499051 234 EEPROM WRITE
tnanbu 13:df67ca499051 235 ********************************************************/
tnanbu 13:df67ca499051 236 HAL_StatusTypeDef writeEEPROMByte(uint32_t address, uint8_t data)
tnanbu 13:df67ca499051 237 {
tnanbu 13:df67ca499051 238 HAL_StatusTypeDef status;
tnanbu 13:df67ca499051 239 address = address + 0x08080000;
tnanbu 13:df67ca499051 240 HAL_FLASHEx_DATAEEPROM_Unlock(); //Unprotect the EEPROM to allow writing
tnanbu 13:df67ca499051 241 status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_BYTE, address, data);
tnanbu 13:df67ca499051 242 HAL_FLASHEx_DATAEEPROM_Lock(); // Reprotect the EEPROM
tnanbu 13:df67ca499051 243 return status;
tnanbu 13:df67ca499051 244 }
tnanbu 13:df67ca499051 245
tnanbu 13:df67ca499051 246 /*******************************************************
tnanbu 13:df67ca499051 247 EEPROM READ
tnanbu 13:df67ca499051 248 ********************************************************/
tnanbu 13:df67ca499051 249 uint8_t readEEPROMByte(uint32_t address) {
tnanbu 13:df67ca499051 250 volatile uint8_t tmp ;
tnanbu 13:df67ca499051 251 address = address + 0x08080000;
tnanbu 13:df67ca499051 252 tmp = *(__IO uint8_t*)address;
tnanbu 13:df67ca499051 253 return tmp;
tnanbu 13:df67ca499051 254 }
tnanbu 13:df67ca499051 255
tnanbu 13:df67ca499051 256 /***************************
tnanbu 13:df67ca499051 257 integer sqrt
tnanbu 13:df67ca499051 258 整数 sqrt √演算を整数で ライブラリより速い
tnanbu 13:df67ca499051 259 ****************************/
tnanbu 13:df67ca499051 260 int int_sqrt(unsigned int x)
tnanbu 11:2d5fcf102778 261 {
tnanbu 13:df67ca499051 262 register int a = 0, c = 0, y = 0, i = 0, t = x;
tnanbu 13:df67ca499051 263 while(t >>= 1){
tnanbu 13:df67ca499051 264 ++i;
tnanbu 13:df67ca499051 265 }
tnanbu 13:df67ca499051 266 for(i += i & 1; i >= 0; i -= 2){
tnanbu 13:df67ca499051 267 c = (y << 1 | 1) <= x >> i;
tnanbu 13:df67ca499051 268 a = a << 1 | c;
tnanbu 13:df67ca499051 269 y = y << 1 | c;
tnanbu 13:df67ca499051 270 x -= c * y << i;
tnanbu 13:df67ca499051 271 y += c;
tnanbu 13:df67ca499051 272 }
tnanbu 13:df67ca499051 273 return a;
tnanbu 7:b69fa9bb320d 274 }