51小车的电机驱动思路

方波和定时器

方波的发送是通过占空比来实现的,而想要实现占空比的话,需要借助到使用定时器的计数变量,这个变量一直在循环增加,当这个变量满足一定数值的时候,可以让释放的方波为1,而满足另外一种数值的时候,可以让释放的方波为0。

这是上述两种功能在逻辑上的衔接关系,那接下来想想代码是如何实现的。

由于你发送方波和定时器计数都是需要定时器来操作的,所以两人是平级的,先让计数变量++,等加加完了之后,再来影响方波发射器的发送,代码逻辑很重要。

电机驱动速度

我们在写小车电机驱动的时候,一定需要明确一个逻辑:小车在同一时间只有一个速度,也就是说我们可以定义一个速度变量或者是速度结构体(让和速度有关的变量封装起来),之后关于速度的任何操作值需要影响这个速度变量就可以影响小车的速度了,这叫做将小车的速度具象化,这是个很重要的思路。就像之前学习的LCD显示一样,其中有显示函数,也有装载了字符串的数组,显示模块永远是不用动的,而影响数据如何,只要对这个字符串数组进行操作就可以了,一定要将功能模块化,完成思维的解耦,这对于功能的构建至关重要,否则实现功能的时候将束手无策。

设置速度的改变

我们一开始设置速度的时候,是直接使用一个暴露在外的函数,直接对一个结构体变量里面的数据进行更改。而后面又增加了一个变量,也就是目标速度和目前速度,这样的话之前暴露在外的函数就是直接更改目标速度了,而目标速度和其他速度的之间的关系也是需要更改,而这个更改就要新建一个内部函数来体现了,这个内部函数就起到了衔接的作用

写函数第一件需要注意的事情

写函数第一件需要注意的事情就是考虑边界。

灵活的代码写法

a = (b > 0);

这句话直接将条件判断语句集成了,直接省略了一个if,这个只适用于布尔。

如果一个函数执行的太快怎么办?

如果一个函数执行的太快的话,比如这个函数在while循环的时候每次都要执行一次,那么我们可以设置一个count,让其当count大于等于20的时候,才可以执行一次,也就是循环20次的时候,才执行一次,然后将count置为0就好了。

整体思路

/*小车电机驱动需要注意的东西:
(1)其实改变小车速度的原理是改变控制信号让小车旋转的占空比,那怎么改变占空比呢?
    我们知道控制小车有两个变量,根据真值表,其中一个变量是保持不动的,另外一个变量是
    改变的,如果另外一个变量保持不变的话,小车就是全速前进,如果控制速度的这个变量是
    在一段时间内,是一段时间是激活的,一段时间是不激活的,利用占空比的方式让这个小车
    比全速满下来,我们假设40是全速的。怎么改变占空比?利用方波就好了,方波就是一个
    占空比的周期,比如我设置30速度的话就是,设置循环count,40个一循环,然后可以将这个
    增加的函数放入定时器中,当遇见前面的30的时候是激活的,后面的10是不激活的。就形成
    占空比控制速度。(也就是40ms一周期,因为我们的定时器是每次是40ms)
(2)还需要注意的一个点是:小车只有一个速度,我们只需要实时更改小车的速度变量就可以对
    小车速度进行更改了,而小车速度变量的改变会影响到方波的发送,进而影响小车的速度
(3)还有一个特别重要的点,既然知道了整个的操作顺序,那么在代码层面上来思考,那些功能需要定时器呢?在没有进行这一步思考的时候,不能思维定式的思考,只有循环count这一个是需要进入定时器里面的,那么还有哪些功能需要进入这里面去呢?我们设想一下,既然方波的改变是需要每一个ms进行检测的那我们是不是得放入定时器中,让其每一个ms都能检测一下,是的!检测方波也是需要进入定时器的。
(4)有了以上的基础,我们就可以实现通过改变速度变量来改变小车的速度了,但是突然改变的小车速度难免会有些僵硬,那我们是不是可以将在速度变量结构体中,设置一个目标速度,和一个现在的速度,即,我们在设置速度的时候,设置的是目标速度,我们再设置一个内部函数,使得其每调用一次这个函数的话就以现在的速度靠近一下这个目标速度,同时改变一下结构体变量里面速度的绝对值和方向,其中注意的事项有两点
        1)在速度这个结构体中,变量是分级别的,其中的速度的方向和绝对值是最高等级的,我们所有的方波
        内部函数都是依靠设定这两个变量来实现的,而目标速度和现在的速度是第二等级的,这两个速度不直接
        和速度方波相互接触,而是通过一个内部函数,当现在速度不断趋近于目标速度的时候,现在速度改变了之后
        内部的速度也是需要进行改变的。
        2)为什么设计调用这个函数就靠近一点点呢?不可以调用这个函数就直接靠近完成不可以吗?如果是直接
        靠近完成的话,靠近的速度会很快,一个指令差不多1us左右(假设是一个机器周期),也就是说,每次靠近
        一点,改变了速度的方向和绝对值,但是你改变速度的方波是40ms一个周期啊,也就是说你得40ms才可以体现出
        下一个速度的变化,而你的靠近指令,调用一次的话,就夸夸靠近了,还没来得及速度反应就完了。所以得每次
        调用一次就是增进一点就好了。
(5)我们在设定的时候,还需要考虑速度设置的值超过40的,如果超过四十的话,就按照40来计算*/

你可能感兴趣的:(嵌入式,嵌入式硬件,单片机,51单片机,物联网)