请选择 进入手机版 | 继续访问电脑版

喵呜实验室社区

 找回密码
 立即注册
搜索
查看: 1263|回复: 3

关于写入滴答定时器中断中的控制函数以及软定时器

[复制链接]

3

主题

4

帖子

37

积分

新手上路

Rank: 1

积分
37
发表于 2021-4-22 16:19:45 | 显示全部楼层 |阅读模式
void SysTick_Handler(void)
{  
        SoftTimerCountDown();                                                        //软定时器

        g_u8MainEventCount++;

        g_u8SpeedControlPeriod++;     
        SpeedControlOutput();                                           //速度环控制输出函数,每1ms执行一次
        if(g_u8MainEventCount>=5)
        {
                g_u8MainEventCount=0;
                GetMotorPulse();                                                    //捕获电机脉冲(速度)函数,每5ms执行一次
        }
        else if(g_u8MainEventCount==1)
        {
                MPU6050_Pose();                                                           //读取MPU6050数据函数,每5ms执行一次
                AngleCalculate();                                                    //角度环计算函数,每5ms执行一次
        }
        else if(g_u8MainEventCount==2)
        {
                AngleControl();                                                         //角度环控制函数,每5ms执行一次

        }
        else if(g_u8MainEventCount==3)
        {
                g_u8SpeedControlCount++;
            if(g_u8SpeedControlCount >= 5)                                  //25ms
            {               
                      SpeedControl();                                   //车模速度控制函数,每25ms调用一次
                      g_u8SpeedControlCount=0;
                            g_u8SpeedControlPeriod=0;
            }
        }
        else if(g_u8MainEventCount==4)
        {
                MotorManage();                                                                //电机使能/失能控制函数,每5ms执行一次
                MotorOutput();                                                             //电机输出函数,每5ms执行一次
        }
}
想问一下这一段代码的执行逻辑,实在没看懂,每一个控制函数的时间是如何控制的。比如角度环计算的函数,我理解的是当计数器g_u8MainEventCount为1的时候执行,那么时间应该是1ms,可是注释写的是5ms.
以及这个软件定时器在这段函数中的意义,前面代码不是注释了滴答定时器中断的时间为1ms。

回复

使用道具 举报

1

主题

155

帖子

2034

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2034
发表于 2021-4-22 19:04:32 | 显示全部楼层
g_u8MainEventCount为1的时候,它执行if里面的函数,当它为2是,又执行这时if里面的函数,直到5次之后,在回到1,也就是说执行了5个1ms之后才又到执行它。这就相当于5ms执行一次。
软定时器是在1ms里面计数,当你有个其他不重要的函数要100ms执行一次,那么你可以用个软定时器在中断里计数,计数到100了就执行那个函数。大概是这个意思。
回复

使用道具 举报

3

主题

4

帖子

37

积分

新手上路

Rank: 1

积分
37
 楼主| 发表于 2021-4-23 11:30:26 | 显示全部楼层
admin 发表于 2021-4-22 19:04
g_u8MainEventCount为1的时候,它执行if里面的函数,当它为2是,又执行这时if里面的函数,直到5次之后,在 ...

还想多问一下,if -else if的语句逻辑不是如果第一个成立就执行第一个,否则如果第一个成立执行第二那个。那么在g_u8MainEventCount为1的时候,执行的不是应该为读取MPU6050的数据吗,为啥会是一直在执行if里面的函数
回复

使用道具 举报

1

主题

155

帖子

2034

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2034
发表于 2021-4-23 18:21:37 | 显示全部楼层
第1个if成立就执行里面的代码,不成立就往下走,遇到哪个判断语句成立再执行。这些基础东西找本c语言基础看看吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|喵呜实验室社区 ( 粤ICP备15014207号 )

GMT+8, 2022-8-15 02:17 , Processed in 0.135366 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表