上一篇说原理
[EVAL-WSN]传感器篇——ADXL362加速度计(1)
https://www.cirmall.com/bbs/forum.php?mod=viewthread&tid=45708&fromuid=23447
简单介绍,这篇只要讲编程的 四、加速度轴方向 符合迪卡儿坐标系(右手坐标系) 五、关键代码如下 值得注意的是 SPI定时方案遵循CPHA = CPOL = 0 第一个上升沿采样,空闲状态为低电平 ADSENSORAPP_RESULT_TYPE ADXL362_Init() { ADSENSORAPP_RESULT_TYPE result; ADI_SPI_RESULT_TYPE status = ADI_SPI_SUCCESS; uint8_t TxD[10]= {0}, RxD[10]= {0}; status = adi_SPI_SetChipSelect(hSPI1Dev, ADXL362_CS); if (ADI_SPI_SUCCESS == status) status = adi_SPI_SetBitrate (hSPI1Dev, ADXL362_SPI_CLK); //4MHz SCLK //设置运动 与静止阀值 TxD[0]= XL362_REG_WRITE; //Command Byte = WRITE (0x0A) TxD[1]= XL362_THRESH_ACTL; //Starting Register Address XL362_THRESH_ACTL = 0x20 TxD[2]= 150; //Data to write to register XL362_THRESH_ACTL (0x20) = 105 TxD[3]= 0; //Data to write to register XL362_THRESH_ACTH (0x21) = 0 TxD[4]= 0; //Data to write to register XL362_TIME_ACT (0x22) = 3 (secs) TxD[5]= 105; //Data to write to register XL362_THRESH_INACTL (0x23) = 105 TxD[6]= 0; //Data to write to register XL362_THRESH_INACTH (0x24) = 0 TxD[7]= 0; //Data to write to register XL362_TIME_INACTL (0x25) = 37 (3 secs) TxD[8]= 0; //Data to write to register XL362_TIME_INACTH (0x26) = 0 TxD[9]= 0x3F;//Data to write to register XL362_ACT_INACT_CTL (0x27) = 0x3F //TxD[10]= 0x00;//Data to write to register XL362_FIFO_CONTROL (0x28) = 0x00 //TxD[11]= 0x00;//Data to write to register XL362_FIFO_SAMPLES (0x29) = 0x00 if (ADI_SPI_SUCCESS == status) status = API_SPI_RW_Byte(&TxD[0],&RxD[0], 10); //Write & Read Register Data //配置中断模式 电低为效中断, 使能唤醒与运动中断 //+-2G 滤波0DR=12.5HZ //最后设置 POWER_CTL 开始工作 TxD[0]= XL362_REG_WRITE; //Command Byte = WRITE (0x0A) TxD[1]= XL362_INTMAP1; //Starting Register Address XL362_INTMAP1 = 0x2A TxD[2]= 0x50;//Data to write to register XL362_INTMAP1 (0x2A) = 0x00 TxD[3]= 0x00;//Data to write to register XL362_INTMAP2 (0x2B) = 0x00 TxD[4]= 0x00;//Data to write to register XL362_FILTER_CTL (0x2C) = 0x00 TxD[5]= XL362_MEASURE_3D;//Data to write to register XL362_POWER_CTL (0x2D) = 0x00 if (ADI_SPI_SUCCESS == status) status = API_SPI_RW_Byte(&TxD[0],&RxD[0], 6); //Write & Read Register Data if(ADI_SPI_SUCCESS == status) result = API_SUCCESS; else result = API_FAIL; return result; } ADSENSORAPP_RESULT_TYPE Get_Data_From_ADXL362() { ADI_SPI_RESULT_TYPE status = ADI_SPI_SUCCESS; uint8_t TxD[6]= {0}, RxD[6]= {0}; int16_t RxD_temp[3]= {0}; status = adi_SPI_SetChipSelect(hSPI1Dev, ADXL362_CS); if(ADXL362_SPI_CLK != (adi_SPI_GetBitrate(hSPI1Dev))) status = adi_SPI_SetBitrate (hSPI1Dev, ADXL362_SPI_CLK); //4MHz SCLK #ifdef READ_8_BIT_DATA TxD[0]= XL362_REG_READ;//Command Byte = READ (0x0B) TxD[1]= XL362_XDATA8;//X-Data Reg.Addr = XDATA8 (0x08) TxD[2]= XL362_YDATA8;//Y-Data Reg.Addr = YDATA8 (0x09) TxD[3]= XL362_ZDATA8;//Z-Data Reg.Addr = ZDATA8 (0x0A) status = API_SPI_RW_Byte(&TxD[0],&RxD[0],6); //Write & Read Register Data if (status == ADI_SPI_SUCCESS) { SensData.ADXL362[0] = RxD[2]; SensData.ADXL362[1] = RxD[3]; SensData.ADXL362[2] = RxD[4]; return API_SUCCESS; } #else TxD[0]= XL362_REG_READ;//Command Byte = READ (0x0B) TxD[1]= XL362_XDATAL;//XL-Data Reg.Addr = XL362_XDATAL (0x0E) TxD[2]= XL362_XDATAH;//XH-Data Reg.Addr = XL362_XDATAH (0x0F) status = API_SPI_RW_Byte(&TxD[0],&RxD[0],4); //Write & Read Register Data RxD_temp[0] = (int16_t) ((RxD[3]<<8) | RxD[2]); //RxD_temp[0] = RxD_temp[0] & 0x0FFF; TxD[0]= XL362_REG_READ;//Command Byte = READ (0x0B) TxD[1]= XL362_YDATAL;//YL-Data Reg.Addr = XL362_YDATAL (0x10) TxD[2]= XL362_YDATAH;//YH-Data Reg.Addr = XL362_YDATAH (0x11) status = API_SPI_RW_Byte(&TxD[0],&RxD[0],4); //Write & Read Register Data RxD_temp[1] = (int16_t) ((RxD[3]<<8) | RxD[2]); //RxD_temp[1] = RxD_temp[1] & 0x0FFF; TxD[0]= XL362_REG_READ;//Command Byte = READ (0x0B) TxD[1]= XL362_ZDATAL;//ZL-Data Reg.Addr = XL362_ZDATAL (0x12) TxD[2]= XL362_ZDATAH;//ZH-Data Reg.Addr = XL362_ZDATAH (0x13) status = API_SPI_RW_Byte(&TxD[0],&RxD[0],4); //Write & Read Register Data RxD_temp[2] = (int16_t) ((RxD[3]<<8) | RxD[2]); //RxD_temp[2] = RxD_temp[2] & 0x0FFF; if (status == ADI_SPI_SUCCESS) { SensData.ADXL362[0] = RxD_temp[0]; SensData.ADXL362[1] = RxD_temp[1]; SensData.ADXL362[2] = RxD_temp[2]; return API_SUCCESS; } #endif else { SensData.ADXL362[0] = 0; SensData.ADXL362[1] = 0; SensData.ADXL362[2] = 0; return API_FAIL; } } ADSENSORAPP_RESULT_TYPE SoftReset_ADXL362_Sensor() { ADSENSORAPP_RESULT_TYPE result = API_SUCCESS; ADI_SPI_RESULT_TYPE status=ADI_SPI_SUCCESS; uint8_t TxD[3]= {0}, RxD[3]= {0}; TxD[0]= XL362_REG_WRITE;//Command Byte = WRITE (0x0A) TxD[1]= XL362_SOFT_RESET;//ADXL362_SOFT_RESET_REG = 0x1F TxD[2]= XL362_SOFT_RESET_KEY; //ADXL362_SOFT_RESET_KEY = 0x52 status = adi_SPI_SetChipSelect(hSPI1Dev, ADXL362_CS); if(ADXL362_SPI_CLK != (adi_SPI_GetBitrate(hSPI1Dev))) status = adi_SPI_SetBitrate (hSPI1Dev, ADXL362_SPI_CLK); //4MHz SCLK status = API_SPI_RW_Byte(TxD, RxD, 3); if (status == ADI_SPI_SUCCESS) result = API_SUCCESS; else result = API_FAIL; return result; } uint16_t ADXL362_Delay = 1000; ADSENSORAPP_RESULT_TYPE Detect_ADXL362_Sensor() { ADI_SPI_RESULT_TYPE status=ADI_SPI_SUCCESS; uint8_t TxD[5]= {0}, RxD[5]= {0}; status = adi_SPI_SetChipSelect(hSPI1Dev, ADXL362_CS); if(ADXL362_SPI_CLK != (adi_SPI_GetBitrate(hSPI1Dev))) status = adi_SPI_SetBitrate (hSPI1Dev, ADXL362_SPI_CLK); //4MHz SCLK SoftReset_ADXL362_Sensor();//复位 adsAPI_Delay(ADXL362_Delay); //读取ID TxD[0]= XL362_REG_READ;//Command Byte = READ (0x0B) TxD[1]= XL362_DEVID_AD;//ADXL362_DEVID_AD Reg.Addr = 0x00 TxD[2]= XL362_DEVID_MST; //ADXL362_DEVID_MST Reg.Addr = 0x01 TxD[3]= XL362_PARTID;//ADXL362_PARTID Reg.Addr = 0x02 if (ADI_SPI_SUCCESS == status) status = API_SPI_RW_Byte(&TxD[0],&RxD[0],5); //Write & Read Register Data if (ADI_SPI_SUCCESS == status) { if((RxD[2] == 0xAD)&&(RxD[3] == 0x1D)&&(RxD[4] == 0xF2)) return API_SUCCESS; else return API_FAIL; } return API_FAIL; } 六、结果 值很大,实质是没进行转换,比例因子如下 代码修改如下 ADSENSORAPP_RESULT_TYPE Get_Data_From_ADXL362() { 。。。。。。。。。。。。。。。。。。。。。。。。。。。。 if (status == ADI_SPI_SUCCESS) { #if 0 SensData.ADXL362[0] = RxD_temp[0]; SensData.ADXL362[1] = RxD_temp[1]; SensData.ADXL362[2] = RxD_temp[2]; #else SensData.ADXL362[0] = (float)RxD_temp[0]/1000;//2g ->1000 4g ->500 SensData.ADXL362[1] = (float)RxD_temp[1]/1000;// 8g->250 SensData.ADXL362[2] = (float)RxD_temp[2]/1000; #endif return API_SUCCESS; } #endif 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 } 运动学中,g的单位为m/s^2,1g = 9.8m/s^2 重力加速度
|