|
STEVAL-IDB007V1 板载传感器的读取
[复制链接]
本帖最后由 cruelfox 于 2018-1-29 08:40 编辑
DK 软件中提供了传感器的API,可以不从头写起就访问板载的传感器了。下面的代码是从BLE SensorDemo范例中 sensor.c 抄出来的。
初始化IMU:
- IMU_6AXES_DrvTypeDef *Imu6AxesDrv = NULL;
- LSM6DS3_DrvExtTypeDef *Imu6AxesDrvExt = NULL;
- typedef struct {
- int32_t AXIS_X;
- int32_t AXIS_Y;
- int32_t AXIS_Z;
- } AxesRaw_t;
- static AxesRaw_t acceleration_data;
- void init_acc(void)
- {
- /* LSM6DS3 library setting */
- IMU_6AXES_InitTypeDef InitStructure;
- uint8_t tmp1 = 0x00;
-
- Imu6AxesDrv = &LSM6DS3Drv;
- Imu6AxesDrvExt = &LSM6DS3Drv_ext_internal;
- InitStructure.G_FullScale = 125.0f;
- InitStructure.G_OutputDataRate = 13.0f;
- InitStructure.G_X_Axis = 0; //1;
- InitStructure.G_Y_Axis = 0;//1;
- InitStructure.G_Z_Axis = 0; //1;
- InitStructure.X_FullScale = 2.0f;
- InitStructure.X_OutputDataRate = 13.0f;
- InitStructure.X_X_Axis = 1;
- InitStructure.X_Y_Axis = 1;
- InitStructure.X_Z_Axis = 1;
-
- /* LSM6DS3 initiliazation */
- Imu6AxesDrv->Init(&InitStructure);
-
- /* Disable all mems IRQs in order to enable free fall detection */ //TBR
- LSM6DS3_IO_Write(&tmp1, LSM6DS3_XG_MEMS_ADDRESS, LSM6DS3_XG_INT1_CTRL, 1);
-
- /* Clear first previous data */
- Imu6AxesDrv->Get_X_Axes((int32_t *)&acceleration_data);
-
- /* Enable Free fall detection */
- Imu6AxesDrvExt->Enable_Free_Fall_Detection();
- }
复制代码
在需要加速计数据的时候,例如这样访问:
- AxesRaw_t acc_data;
- if (Imu6AxesDrv->Get_X_Axes((int32_t *)&acc_data)== IMU_6AXES_OK) {
- printf("g=(%d, %d, %d);", acc_data.AXIS_X, acc_data.AXIS_Y, acc_data.AXIS_Z);
- }
复制代码
压力计的初始化:
- PRESSURE_DrvTypeDef* xLPS25HBDrv = &LPS25HBDrv;
- void init_prs(void)
- {
- /* LPS25HB initialization */
- PRESSURE_InitTypeDef InitStructure;
- InitStructure.OutputDataRate = LPS25HB_ODR_1Hz;
- InitStructure.BlockDataUpdate = LPS25HB_BDU_READ; //LPS25HB_BDU_READ LPS25HB_BDU_CONT
- InitStructure.DiffEnable = LPS25HB_DIFF_ENABLE; // LPS25HB_DIFF_ENABLE
- InitStructure.SPIMode = LPS25HB_SPI_SIM_3W; // LPS25HB_SPI_SIM_3W
- InitStructure.PressureResolution = LPS25HB_P_RES_AVG_32;
- InitStructure.TemperatureResolution = LPS25HB_T_RES_AVG_16;
- xLPS25HBDrv->Init(&InitStructure);
- }
复制代码
读取其中的温度和压力传感器并转换为浮点数:
- float data;
- if (xLPS25HBDrv->GetTemperature(&data) == 0)
- {
- printf("\tT=%f,", data);
- }
- if (xLPS25HBDrv->GetPressure(&data) == 0)
- {
- printf("\tp=%f\r\n", data);
- }
复制代码
在这些API背后,调用的是诸如 SdkEvalI2CRead() SdkEvalSPIRead() 的函数去访问 I2C, SPI 硬件实现传感器的访问。这样对某些用户显得方便,不用管背后实现的细节。事实上,这两个板载的传感器都是支持SPI, I2C两种方式访问的,只是评估板将压力计以I2C连接,IMU以SPI连接了。如果接口方式更换,使用DK库中提供的上层API只需改动一下配置的头文件就照样用了,甚为方便。
当然,要充分挖掘这两个传感器的更复杂功能,扒开API隐藏掉的细节,自己操作 I2C、SPI 对其进行读写也是必要的。
|
|