野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 12058|回复: 4

PID 算法输出结果如何与PWM占空比关联

[复制链接]
发表于 2019-7-31 14:35:38 | 显示全部楼层 |阅读模式
void pid_calc(void)  //pid计算
{
    float dk1;

//        float Iout;
//        float Pout;
//        float Dout;
    float t1;
    float t2;
    float t3;
//if(pidcalcms<(pid.T)) { return ;}//计算周期未到

    pid.Curr = Get18BitMcp3422();
    pid.En = pid.Set - pid.Curr; //得到当前的偏差值
    t1 = pid.Kp * pid.En;  //比例输出

    pid.SEn += pid.En;      //历史偏差总和

    dk1 = pid.En - pid.En_1; //最近两次偏差之差

    t2 =0;// (pid.T * pid.Kp) / pid.Ki;
    t2 = t2 * pid.SEn * pid.Kp; //积分输出

    t3 = (pid.Kp * pid.Kd) / pid.T;

    t3 = t3 * dk1; //微分输出

    pid.Dout = (t1 + t2 + t3)/1000;
        pid.Currpwm += pid.Dout; //本次应该输出的PWM
//////////////////////////////////////////////////////////

    if(pid.Dout > pid.Pwm_Cycle)
    {
        pid.Currpwm = pid.Pwm_Cycle;
    }
    else if(pid.Dout < 1)
    {
        pid.Currpwm = 0;
    }

//pid.OUT+=; //本次的计算结果
    pid.En_1 = pid.En; //更新偏差

    pidcalcms = 0;
}

void Tim1_CH1_DutyCycle_Change(u16 Pulse)
{
        TIM1->CCR1 = Pulse;
}
这两个要如何关联在一起




回复

使用道具 举报

发表于 2019-7-31 19:53:30 | 显示全部楼层
帮顶……把更新的偏差值加(减)到脉宽值试试,先调P,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-25 09:29:24 | 显示全部楼层
WishWish 发表于 2019-7-31 19:53
帮顶……把更新的偏差值加(减)到脉宽值试试,先调P,

pid.Set 设定为100  但是pid.Curr = Get18BitMcp3422();  这个采集到的数据一直在96 97 98 99 100  来回跳动,PID 不是应该 pid.Curr会越来越接近 pid.Set的值的么
回复 支持 反对

使用道具 举报

发表于 2019-9-25 14:55:02 | 显示全部楼层
Minh 发表于 2019-9-25 09:29
pid.Set 设定为100  但是pid.Curr = Get18BitMcp3422();  这个采集到的数据一直在96 97 98 99 100  来回 ...

是已经稳定的状态了?是会有还有波动的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-26 14:43:48 | 显示全部楼层
WishWish 发表于 2019-9-25 14:55
是已经稳定的状态了?是会有还有波动的

会有波动的 ,一直调不到稳定的±1附近
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-24 07:26 , Processed in 0.034511 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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