楼主: NXP管管

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

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

    连续签到: 14 天

    [LV.10]以坛为家III

    19

    主题

    5987

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9204
    最后登录
    2026-4-13
    发表于 2025-12-17 14:29: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的每日心情
    开心
    2026-2-6 09:03
  • 签到天数: 220 天

    连续签到: 1 天

    [LV.7]常住居民III

    43

    主题

    1182

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2531
    最后登录
    2026-2-9
    发表于 2025-12-17 14:29:35 | 显示全部楼层
    /* LPC1768 DAC初始化示例 */
    void DAC_Init_LPC1768(void)
    {
        /* 使能DAC时钟 */
        LPC_SC->PCONP |= (1 << 22); // DAC电源使能
        LPC_PINCON->PINSEL1 &= ~(3 << 20); // P0.26清零
        LPC_PINCON->PINSEL1 |= (2 << 20);  // P0.26 = DAC_OUT
        LPC_DAC->DACR = (0 << 6); // 不使能DMA,基础配置
    }

    /* LPC1768 DAC输出函数 */
    void DAC_OutputVoltage_LPC1768(uint16_t voltage_mV)
    {
        uint16_t dac_value = (voltage_mV * 1023) / 3300; // LPC1768参考电压3.3V,10位DAC
        LPC_DAC->DACR = (dac_value << 6) & 0xFFC0;       // 写入10位数据(bit6~bit15)
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-6 09:03
  • 签到天数: 220 天

    连续签到: 1 天

    [LV.7]常住居民III

    43

    主题

    1182

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2531
    最后登录
    2026-2-9
    发表于 2025-12-17 14:29:37 | 显示全部楼层
    /* LPC1768 DAC初始化示例 */
    void DAC_Init_LPC1768(void)
    {
        /* 使能DAC时钟 */
        LPC_SC->PCONP |= (1 << 22); // DAC电源使能
        LPC_PINCON->PINSEL1 &= ~(3 << 20); // P0.26清零
        LPC_PINCON->PINSEL1 |= (2 << 20);  // P0.26 = DAC_OUT
        LPC_DAC->DACR = (0 << 6); // 不使能DMA,基础配置
    }

    /* LPC1768 DAC输出函数 */
    void DAC_OutputVoltage_LPC1768(uint16_t voltage_mV)
    {
        uint16_t dac_value = (voltage_mV * 1023) / 3300; // LPC1768参考电压3.3V,10位DAC
        LPC_DAC->DACR = (dac_value << 6) & 0xFFC0;       // 写入10位数据(bit6~bit15)
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:22
  • 签到天数: 1167 天

    连续签到: 14 天

    [LV.10]以坛为家III

    19

    主题

    5987

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9204
    最后登录
    2026-4-13
    发表于 2025-12-17 14:30:04 | 显示全部楼层
    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:22
  • 签到天数: 1167 天

    连续签到: 14 天

    [LV.10]以坛为家III

    19

    主题

    5987

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9204
    最后登录
    2026-4-13
    发表于 2025-12-17 14:30:11 | 显示全部楼层
    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:22
  • 签到天数: 1167 天

    连续签到: 14 天

    [LV.10]以坛为家III

    19

    主题

    5987

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9204
    最后登录
    2026-4-13
    发表于 2025-12-17 14:30: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;
    }
    永远开心快乐
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:22
  • 签到天数: 1167 天

    连续签到: 14 天

    [LV.10]以坛为家III

    19

    主题

    5987

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    9204
    最后登录
    2026-4-13
    发表于 2025-12-17 14:30:40 | 显示全部楼层
    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的每日心情
    开心
    2026-2-6 09:03
  • 签到天数: 220 天

    连续签到: 1 天

    [LV.7]常住居民III

    43

    主题

    1182

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2531
    最后登录
    2026-2-9
    发表于 2025-12-17 14:32:19 | 显示全部楼层
    /* LPC1768 DAC初始化示例 */
    void DAC_Init_LPC1768(void)
    {
        /* 使能DAC时钟 */
        LPC_SC->PCONP |= (1 << 22); // DAC电源使能
        LPC_PINCON->PINSEL1 &= ~(3 << 20); // P0.26清零
        LPC_PINCON->PINSEL1 |= (2 << 20);  // P0.26 = DAC_OUT
        LPC_DAC->DACR = (0 << 6); // 不使能DMA,基础配置
    }

    /* LPC1768 DAC输出函数 */
    void DAC_OutputVoltage_LPC1768(uint16_t voltage_mV)
    {
        uint16_t dac_value = (voltage_mV * 1023) / 3300; // LPC1768参考电压3.3V,10位DAC
        LPC_DAC->DACR = (dac_value << 6) & 0xFFC0;       // 写入10位数据(bit6~bit15)
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-6 09:03
  • 签到天数: 220 天

    连续签到: 1 天

    [LV.7]常住居民III

    43

    主题

    1182

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2531
    最后登录
    2026-2-9
    发表于 2025-12-17 14:32:26 | 显示全部楼层
    /* LPC1768 DAC初始化示例 */
    void DAC_Init_LPC1768(void)
    {
        /* 使能DAC时钟 */
        LPC_SC->PCONP |= (1 << 22); // DAC电源使能
        LPC_PINCON->PINSEL1 &= ~(3 << 20); // P0.26清零
        LPC_PINCON->PINSEL1 |= (2 << 20);  // P0.26 = DAC_OUT
        LPC_DAC->DACR = (0 << 6); // 不使能DMA,基础配置
    }

    /* LPC1768 DAC输出函数 */
    void DAC_OutputVoltage_LPC1768(uint16_t voltage_mV)
    {
        uint16_t dac_value = (voltage_mV * 1023) / 3300; // LPC1768参考电压3.3V,10位DAC
        LPC_DAC->DACR = (dac_value << 6) & 0xFFC0;       // 写入10位数据(bit6~bit15)
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2026-2-6 09:03
  • 签到天数: 220 天

    连续签到: 1 天

    [LV.7]常住居民III

    43

    主题

    1182

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2531
    最后登录
    2026-2-9
    发表于 2025-12-17 14:32:30 | 显示全部楼层
    /* LPC1768 DAC初始化示例 */
    void DAC_Init_LPC1768(void)
    {
        /* 使能DAC时钟 */
        LPC_SC->PCONP |= (1 << 22); // DAC电源使能
        LPC_PINCON->PINSEL1 &= ~(3 << 20); // P0.26清零
        LPC_PINCON->PINSEL1 |= (2 << 20);  // P0.26 = DAC_OUT
        LPC_DAC->DACR = (0 << 6); // 不使能DMA,基础配置
    }

    /* LPC1768 DAC输出函数 */
    void DAC_OutputVoltage_LPC1768(uint16_t voltage_mV)
    {
        uint16_t dac_value = (voltage_mV * 1023) / 3300; // LPC1768参考电压3.3V,10位DAC
        LPC_DAC->DACR = (dac_value << 6) & 0xFFC0;       // 写入10位数据(bit6~bit15)
    }
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2026-4-14 00:12 , Processed in 0.089373 second(s), 27 queries , Redis On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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