电机PID调速问题

玉怀一捧雪 2021-04-07 02:47:50
先上代码

#define MAX_DUTY 100 //输出最大占空比

PID sPID;
static pPID sptr;

void IncPIDInit(void)
{
sptr = &sPID;
sptr->SetSpeed = 1000; //设定值

sptr->LastError = 0u; //前2次误差值
sptr->PrevError = 0u; //前1次误差值

sptr->Proportion = 0.41f; //比例
sptr->Integral = 0.25f; //积分
sptr->Derivative = 0.12f; //微分

sptr->iError = 0; //当前误差
sptr->iIncpid = 0; //增量误差

sptr->Uk = 0; //输出返回值
}

int IncPIDCalc(int tag_speed)
{
int duty_pwm;

//当前速度误差
sptr->iError = sptr->SetSpeed- currentSpeed;

//增量误差
sptr->iIncpid = sptr->Proportion * sptr->iError - sptr->Integral * sptr->LastError
+ sptr->Derivative * sptr->PrevError;

//存储误差,用于下次计算
sptr->PrevError = sptr->iError;
sptr->LastError = sptr->LastError;

sptr->Uk += sptr->iIncpid;

duty_pwm = sptr->Uk*0.2f;

//输出值限幅
if (duty_pwm >= MAX_DUTY)
{
duty_pwm = MAX_DUTY;
}
else if(duty_pwm <= 0u)
{
duty_pwm = 0;
}

return duty_pwm;
}


初次调PID,有几个问题请教下

1. 使用增量式PID,通过目标速度和当前速度换算得到增量误差,sptr->iIncpid怎么换算得到PWM占空比,我得到空载100%占空比转速为500转,那是不是可以通过系统0.2来换算

2. sptr->iIncpid增量误差是不是就是需要调整的速度偏差值,即下一次需要整改的速度

3.系数 kp ki kd该怎么调整,通过仿真还是自己一个一个看速度曲线盲调



...全文
423 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2021-04-09
  • 打赏
  • 举报
回复
//增量误差 sptr->iIncpid = sptr->Proportion * sptr->iError - sptr->Integral * sptr->LastError + sptr->Derivative * sptr->PrevError; 红色部分错误,积分部分必须将所有的历史误差累加再乘于积分系数,差分部分才是当前误差减去上次误差乘于差分误差系数! PID系数确定称为整定,先让Ki=Kd=0,由小到大改变Kp,直到不稳定,再加入Ki,同样由小到大调整,再加入Kd,一般,K的基本上是0;
引用 3 楼 玉怀一捧雪 的回复:
存储误差写错了
引用
//存储误差,用于下次计算 sptr->LastError = sptr->iError; sptr->PrevError= sptr->LastError;
你的PID算法不正确,不仅仅红色那个有问题,再仔细看看我给你的算式或者你自己百度一下
worldy 2021-04-09
  • 打赏
  • 举报
回复
你的PID还是不正确 ............ 你的PID输出值就是你的要的占空比,
玉怀一捧雪 2021-04-09
  • 打赏
  • 举报
回复
引用 5 楼 worldy 的回复:
//增量误差 sptr->iIncpid = sptr->Proportion * sptr->iError - sptr->Integral * sptr->LastError + sptr->Derivative * sptr->PrevError; 红色部分错误,积分部分必须将所有的历史误差累加再乘于积分系数,差分部分才是当前误差减去上次误差乘于差分误差系数! PID系数确定称为整定,先让Ki=Kd=0,由小到大改变Kp,直到不稳定,再加入Ki,同样由小到大调整,再加入Kd,一般,K的基本上是0; [quote=引用 3 楼 玉怀一捧雪 的回复:]存储误差写错了
引用
//存储误差,用于下次计算 sptr->LastError = sptr->iError; sptr->PrevError= sptr->LastError;
你的PID算法不正确,不仅仅红色那个有问题,再仔细看看我给你的算式或者你自己百度一下[/quote] 恩,计算公式已经整改

  //增量偏差
sptr->iIncpid = sptr->Proportion*(sptr->iError - sptr->LastError) + sptr->Integral*sptr->iError,+ sptr->Derivative*(sptr->iError - 2 * sptr->LastError + sptr->PrevError);
我的问题是,偏差值sptr->iIncpid怎么换算到PWM占空比上? 通过目标转速换算得到的误差 直接累加到PWM占空比上?
玉怀一捧雪 2021-04-08
  • 打赏
  • 举报
回复
存储误差写错了
引用
//存储误差,用于下次计算 sptr->LastError = sptr->iError; sptr->PrevError= sptr->LastError;
玉怀一捧雪 2021-04-08
  • 打赏
  • 举报
回复
加分
worldy 2021-04-07
  • 打赏
  • 举报
回复
sptr->iIncpid = sptr->Proportion * sptr->iError - sptr->Integral * sptr->LastError+ sptr->Derivative * sptr->PrevError; 红色部分不正确, ei=目标值-当前值; PID=Kp*ei +Ki*Sum(ei)+Kd(ei-ei1);//ei当前的误差值,ei1上次误差值
玉怀一捧雪 2021-04-07
  • 打赏
  • 举报
回复
如果电机空载和带载情况下,是否系数还需要单独分成两组

27,509

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧