斜坡发生器(也称为斜坡函数或斜坡控制)是一种用于渐进式地改变系统中某个参数或状态的算法

斜坡发生器(也称为斜坡函数或斜坡控制)是一种用于渐进式地改变系统中某个参数或状态的算法。在自动化控制系统(如机器人控制、电机控制、过程控制等)中,当参数需要从一个值平滑地过渡到另一个值,而不是瞬间变化时,常会使用斜坡发生器。

斜坡发生器的目的是为了防止引起系统的冲击或超调,并确保过渡过程的平稳性。该算法对减少机械磨损、避免不必要的动力浪费以及提高控制精度都是很重要的。

一个基本的线性斜坡发生器可以按照以下步骤实现:

  1. 定义起始值(例如,电机的起始速度)和目标值(电机的目标速度)。

  2. 设置斜坡时间或斜坡速率,这是系统从起始值变化到目标值所需的时间或变化速率。

  3. 在给定的斜坡时间内,周期性地(例如,每个控制周期)计算并更新当前值。

    • 如果是线性斜坡,每次更新后的值是通过在原基础上增加一个固定的量来实现的。
    • 如果是非线性斜坡,更新值可能依赖于更复杂的函数,如指数或对数函数。
  4. 检查是否已经达到或超过了目标值。如果是,停止斜坡更新,并将当前值设定为目标值,以避免超出范围。

斜坡发生器在更新 #statY 的值时,会考虑到更新频率(周期性时间 #tCycle)和斜坡时间(#rampTime)。这样,每个周期内的变化量是均匀和平滑的,直到达到目标值为止。

斜坡发生器在实际控制系统中是非常重要的组成部分,能够保证系统的稳定性和可靠性,尤其是在需要平滑转换和避免剧烈变化的场合。

这里,我们将创建一个简单的斜坡发生器,它按照线性斜坡的方式逐步将一个值 (currentValue) 从一个初始状态转移到目标值 (targetValue):

#include <stdio.h>
#include <stdbool.h>

    // 定义一个用于表示斜坡发生器状态的结构体
    typedef struct RampGenerator
{
    float currentValue; // 当前值
    float targetValue;  // 目标值
    float step;         // 每个控制周期应当改变的数值大小
    bool isBusy;        // 指示斜坡发生器是否正在调整中
} RampGenerator;

// 一个周期内对斜坡发生器状态的更新
void rampIterate(RampGenerator *ramp)
{
    if (ramp->isBusy)
    {
        printf("Current Value Updated: %f\n", ramp->currentValue); // 添加此行代码以在每次迭代后打印当前值

        if (ramp->currentValue < ramp->targetValue)
        {                                     // 如果当前值小于目标值
            ramp->currentValue += ramp->step; // 增大当前值
            if (ramp->currentValue > ramp->targetValue)
            { // 避免超调
                ramp->currentValue = ramp->targetValue;
            }
        }
        else if (ramp->currentValue > ramp->targetValue)
        {                                     // 如果当前值大于目标值
            ramp->currentValue -= ramp->step; // 减小当前值
            if (ramp->currentValue < ramp->targetValue)
            { // 避免超调
                ramp->currentValue = ramp->targetValue;
            }
        }

        // 判断是否达到目标
        if (ramp->currentValue == ramp->targetValue)
        {
            ramp->isBusy = false; // 达到目标,标记为不忙碌
            printf("Ramp complete. Current Value: %f\n", ramp->currentValue);
        }
    }
}

// 初始化斜坡发生器
void rampInit(RampGenerator *ramp, float startValue, float targetValue, float time, float cycleTime)
{
    ramp->currentValue = startValue;
    ramp->targetValue = targetValue;
    // 计算步进值,这里需要注意的是,确保斜坡时间和周期时间都不为零来避免除以零的错误
    if (time != 0 && cycleTime != 0)
    {
        ramp->step = (targetValue - startValue) * (cycleTime / time);
    }
    else
    {
        printf("Error: time and cycleTime must be non-zero.\n");
        ramp->step = 0; // 出错情况下设置为0,避免非法操作
    }
    ramp->isBusy = true; // 标记为忙碌
}

int main()
{
    RampGenerator myRamp;
    rampInit(&myRamp, 0.0, 10.0, 5.0, 0.1); // 开始值0,目标值10,斜坡时间5秒,周期时间0.1秒

    while (myRamp.isBusy)
    {
        rampIterate(&myRamp);
        // 在真实场景中,这里应该等待,比如使用 sleep(100ms) 等待周期时间
        // 为了简化,这里不实现等待
    }

    return 0;
}

在追踪斜坡生成的过程中,你会在控制台看到例如下面的输出,更好地展示当前值随着时间的逐步更新:

Current Value Updated: 0.200000
Current Value Updated: 0.400000
Current Value Updated: 0.600000

Current Value Updated: 9.800000
Current Value Updated: 10.000000
Ramp complete. Current Value: 10.000000
请注意,由于代码中没有实际的等待操作,在实际运行环境中这个输出将紧密连续地出现。在嵌入式系统中,
rampIterate 函数的调用会根据实际的时间周期进行,因此会更直观地看到值的变化过程。

你提供的代码段定义了一个斜坡发生器,并包含了初始化和迭代更新斜坡生成器状态的函数。下面是对这段代码的执行过程的解释和预期结果。

首先,对 RampGenerator 结构体初始化,参数为:

  • 开始值 30
  • 目标值 190
  • 斜坡时间 30 秒,
  • 控制周期 0.1 秒。

rampInit 函数会计算斜坡的步进值:

step = (targetValue - startValue) * (cycleTime / time)

对于你的输入参数:

step = (190 - 30) * (0.1 / 30) = 160 * 0.1 / 30 = 0.5333...

这意味着每次迭代,currentValue 将增加或减少约 0.5333...

main 函数中的 while 循环会反复调用 rampIterate,直到 currentValue 达到 targetValue 或非常接近目标值(误差靠浮点数表示的精度限制)。

由于 step 约为 0.5333333...,则 targetValue 达到 190 需要约 ((190 - 30) / 0.5333...) = 300 步迭代。每次迭代会输出当前的值,直到达到或超过 targetValue

输出(部分):根据计算,一共会有大约 300 次输出,这里仅展示一部分输出作为示例:

Current Value Updated: 30.000000
Current Value Updated: 30.533333
Current Value Updated: 31.066666
...
Current Value Updated: 188.933334
Current Value Updated: 189.466667
Ramp complete. Current Value: 190.000000

最后一行打印表示斜坡生成完成。这表明斜坡发生器已经完成了从 30190 的过渡,并且 ramp->isBusy 被设置为 false 停止了迭代。

所以,程序运行成功,并输出从 30 增到 190 的过程,同时有适当的检查,确保没有超调,确保斜坡是正确的。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值