楼主: NXP管管

[在线活动] 【疯狂福利日】12月第三弹,无限“货”力,冲

 关闭 [复制链接]
抢楼 抢楼 本帖为抢楼帖,欢迎抢楼! 
  • TA的每日心情
    慵懒
    昨天 21:22
  • 签到天数: 1835 天

    连续签到: 25 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13666

    活跃会员

    最后登录
    2026-4-12
    发表于 2025-12-17 14:27:48 | 显示全部楼层

    int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
    {
      int32_t P,I,D;
      int32_t error;
      
      // 1. 计算当前误差:error = 目标值 - 当前值
      if (sign == 1)
        error = setpoint + current_value_16x;
      else
        error = setpoint - current_value_16x;
      
      // 2. 计算比例项(放大SCALE倍)
      P =  pid.Kp * error;

      // 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
      pid.integral += pid.Ki * error;
      if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
      else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
      I = pid.integral;

      // 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
      D = pid.Kd * (error - pid.prev_error);
      pid.prev_error = error;       // 更新上一次误差  

      // 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
      int32_t total = (P + I + D) >> 10;
      if (total > pid.output_max) return pid.output_max;
      else if (total < pid.output_min) return pid.output_min;
      else return (int16_t)total;
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 21:22
  • 签到天数: 1835 天

    连续签到: 25 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13666

    活跃会员

    最后登录
    2026-4-12
    发表于 2025-12-17 14:27:50 | 显示全部楼层

    int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
    {
      int32_t P,I,D;
      int32_t error;
      
      // 1. 计算当前误差:error = 目标值 - 当前值
      if (sign == 1)
        error = setpoint + current_value_16x;
      else
        error = setpoint - current_value_16x;
      
      // 2. 计算比例项(放大SCALE倍)
      P =  pid.Kp * error;

      // 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
      pid.integral += pid.Ki * error;
      if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
      else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
      I = pid.integral;

      // 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
      D = pid.Kd * (error - pid.prev_error);
      pid.prev_error = error;       // 更新上一次误差  

      // 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
      int32_t total = (P + I + D) >> 10;
      if (total > pid.output_max) return pid.output_max;
      else if (total < pid.output_min) return pid.output_min;
      else return (int16_t)total;
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 09:35
  • 签到天数: 1166 天

    连续签到: 13 天

    [LV.10]以坛为家III

    19

    主题

    5985

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9200
    最后登录
    2026-4-12
    发表于 2025-12-17 14:27:51 | 显示全部楼层
    int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
    {
      int32_t P,I,D;
      int32_t error;
      
      // 1. 计算当前误差:error = 目标值 - 当前值
      if (sign == 1)
        error = setpoint + current_value_16x;
      else
        error = setpoint - current_value_16x;
      
      // 2. 计算比例项(放大SCALE倍)
      P =  pid.Kp * error;

      // 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
      pid.integral += pid.Ki * error;
      if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
      else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
      I = pid.integral;

      // 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
      D = pid.Kd * (error - pid.prev_error);
      pid.prev_error = error;       // 更新上一次误差  

      // 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
      int32_t total = (P + I + D) >> 10;
      if (total > pid.output_max) return pid.output_max;
      else if (total < pid.output_min) return pid.output_min;
      else return (int16_t)total;
    }
    永远开心快乐
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 21:22
  • 签到天数: 1835 天

    连续签到: 25 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13666

    活跃会员

    最后登录
    2026-4-12
    发表于 2025-12-17 14:27:53 | 显示全部楼层

    int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
    {
      int32_t P,I,D;
      int32_t error;
      
      // 1. 计算当前误差:error = 目标值 - 当前值
      if (sign == 1)
        error = setpoint + current_value_16x;
      else
        error = setpoint - current_value_16x;
      
      // 2. 计算比例项(放大SCALE倍)
      P =  pid.Kp * error;

      // 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
      pid.integral += pid.Ki * error;
      if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
      else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
      I = pid.integral;

      // 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
      D = pid.Kd * (error - pid.prev_error);
      pid.prev_error = error;       // 更新上一次误差  

      // 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
      int32_t total = (P + I + D) >> 10;
      if (total > pid.output_max) return pid.output_max;
      else if (total < pid.output_min) return pid.output_min;
      else return (int16_t)total;
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 21:22
  • 签到天数: 1835 天

    连续签到: 25 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13666

    活跃会员

    最后登录
    2026-4-12
    发表于 2025-12-17 14:27:56 | 显示全部楼层

    int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
    {
      int32_t P,I,D;
      int32_t error;
      
      // 1. 计算当前误差:error = 目标值 - 当前值
      if (sign == 1)
        error = setpoint + current_value_16x;
      else
        error = setpoint - current_value_16x;
      
      // 2. 计算比例项(放大SCALE倍)
      P =  pid.Kp * error;

      // 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
      pid.integral += pid.Ki * error;
      if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
      else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
      I = pid.integral;

      // 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
      D = pid.Kd * (error - pid.prev_error);
      pid.prev_error = error;       // 更新上一次误差  

      // 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
      int32_t total = (P + I + D) >> 10;
      if (total > pid.output_max) return pid.output_max;
      else if (total < pid.output_min) return pid.output_min;
      else return (int16_t)total;
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 21:22
  • 签到天数: 1835 天

    连续签到: 25 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13666

    活跃会员

    最后登录
    2026-4-12
    发表于 2025-12-17 14:27:59 | 显示全部楼层

    int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
    {
      int32_t P,I,D;
      int32_t error;
      
      // 1. 计算当前误差:error = 目标值 - 当前值
      if (sign == 1)
        error = setpoint + current_value_16x;
      else
        error = setpoint - current_value_16x;
      
      // 2. 计算比例项(放大SCALE倍)
      P =  pid.Kp * error;

      // 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
      pid.integral += pid.Ki * error;
      if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
      else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
      I = pid.integral;

      // 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
      D = pid.Kd * (error - pid.prev_error);
      pid.prev_error = error;       // 更新上一次误差  

      // 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
      int32_t total = (P + I + D) >> 10;
      if (total > pid.output_max) return pid.output_max;
      else if (total < pid.output_min) return pid.output_min;
      else return (int16_t)total;
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 21:22
  • 签到天数: 1835 天

    连续签到: 25 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13666

    活跃会员

    最后登录
    2026-4-12
    发表于 2025-12-17 14:28:03 | 显示全部楼层

    int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
    {
      int32_t P,I,D;
      int32_t error;
      
      // 1. 计算当前误差:error = 目标值 - 当前值
      if (sign == 1)
        error = setpoint + current_value_16x;
      else
        error = setpoint - current_value_16x;
      
      // 2. 计算比例项(放大SCALE倍)
      P =  pid.Kp * error;

      // 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
      pid.integral += pid.Ki * error;
      if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
      else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
      I = pid.integral;

      // 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
      D = pid.Kd * (error - pid.prev_error);
      pid.prev_error = error;       // 更新上一次误差  

      // 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
      int32_t total = (P + I + D) >> 10;
      if (total > pid.output_max) return pid.output_max;
      else if (total < pid.output_min) return pid.output_min;
      else return (int16_t)total;
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 21:22
  • 签到天数: 1835 天

    连续签到: 25 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13666

    活跃会员

    最后登录
    2026-4-12
    发表于 2025-12-17 14:28:05 | 显示全部楼层

    int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
    {
      int32_t P,I,D;
      int32_t error;
      
      // 1. 计算当前误差:error = 目标值 - 当前值
      if (sign == 1)
        error = setpoint + current_value_16x;
      else
        error = setpoint - current_value_16x;
      
      // 2. 计算比例项(放大SCALE倍)
      P =  pid.Kp * error;

      // 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
      pid.integral += pid.Ki * error;
      if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
      else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
      I = pid.integral;

      // 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
      D = pid.Kd * (error - pid.prev_error);
      pid.prev_error = error;       // 更新上一次误差  

      // 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
      int32_t total = (P + I + D) >> 10;
      if (total > pid.output_max) return pid.output_max;
      else if (total < pid.output_min) return pid.output_min;
      else return (int16_t)total;
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 21:22
  • 签到天数: 1835 天

    连续签到: 25 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13666

    活跃会员

    最后登录
    2026-4-12
    发表于 2025-12-17 14:28:09 | 显示全部楼层

    int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
    {
      int32_t P,I,D;
      int32_t error;
      
      // 1. 计算当前误差:error = 目标值 - 当前值
      if (sign == 1)
        error = setpoint + current_value_16x;
      else
        error = setpoint - current_value_16x;
      
      // 2. 计算比例项(放大SCALE倍)
      P =  pid.Kp * error;

      // 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
      pid.integral += pid.Ki * error;
      if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
      else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
      I = pid.integral;

      // 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
      D = pid.Kd * (error - pid.prev_error);
      pid.prev_error = error;       // 更新上一次误差  

      // 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
      int32_t total = (P + I + D) >> 10;
      if (total > pid.output_max) return pid.output_max;
      else if (total < pid.output_min) return pid.output_min;
      else return (int16_t)total;
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 21:22
  • 签到天数: 1835 天

    连续签到: 25 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13666

    活跃会员

    最后登录
    2026-4-12
    发表于 2025-12-17 14:28:12 | 显示全部楼层

    int16_t PID_Update(int16_t current_value_16x,uint8_t sign)
    {
      int32_t P,I,D;
      int32_t error;
      
      // 1. 计算当前误差:error = 目标值 - 当前值
      if (sign == 1)
        error = setpoint + current_value_16x;
      else
        error = setpoint - current_value_16x;
      
      // 2. 计算比例项(放大SCALE倍)
      P =  pid.Kp * error;

      // 3. 计算积分项:I += Ki × err(积分限幅防止溢出,放大SCALE倍)
      pid.integral += pid.Ki * error;
      if (pid.integral > pid.integral_max) pid.integral = pid.integral_max;
      else if (pid.integral < pid.integral_min) pid.integral = pid.integral_min;
      I = pid.integral;

      // 4. 计算微分项:D = Kd × (err - err_last)(放大SCALE倍)
      D = pid.Kd * (error - pid.prev_error);
      pid.prev_error = error;       // 更新上一次误差  

      // 5. 总输出(P+I+D),限幅到0~100,移10位相当于除1024
      int32_t total = (P + I + D) >> 10;
      if (total > pid.output_max) return pid.output_max;
      else if (total < pid.output_min) return pid.output_min;
      else return (int16_t)total;
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2026-4-13 00:06 , Processed in 0.084136 second(s), 27 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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