楼主: NXP管管

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

 关闭 [复制链接]
抢楼 抢楼 本帖为抢楼帖,欢迎抢楼! 
  • TA的每日心情
    开心
    昨天 08:56
  • 签到天数: 3290 天

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:30:01 | 显示全部楼层
    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的每日心情
    开心
    昨天 08:56
  • 签到天数: 3290 天

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:30:06 | 显示全部楼层
    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的每日心情
    开心
    昨天 08:56
  • 签到天数: 3290 天

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:30: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;
    }
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:56
  • 签到天数: 3290 天

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:30:35 | 显示全部楼层
    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的每日心情
    开心
    昨天 08:56
  • 签到天数: 3290 天

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:30:41 | 显示全部楼层
    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的每日心情
    开心
    昨天 08:56
  • 签到天数: 3290 天

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:30:54 | 显示全部楼层
    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的每日心情
    开心
    昨天 08:56
  • 签到天数: 3290 天

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:30: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的每日心情
    开心
    昨天 08:56
  • 签到天数: 3290 天

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:31: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的每日心情
    开心
    昨天 08:56
  • 签到天数: 3290 天

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:31:13 | 显示全部楼层
    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的每日心情
    开心
    昨天 08:56
  • 签到天数: 3290 天

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:31:21 | 显示全部楼层
    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-16 03:29 , Processed in 0.092856 second(s), 27 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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