楼主: NXP管管

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

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

    连续签到: 142 天

    [LV.Master]伴坛终老

    9

    主题

    1万

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    18311
    最后登录
    2026-4-15
    发表于 2025-12-17 15:31:26 | 显示全部楼层
    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:44 | 显示全部楼层
    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:49 | 显示全部楼层
    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:55 | 显示全部楼层
    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:32: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:32:10 | 显示全部楼层
    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:32:23 | 显示全部楼层
    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:32:30 | 显示全部楼层
    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:32: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;
    }
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 10:12
  • 签到天数: 2619 天

    连续签到: 49 天

    [LV.Master]伴坛终老

    87

    主题

    2万

    帖子

    3

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    25170
    最后登录
    2026-4-15
    发表于 2025-12-17 15:37:33 | 显示全部楼层
    #include <stdio.h>

    // 冒泡排序函数
    void bubbleSort(int arr[], int n) {
        int i, j, temp;
        for (i = 0; i < n - 1; i++) {
            // 最后i个元素已经排好序
            for (j = 0; j < n - i - 1; j++) {
                // 如果当前元素大于下一个元素,交换它们
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }

    // 打印数组函数
    void printArray(int arr[], int size) {
        int i;
        for (i = 0; i < size; i++) {
            printf("%d ", arr[i]);
        }
        printf("\n");
    }

    // 主函数
    int main() {
        int arr[] = {64, 34, 25, 12, 22, 11, 90};
        int n = sizeof(arr) / sizeof(arr[0]);
       
        printf("排序前的数组: ");
        printArray(arr, n);
       
        bubbleSort(arr, n);
       
        printf("排序后的数组: ");
        printArray(arr, n);
       
        return 0;
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2026-4-16 05:26 , Processed in 0.104885 second(s), 27 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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