#include #include #include #include #define LOG_TAG "icm.app" #define LOG_LVL LOG_LVL_DBG #include static void icm_thread_entry(void *parameter) { icm20608_device_t dev = RT_NULL; const char *i2c_bus_name = "i2c2"; int count = 0; rt_err_t result; /* 初始化 icm20608 传感器 */ dev = icm20608_init(i2c_bus_name); if (dev == RT_NULL) { LOG_E("The sensor initializes failure"); } else { LOG_D("The sensor initializes success"); } /* 对 icm20608 进行零值校准:采样 10 次,求取平均值作为零值 */ result = icm20608_calib_level(dev, 10); if (result == RT_EOK) { LOG_D("The sensor calibrates success"); LOG_D("accel_offset: X%6d Y%6d Z%6d", dev->accel_offset.x, dev->accel_offset.y, dev->accel_offset.z); LOG_D("gyro_offset : X%6d Y%6d Z%6d", dev->gyro_offset.x, dev->gyro_offset.y, dev->gyro_offset.z); } else { LOG_E("The sensor calibrates failure"); icm20608_deinit(dev); } while (count++ < 100) { rt_int16_t accel_x, accel_y, accel_z; rt_int16_t gyros_x, gyros_y, gyros_z; /* 读取三轴加速度 */ result = icm20608_get_accel(dev, &accel_x, &accel_y, &accel_z); if (result == RT_EOK) { LOG_D("current accelerometer: accel_x%6d, accel_y%6d, accel_z%6d", accel_x, accel_y, accel_z); } else { LOG_E("The sensor does not work"); } /* 读取三轴陀螺仪 */ result = icm20608_get_gyro(dev, &gyros_x, &gyros_y, &gyros_z); if (result == RT_EOK) { LOG_D("current gyroscope : gyros_x%6d, gyros_y%6d, gyros_z%6d", gyros_x, gyros_y, gyros_z); } else { LOG_E("The sensor does not work"); break; } rt_thread_mdelay(1000); } } static int icm_app(void) { rt_thread_t res = rt_thread_create("icm", icm_thread_entry, RT_NULL, 1024, 20, 50); if(res == RT_NULL) { return -RT_ERROR; } rt_thread_startup(res); return RT_EOK; } MSH_CMD_EXPORT(icm_app, icm_app);