增量式PID算法C语言源码

本文是本人自己做的简单笔记。

高手忽略哈。

typedef struct{
	int SetPoint;
	long SumError;

	float P;
	float I;
	float D;

	int LastError;
	int PrevError;
}PID;

void PID_Arg_Init(PID* sptr)
{
	sptr->SumError = 0;
	sptr->LastError = 0;
	sptr->PrevError = 0;

	sptr->P = 0.10;
	sptr->I = 0.018;
	sptr->D = 0.13;

	sptr->SetPoint = 50;
}

int PID_Contrl(PID* sptr,int NextPoint)
{
	register int iError,iIncPid;

	iError = sptr->SetPoint - NextPoint;

	iIncPid = sptr->P * iError - sptr->I * sptr->LastError + sptr->D * sptr->PrevError;

	sptr->PrevError = sptr->LastError;
	sptr->LastError = iError;

	return iIncPid;
}

void set_pwm_duty(u16 duty)
{
    //
}


PID PID_Temp;
u16 pwm_duty=0;
u16 pid_add=0;
u16 moto_detect_cnt=0;
void pid_test()
{
    PID_Arg_Init(&PID_Temp);
    moto_detect_cnt=50;
    PID_Temp.SetPoint=80;
    while(1)
    {
        pid_add=PID_Contrl(&PID_Temp,moto_detect_cnt);
        pwm_duty+=pid_add;
        if(pwm_duty>=100)pwm_duty=100;
        set_pwm_duty(pwm_duty);
    }
}

 

简单讲解:

比例积分微分三个参数调整,根据项目实际情况不断试错:

    sptr->P = 0.10;
    sptr->I = 0.018;
    sptr->D = 0.13;

速度反馈值,如电机光栅或霍尔脉冲个数反馈 :moto_detect_cnt=50;

目标值:PID_Temp.SetPoint=80;

假设moto_detect_cnt反馈值是50,程序设定的目标值PID_Temp.SetPoint是80,

则此时说明电机速度不够,需要加快速度(增加PWM占空比)

pid_add=PID_Contrl(&PID_Temp,moto_detect_cnt) 就是对比当前的电机速度反馈值和设定的目标值

然后返回需要增加或者减少多少PWM占空比。

 

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaLLs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值