楼主: NXP管管

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

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

    连续签到: 26 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13670

    活跃会员

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

    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的每日心情
    慵懒
    昨天 23:22
  • 签到天数: 1836 天

    连续签到: 26 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13670

    活跃会员

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

    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的每日心情
    慵懒
    昨天 23:22
  • 签到天数: 1836 天

    连续签到: 26 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13670

    活跃会员

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

    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的每日心情
    慵懒
    昨天 23:22
  • 签到天数: 1836 天

    连续签到: 26 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13670

    活跃会员

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

    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的每日心情
    慵懒
    昨天 23:22
  • 签到天数: 1836 天

    连续签到: 26 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13670

    活跃会员

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

    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的每日心情
    慵懒
    昨天 23:22
  • 签到天数: 1836 天

    连续签到: 26 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13670

    活跃会员

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

    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的每日心情
    慵懒
    昨天 23:22
  • 签到天数: 1836 天

    连续签到: 26 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13670

    活跃会员

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

    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的每日心情
    慵懒
    昨天 23:22
  • 签到天数: 1836 天

    连续签到: 26 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13670

    活跃会员

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

    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的每日心情
    慵懒
    昨天 23:22
  • 签到天数: 1836 天

    连续签到: 26 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13670

    活跃会员

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

    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的每日心情
    慵懒
    昨天 23:22
  • 签到天数: 1836 天

    连续签到: 26 天

    [LV.Master]伴坛终老

    40

    主题

    2万

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    13670

    活跃会员

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

    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-14 00:06 , Processed in 0.101841 second(s), 27 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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