C51单片机应用与C语言程序设计
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

任务2 匀加速/减速运动

在前面机器人运动过程中,你是否发现机器人在每次启动和停止的时候,是不是有些太快,从而导致机器人几乎要倾倒。为什么会这样呢?

回忆一下学过的物理知识,还记得牛顿第二定律和运动学知识吗?前面的程序总是直接就给机器人伺服电机输出最大速度控制命令。根据运动学知识,一个物体要从零加速到最大运动速度时,时间越短,所需加速度就越大。而根据牛顿定律,加速度越大,物体所受的惯性力就越大。因此,前面的程序因为没有给机器人足够的加速时间,所以受到的惯性力就比较大,从而导致机器人在启动和停止时有一个较大的前倾力或者后坐力。要消除这种情况,就必须让机器人速度逐渐增加或逐渐减小。采用均匀加速或减速是一种比较好的速度控制策略,这样不仅可以让机器人运动得更加平稳,还可以增加机器人电机的使用寿命。

编写匀加速运动程序

匀加速运动程序片段示例:

    for(pulseCount=10;pulseCount<=200;pulseCount=pulseCount+1)
    {
        P1_1=1;
        delay_nus(1500+pulseCount);
        P1_1=0;

        P1_0=1;
        delay_nus(1500-pulseCount);
        P1_0=0;
        delay_nms(20);
    }

上述for循环语句能使机器人的速度由停止到全速。循环每重复执行一次,变量pulseCount就增加1:第一次循环时,变量pulseCount的值是10,此时发给P1_1、P1_0的脉冲的宽度分别为1.51ms、1.49ms;第二次循环时,变量pulseCount的值是11,此时发给P1_1、P1_0的脉冲的宽度分别为1.511ms、1.489ms。随着变量pulseCount值的增加,电机的速度也在逐渐增加。到执行第190次循环时,变量pulseCount的值是200,此时发给P1_1、P1_0的脉冲的宽度分别为1.7ms、1.3ms,电机全速运转。

回顾第2讲的任务3,for循环也可以由高向低计数。可以通过使用for(pulseCount=200;pulseCount>=0;pulseCount=pulseCount-1)来实现速度的逐渐减小。下面是一个使用for循环实现电机速度逐渐增加到全速然后逐步减小的例子。

例程:StartAndStopWithRamping.c

    #include<BoeBot.h>
    #include<uart.h>
    int main(void)
    {
        int pulseCount;
        uart_Init();
        printf("Program Running!\n");

        for(pulseCount=10;pulseCount<=200;pulseCount=pulseCount+1)
        {
            P1_1=1;
            delay_nus(1500+pulseCount);
            P1_1=0;

            P1_0=1;
            delay_nus(1500-pulseCount);
            P1_0=0;
            delay_nms(20);
        }

        for(pulseCount=1;pulseCount<=75;pulseCount++)
        {
            P1_1=1;
            delay_nus(1700);
            P1_1=0;

            P1_0=1;
            delay_nus(1300);
            P1_0=0;
            delay_nms(20);
        }

        for(pulseCount=200;pulseCount>=0;pulseCount=pulseCount-1)
        {
            P1_1=1;
            delay_nus(1500+pulseCount);
            P1_1=0;

            P1_0=1;
            delay_nus(1500-pulseCount);
            P1_0=0;
            delay_nms(20);
        }
        while(1);
    }

● 输入、保存并运行程序StartAndStopWithRamping.c;

● 验证机器人是否逐渐加速到全速,保持一段时间,然后逐渐减速到停止。

该你了

可以创建一个程序,将加速或减速与其他的运动结合起来。下面是一个逐渐增加速度向后走而不是向前走的例子。加速向后走与向前走的唯一不同之处在于发给P1_1的脉冲的宽度由1.5ms逐渐减小,而向前走是逐渐增加的;相应的,发给P1_0的脉冲的宽度由1.5ms逐步增加。

    for(pulseCount=10;pulseCount<=200;pulseCount=pulseCount+1)
    {
        P1_1=1;
        delay_nus(1500-pulseCount);
        P1_1=0;
        P1_0=1;
        delay_nus(1500+pulseCount);
        P1_0=0;
        delay_nms(20);
    }

也可以通过增加程序中两个pulseCount的值到1500来创建一个在旋转中匀变速的程序。通过逐渐减小程序中两个pulseCount的值,可以沿另一个方向匀变速旋转。这是一个匀变速旋转四分之一周的例子。

    for(pulseCount=1;pulseCount<=65;pulseCount++)//匀加速向右转
    {
      P1_1=1;
      delay_nus(1500+pulseCount);
      P1_1=0;
      P1_0=1;
      delay_nus(1500+pulseCount);
      P1_0=0;
      delay_nms(20);
    }
    for(pulseCount=65;pulseCount>=0;pulseCount--)//匀减速向右转
    {
      P1_1=1;
      delay_nus(1500+pulseCount);
      P1_1=0;
      P1_0=1;
      delay_nus(1500+pulseCount);
      P1_0=0;
      delay_nms(20);
    }

从任务1中打开程序ForwardLeftRightBackward.c,另存为ForwardLeftRightBackward-Ramping.c。

更改新的程序,使机器人的每一个动作都能够匀加速和匀减速。

提示:你可以使用上面的代码片段和StartAndStopWithRamping.c程序中相似的片段。