会飞的小东 2023-09-22 14:54 采纳率: 50%
浏览 135
已结题

PID算法的输出结果如何转换成pwm

问题

嵌入式PID算法的输出结果是如何转换成pwm控制的

遇到的现象和发生背景

我现在在开发中需要运用到pid算法,主要是压力传感器和流量传感器,pwm主要控制的是比例阀,控制着流量的大小,而流量也会影响输出端的压力大小,现在反馈的是传感器压力的值和我设定的压力值之间的差值作为e(k)

如下是我现在的pid主要代码流程
//根据增量式离散PID公式
//▲u(k) =  Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
//pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
//e(k)代表本次偏差 
//e(k-1)代表上一次的偏差  以此类推 
//e(k-2)代表上上次的偏差
//pwm代表增量输出
typedef struct PID
{ 
  float kp;
  float ki;
  float kd;
  float ek;     //当前误差
  float ek_1;   //上一次误差
  float ek_2;   //上上一次误差
  float limit;  //限幅
  float pid_out;   //pid增量累加和
  //float ek_sum; //误差总和
}PID;

static PID pid;

void PID_Init()
{
    pid.kp = 5;             //这个接口后续调出方便调试使用
    pid.ki = 0.25;
    pid.kd = 3;
    pid.limit = 1000;
    pid.ek = 0;
    pid.ek_1 = 0;
    pid.ek_2 = 0;
    pid.pid_out = 0;
}

// 增量式PID控制
float PID_Increase(int Encoder,int Target)
{
    float delta_pwm = 0;
    pid.ek = Target - Encoder; // 计算当前误差
    //pid.ek_sum += pid.ek;      //求出偏差的积分
    delta_pwm = pid.kp*(pid.ek - pid.ek_1) + pid.ki*pid.ek + 
    pid.kd*(pid.ek - 2*pid.ek_1 + pid.ek_2);   //增量式PID控制器
    pid.ek_1 = pid.ek;   //保存上一次偏差 
    pid.ek_2 = pid.ek_1; //保存上上一次的偏差
    if(pid.pid_out > pid.limit) //这段判断后续再做判断要不要
    {
      delta_pwm =  pid.limit;
    }
    else if(pid.pid_out < -pid.limit)
    {
      delta_pwm =  -pid.limit;
    }
    pid.pid_out += delta_pwm;
    return pid.pid_out;
}

我的解答思路和尝试过的方法

这是我的PID流程图

img

我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”

我现在想知道我用PID增量算法得出来的结果那个数值,是怎么转换成pwm 0-100的开合度的?是不是有一个比例系数?是如何计算的?
我这流量和压力两个参数是不是要用串级pid好一点

  • 写回答

8条回答 默认 最新

  • Leodong. 2023-09-22 16:22
    关注

    该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
    将PID算法的输出结果转换为PWM控制信号的方式通常是通过映射函数来实现。PWM信号的占空比(duty cycle)通常是在0到100之间的百分比,表示开合度。您可以使用以下方法将PID算法的输出映射到PWM占空比范围:

    1、 确定PID输出的范围:根据您的具体应用和系统要求,确定PID输出的最小值和最大值,例如`outputMin`和`outputMax`。
    
    2、 缩放PID输出:将PID的输出值缩放到0100之间的范围。可以使用以下公式:
    
    
       scaledOutput = (pidOutput - outputMin) * (100.0 / (outputMax - outputMin))
    
       ``scaledOutput`是缩放后的输出值,`pidOutput`是PID算法的输出值。
    

    3、 限制PWM占空比范围:根据PWM的要求,将缩放后的输出值限制在0到100之间,以确保PWM占空比的有效范围。可以使用以下代码:

       if (scaledOutput > 100.0) {
         scaledOutput = 100.0;
       } else if (scaledOutput < 0.0) {
         scaledOutput = 0.0;
       }
    

    4、 将缩放后的输出值作为PWM占空比应用于控制信号。具体的应用方法取决于您所使用的嵌入式平台和硬件接口。您可能需要查阅相关文档或资料以了解如何使用PWM模块或函数来生成相应的PWM信号。

    关于您提到的流量和压力两个参数是否需要使用串级PID,这取决于您的系统要求和控制目标。串级PID可以在多个级别对系统进行控制,其中一个PID控制器的输出作为另一个PID控制器的输入。通过串级PID,您可以更好地处理多个物理量之间的相互影响和耦合关系。根据您的应用需求和系统特性,您可以考虑使用串级PID来实现更高级别的控制和优化。

    请注意,上述代码和方法仅供参考,并根据实际情况进行调整和修改。具体的实现方式可能会因嵌入式平台、硬件接口和应用要求的差异而有所不同。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

问题事件

  • 系统已结题 10月3日
  • 已采纳回答 9月25日
  • 赞助了问题酬金15元 9月22日
  • 创建了问题 9月22日

悬赏问题

  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术
  • ¥15 DockerSwarm跨节点无法访问问题