文档首页 > > 开发指南> 功能组件> 传感框架> 编程实例

编程实例

分享
更新时间:2020/06/24 GMT+08:00

实例描述

基于野火挑战者开发板(Cloud_STM32F429IGTx_FIRE)开发应用定时读取MPU6050传感器的原始数据。MPU6050是一种六轴传感器模块,能同时检测三轴加速度、三轴陀螺仪(角加速度)、温度。本实例中提供的传感器驱动和应用代码仅对使用传感框架读取传感器做基本设计和实现,仅做参考。

  1. 初始化陀螺仪标签类别的两个应用g_gyroItem1、g_gyroItem2。
  2. 设置不同的采集周期,打开应用,注册数据更新回调函数SensorReport。
  3. 采集一段时间后,先关闭g_gyroItem1,此时传感器数据会继续推送g_gyroItem2,一段时间后,关闭g_gyroItem2,此时传感器数据采样停止,SensorReport不再被调用。
  4. 再执行一遍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, &para, g_gyroItem1.id, 0);
    para.period = Item2_SAMPLE_INTERVAL;
    SensorItemEnable(&g_gyroItem2, &para, g_gyroItem2.id, 0);
}
STATIC VOID CloseGyro(VOID)
{
    CloseParam para;
    SensorItemDisable(&g_gyroItem1, &para, g_gyroItem1.id, 0);
    // keep item2 working for 40000 ticks
    LOS_TaskDelay(40000);
    SensorItemDisable(&g_gyroItem2, &para, 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");
}

结果验证

第一次数据采样会推送至所有相关应用,后面按照应用周期推送数据。

图1 实例结果显示

完整实例代码

传感器驱动:gyro.c

应用实例:sensorhub_demo.c

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问