编程实例
实例描述
基于野火挑战者开发板(Cloud_STM32F429IGTx_FIRE)开发应用定时读取MPU6050传感器的原始数据。MPU6050是一种六轴传感器模块,能同时检测三轴加速度、三轴陀螺仪(角加速度)、温度。本实例中提供的传感器驱动和应用代码仅对使用传感框架读取传感器做基本设计和实现,仅做参考。
- 初始化陀螺仪标签类别的两个应用g_gyroItem1、g_gyroItem2。
- 设置不同的采集周期,打开应用,注册数据更新回调函数SensorReport。
- 采集一段时间后,先关闭g_gyroItem1,此时传感器数据会继续推送g_gyroItem2,一段时间后,关闭g_gyroItem2,此时传感器数据采样停止,SensorReport不再被调用。
- 再执行一遍2、3步骤。
实例代码
#define STASK_PRIORITY_MISC 4
#define STASK_STKDEPTH_MISC 0x800
#define Item1_SAMPLE_INTERVAL 3000 // LiteOS ticks
#define Item2_SAMPLE_INTERVAL 6000
STATIC SensorItem g_gyroItem1 = {
.id = 1, // 1: gyro item 1
};
STATIC SensorItem g_gyroItem2 = {
.id = 2, // 2: gyro item 2
};
STATIC UINT32 g_miscTskID;
STATIC INT32 SensorReport(UINT32 arg, const INT8 *data, UINT32 len)
{
(VOID)(len);
(VOID)(data);
PRINTK("tag %u report\r\n", arg);
return LOS_OK;
}
STATIC VOID OpenGyro(VOID)
{
OpenParam para;
// period is LiteOS ticks
para.period = Item1_SAMPLE_INTERVAL;
SensorItemEnable(&g_gyroItem1, ¶, g_gyroItem1.id, 0);
para.period = Item2_SAMPLE_INTERVAL;
SensorItemEnable(&g_gyroItem2, ¶, g_gyroItem2.id, 0);
}
STATIC VOID CloseGyro(VOID)
{
CloseParam para;
SensorItemDisable(&g_gyroItem1, ¶, g_gyroItem1.id, 0);
// keep item2 working for 40000 ticks
LOS_TaskDelay(40000);
SensorItemDisable(&g_gyroItem2, ¶, g_gyroItem2.id, 0);
}
STATIC VOID InitGyro(VOID)
{
SensorType *sensor = NULL;
SensorScbTable *scbTable = NULL;
// init gyro sensor
scbTable = SensorTableGet();
sensor = scbTable[TAG_GYRO - TAG_BEGIN].sensorInterface;
if ((sensor != NULL) && (sensor->sensorOp != NULL)) {
(VOID)sensor->sensorOp->Init(sensor);
}
// init item
SensorItemInit(&g_gyroItem1, NULL, TAG_GYRO, SensorReport, TAG_GYRO);
SensorItemInit(&g_gyroItem2, NULL, TAG_GYRO, SensorReport, TAG_GYRO);
}
STATIC VOID MiscTask(VOID const *arg)
{
(VOID)(arg);
// I2C init
I2cMaster_Init();
SensorManagerInit();
LOS_TaskDelay(1000);
GyroSensorRegister();
InitGyro();
OpenGyro();
LOS_TaskDelay(20000);
CloseGyro();
OpenGyro();
LOS_TaskDelay(100000);
CloseGyro();
}
VOID MiscInit(VOID)
{
UINT32 ret;
TSK_INIT_PARAM_S taskInitParam = {0};
taskInitParam.pfnTaskEntry = (TSK_ENTRY_FUNC)MiscTask;
taskInitParam.uwStackSize = STASK_STKDEPTH_MISC;
taskInitParam.pcName = "Misc Task";
taskInitParam.usTaskPrio = STASK_PRIORITY_MISC; /* 1~7 */
taskInitParam.uwResved = LOS_TASK_STATUS_DETACHED; /* task is detached, the task can deleteself */
ret = LOS_TaskCreate(&g_miscTskID, &taskInitParam);
if (ret != LOS_OK) {
PRINT_ERR("Misc Task create fail\n");
return;
}
PRINT_DEBUG("MiscTask init \n");
}
结果验证
第一次数据采样会推送至所有相关应用,后面按照应用周期推送数据。运行得到的结果为:
Get mpu6050 id = 104 gyro on. read data Acc: 642 0 16586 Gyro: -12 0 -9 temp: 31 tag 2 report tag 2 report read data Acc: 662 8 16594 Gyro: -12 0 -9 temp: 31 tag 2 report tag 2 report read data Acc: 652 -14 16566 Gyro: -12 0 -9 temp: 31 tag 2 report read data Acc: 642 -12 16598 Gyro: -12 0 -9 temp: 31 tag 2 report tag 2 report read data Acc: 642 4 16586 Gyro: -12 0 -9 temp: 31 tag 2 report read data Acc: 640 -18 16596 Gyro: -12 -1 -9 temp: 31 tag 2 report ……
完整实例代码
传感器驱动:gyro.c
应用实例:sensorhub_demo.c