uCosIII之软件定时器的使用

来源:互联网 发布:mac相簿照片怎么导出 编辑:程序博客网 时间:2024/06/02 06:12

uCosIII 软件定时器使用实例


uCosIII软件定时器简介:

uC/OS-III提供了一些函数用于管理定时器,如下表:

函数名功能OSTmrCreate()创建和设置定时器OSTmrDel()删除一个定时器OSTmrRemainGet()获得定时器的剩余期限值OSTmrStart()开始定时器运行OSTmrStateGet()获得定时器当前的状态OSTmrStop()暂停定时








我们在使用各个API之前我们先来看看软件定时器创建的API,通过不同的参数我们可以创建几种不同的软件定时器

void OSTmrCreate (OS_TMR *p_tmr, /* Pointer to timer */  CPU_CHAR *p_name, /* Name of timer, ASCII */  OS_TICK dly, /* Initial delay */  OS_TICK period, /* Repeat period */  OS_OPT opt, /* Options */  OS_TMR_CALLBACK_PTR p_callback, /* Fnct to call at 0 */  void *p_callback_arg, /* Arg. to callback */  OS_ERR *p_err) 


定时器可以被设置为3种模式: 一次性定时模式, 无初始定时周期模式( 没有初始的定时),有初始定时周期模式(有初始的定时)、


实例一:调速设备速度平滑控制(采用无初始定时周期模式)

此实例通过无初始值的周期软件定时器来实现调速设备的一个平滑控制,通过输入的指定值和平滑控制时间,计算出控制加速度,然后作为参数创建周期定时器,创建成功后开始定时器并在回调函数中不断将当前速度值与期望速度值进行比较,最终达到期望的速度值。

static      OS_TMR      FanSpdAdjustTmr;//平滑调节定时器static  uint16_t    g_u16FanExpectCtrlSpd = 0;static  uint16_t    g_u16FanCurrentCtrlSpd = 0;static  uint16_t    g_u16FanAdjAcceleratedSpdVal = 0;/*****************************************************************************************************                            SetFanExpectSpdSmoothly()** Description : Control the speed of the pump smoothly.** Argument(s) : i_ExpectFanSpdValue:Expect Speed.*               i_u8SmoothlyControlTimeDly:Adjust delay Time >= 0;if i_u8AdjustTimeDly = 0,set immediately.** Return(s)   : none.** Caller(s)   : none.** Note(s)     : the actual speed grade whole number is 2000.****************************************************************************************************/void SetFanExpectSpdSmoothly(u16 i_ExpectFanSpdValue, u8 i_u8SmoothlyControlTimeDly){    OS_ERR err;    uint16_t m_FanSpdDiffValue = 0;    OSTmrDel(&FanSpdAdjustTmr, &err);//重置定时器状态    if(i_u8SmoothlyControlTimeDly > 0) { //需要速度平滑处理        if(i_ExpectFanSpdValue != g_FanExpectCtrlSpd){//产生新的期望速度            g_FanExpectCtrlSpd = i_ExpectFanSpdValue;        }                if(g_FanCurrentCtrlSpd != g_FanExpectCtrlSpd) {            m_FanSpdDiffValue = abs(g_FanExpectCtrlSpd - g_FanCurrentCtrlSpd);        }                /*加速度计算*/        g_FanAdjAcceleratedSpdVal = m_FanSpdDiffValue / 2 / i_u8SmoothlyControlTimeDly;                OSTmrCreate((OS_TMR *)&FanSpdAdjustTmr,                    (CPU_CHAR *)"Fan Speed Adjust Timer",                    (OS_TICK)0,                    (OS_TICK) OS_CFG_TMR_TASK_RATE_HZ / 2,      /* control cycle 0.5s */                    (OS_OPT)OS_OPT_TMR_PERIODIC,                    (OS_TMR_CALLBACK_PTR)FanAdjustCallBack,                    (void *)0,                    (OS_ERR *)&err);        if(err == OS_ERR_NONE) {            OSTmrStart(&FanSpdAdjustTmr, &err);        }    } else {        SetFanCurrentCtrlSpd(i_ExpectFanSpdValue);    }}/*****************************************************************************************************                            FanAdjustCallBack()** Description : when FanSpdAdjustTmr time out that call back function.** Argument(s) : none.** Return(s)   : none.** Caller(s)   : Application.** Note(s)     : none.****************************************************************************************************/static void FanAdjustCallBack(OS_TMR *p_tmr, void *p_arg){      OS_ERR err;    uint16_t FanCurrentCtlSpd = 0;    FanCurrentCtlSpd = GetFanCurrentCtrlSpd();    if(FanCurrentCtlSpd != GetFanExpectCtrlSpd()) {        if(FanCurrentCtlSpd > GetFanExpectCtrlSpd()) {            if(FanCurrentCtlSpd > g_FanAdjAcceleratedSpdVal){//防止减溢出                FanCurrentCtlSpd -= g_FanAdjAcceleratedSpdVal;            }else{                FanCurrentCtlSpd = 0;            }        } else {            FanCurrentCtlSpd += g_FanAdjAcceleratedSpdVal;            if(FanCurrentCtlSpd >= g_FanExpectCtrlSpd){                FanCurrentCtlSpd = g_FanExpectCtrlSpd;            }        }        SetFanCurrentCtrlSpd(FanCurrentCtlSpd);    } else {        OSTmrDel(&FanSpdAdjustTmr, &err);    }}

实例二:调速设备速度阶梯延时控制(采用有初始定时周期模式)


此实例通过采用有初始定时周期模式的软件定时器来实现一个阶梯延时控制调速设备的功能,通过输入初始速度和终止期望速度以及第一次延迟时间和周期延时时间来创建我们的软件定时器,之后开启软件定时器并在回调函数中不断与期望速度进行比较直到达到我们的期望速度值。

static      OS_TMR      FanSpdSteppedCycleDlyAdjustTmr;//风机阶梯延时调节定时器static  uint16_t    g_FanExpectCtrlSpd = 0;static  uint16_t    g_FanCurrentCtrlSpd = 0;/*****************************************************************************************************                                         SetFanSpdSteppedCycleDelay()** Description : Delay for a period of time to set the fan speed stepped.** Arguments   : i_StartSpdVal:the start fan speed.*i_u8StartDlyAdjTime:start adjust delay time.*               i_u8DelayTime:Adjust the cycle time delay(s),if i_u8DelayTime =0,set immediately.*               i_u16ExpectSpdValue:the expected hydrogen fan speed.** Returns     : none.** Notes       : the actual speed grade whole number is 2000.****************************************************************************************************/void SetFanSpdSteppedCycleDelay(uint16_t i_StartSpdVal, uint8_t i_FirstDlyAdjTime, uint8_t i_CycleDlyAdjTime, uint16_t i_ExpSpdVal){    OS_ERR err;    OSTmrDel(&FanSpdSteppedCycleDlyAdjustTmr, &err);//重置定时器状态    g_FanExpectCtrlSpd = i_ExpSpdVal ;    if((i_FirstDlyAdjTime > 0) || (i_CycleDlyAdjTime > 0)) {        OSTmrCreate((OS_TMR *)&FanSpdSteppedCycleDlyAdjustTmr,                    (CPU_CHAR *)"Fan Speed cycle Delay Adjust Timer",                    (OS_TICK)i_FirstDlyAdjTime * OS_CFG_TMR_TASK_RATE_HZ,//首次延时dly(s)                    (OS_TICK)i_CycleDlyAdjTime * OS_CFG_TMR_TASK_RATE_HZ,//周期延时cycle(s)                    (OS_OPT)OS_OPT_TMR_PERIODIC,                    (OS_TMR_CALLBACK_PTR)FanSpdCycleDlyAdjCallBack,                    (void *)0,                    (OS_ERR *)&err);                             if(err == OS_ERR_NONE) {            OSTmrStart(&FanSpdSteppedCycleDlyAdjustTmr, &err);           }              } else {        SetFanCtrlSpd(g_FanExpectCtrlSpd);    }      SetFanCtrlSpd(i_StartSpdVal);}/*****************************************************************************************************                            FanSpdCycleDlyAdjCallBack()** Description : when FanSpdSteppedCycleDlyAdjustTmr time out that call back function.** Argument(s) : none.** Return(s)   : none.** Note(s)     : none.****************************************************************************************************/static void FanSpdCycleDlyAdjCallBack(OS_TMR *p_tmr, void *p_arg){    OS_ERR err;    if(g_FanCurrentCtrlSpd != g_FanExpectCtrlSpd) {        if(g_FanCurrentCtrlSpd < g_FanExpectCtrlSpd) {            FanCtrSpdInc();        } else {            FanCtrSpdDec();        }    } else {        OSTmrDel(&FanSpdSteppedCycleDlyAdjustTmr, &err);    }}

总结:
uCos软件定时器用起来还是比较灵活的,主要是灵活的进行参数的设置,单次、周期、单次+周期,活学活用嘛!
参数设置的时候用这个定时器专用的宏OS_CFG_TMR_TASK_RATE_HZ会比用OS_CFG_TICK_TASK_PRIO要好,防止别人在用你的API的时候系统时钟节拍不一样而出现异常。

阅读全文
'); })();
1 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 光想眨眼睛是怎么办 孩子老是吸鼻子怎么办 孩子用力吸鼻子怎么办 小孩总挤眼睛怎么办 48岁眼睛模糊怎么办 小孩眼睛不停眨怎么办 老年人眼晴干涩怎么办 15岁眼睛有层雾怎么办 眼睛看不了强光怎么办 眼花然后眼疼怎么办 颈椎压神经头疼怎么办 头顶痛眼睛胀痛怎么办 恶心模糊想吐怎么办 孩子眼干涩眨眼怎么办 上火了眼睛模糊怎么办 眼睛眯了东西怎么办 上火出眼屎多怎么办 孩子总是眨巴眼怎么办 胖小孩血糖高怎么办 不胖血糖高怎么办 月经结束后头晕怎么办 眼睛黑眼圈越来越严重怎么办 迷糊眼睛有重影怎么办 手心经常出冷汗怎么办 眼睛有点怕光怎么办 戴眼镜近处模糊怎么办 眼睛看近处模糊怎么办 鼻子颜色暗沉怎么办 泰迪鼻子变红怎么办 鼻子高鼻孔大怎么办 绘画时感觉不好怎么办 速写一直不提高怎么办 工具栏打印删除了怎么办 工具栏隐藏了怎么办 cad 鞋子不透气脚痒怎么办 脚起泡破了怎么办 穿鞋子脚底起泡怎么办 脚趾穿鞋挤的疼怎么办 鞋子硬穿着脚痛怎么办 穿皮鞋脚掌疼怎么办 画画 起型不准怎么办?