0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

电机控制进阶3——PID串级控制

码农爱学习 来源:码农爱学习 作者:码农爱学习 2022-03-03 09:11 次阅读


前两篇文章:

https://www.elecfans.com/d/1796839.html

https://www.elecfans.com/d/1798370.html

分别介绍了PID速度控制和PID位置控制,分别用来控制电机以期望的速度持续转动以及以期望的位置(圈数)转动,这里的期望值都只有一个,但是,如果想要以期望的速度转动到期望的位置(启动与停止的加减速过程不考虑),该怎么控制呢?那就要将两者结合起来了,即PID的串级控制来控制电机。

串级PID结构图

PID串级控制的典型结构为位置环+速度环+电流环,如下图。

PID串级控制中,最外环是输入是整个控制系统的期望值,外环PID的输出值是内环PID的期望值。

能够使用三环控制的前提是要硬件支持,比如位置环和速度环需要实时的电机转动位置和转动速度作为反馈,这就需要电机需要配有编码器用于测速与测量转动的位置;电流环需要有电流采样电路来实时获取电机的电流作为反馈。

poYBAGEDqnyAaKz3AABbI6UjquI821.png

如果没有电流采样电路,可以将电流环去掉,只使用位置环+速度环,系统的期望仍是转动的位置,内环可以调节转动的速度。

poYBAGEDqoCAR2j-AABF-aCtQ_Q220.png

另外,如果只是想控制电机转速实现电机调速,可以使用速度环+电流环,系统的期望仍是转动的位置,内环可以调节电机的电流,增强系统转动调节的抗干扰能力。

pYYBAGEDqoSAU0fqAAA8tylWYOw423.png

位置环+速度环实践

由于我的电机没有电流测量电路,所以,本文以位置环+速度环来学习PID串级控制。就是按照下面这个图:

poYBAGEDqoCAR2j-AABF-aCtQ_Q220.png

PID参数定义

由于是串级PID控制,每一级的PID都要有自己的参数,本次实验使用位置PID+速度PID,参数定义如下:

/*定义位置PID与速度PID结构体型的全局变量*/
PID pid_location;
PID pid_speed;

/**
  * @brief  PID参数初始化
  *	@note 	无
  * @retval 无
  */
void PID_param_init()
{
	/* 位置相关初始化参数 */
	pid_location.target_val = TOTAL_RESOLUTION*10;				
	pid_location.output_val = 0.0;
	pid_location.err = 0.0;
	pid_location.err_last = 0.0;
	pid_location.integral = 0.0;

	pid_location.Kp = 0.05;
	pid_location.Ki = 0;
	pid_location.Kd = 0;

	/* 速度相关初始化参数 */
	pid_speed.target_val=10.0;				
	pid_speed.output_val=0.0;
	pid_speed.err=0.0;
	pid_speed.err_last=0.0;
	pid_speed.integral=0.0;

	pid_speed.Kp = 80.0;
	pid_speed.Ki = 2.0;
	pid_speed.Kd = 100.0;
}

位置PID的实现

这里有两点需要注意:

闭环死区的设定

闭环死区是指执行机构的最小控制量,无法再通过调节来满足控制精度,如果仍然持续调节,系统则会在目标值前后频繁动作,不能稳定下来。

比如某个系统的控制精度是1,但目标值需要是1.5,则无论怎么调节,最终的结果只能控制在 1或 2,始终无法达到预设值。这 1.5L小数点后的范围,就是闭环死区,系统是无法控制的,误差会一直存在,容易发生震荡现象。

对应精度要求不高的系统,可以设定闭环死区,比如将允许的误差范围设为0.5,则最终结果在 1或 2都认为是没有误差,这时将目标值 与实际值之差强制设为 0,认为没有误差,即限定了闭环死区。

积分分离的设定

通过积分分离的方式来实现抗积分饱和,积分饱和是指执行机构达到极限输出能力了,仍无法到达目标值,在很长一段时间内无法消除静差造成的。

例如,PWM输出到了100%,仍达不到期望位置,此时若一直进行误差累加,在一段时间后, PID 的积分项累计了很大的数值,如果这时候到达了目标值或者重新设定了目标值,由于积分由于累计的误差很大,系统并不能立即调整到目标值,可能造成超调或失调的现象。

解决积分饱和的一种方法是使用积分分离,该方法是在累计误差小于某个阈值才使用积分项,累计误差过大则不再继续累计误差,相当于只使用了PD控制器

控制流程图

带有闭环死区积分分离的PID控制流程如下图:

poYBAGEDqo2AMCnLAABHUOq9RWI531.png

完整的位置PID代码如下:

/**
  * @brief  位置PID算法实现
  * @param  actual_val:实际值
  *	@note 	无
  * @retval 通过PID计算后的输出
  */
#define LOC_DEAD_ZONE 60 /*位置环死区*/
#define LOC_INTEGRAL_START_ERR 200 /*积分分离时对应的误差范围*/
#define LOC_INTEGRAL_MAX_VAL 800   /*积分范围限定,防止积分饱和*/
float location_pid_realize(PID *pid, float actual_val)
{
	/*计算目标值与实际值的误差*/
	pid->err = pid->target_val - actual_val;

	/* 设定闭环死区 */
	if((pid->err >= -LOC_DEAD_ZONE) && (pid->err <= LOC_DEAD_ZONE))
	{
		pid->err = 0;
		pid->integral = 0;
		pid->err_last = 0;
	}

	/*积分项,积分分离,偏差较大时去掉积分作用*/
	if(pid->err > -LOC_INTEGRAL_START_ERR && pid->err < LOC_INTEGRAL_START_ERR)
	{
		pid->integral += pid->err;  
        /*积分范围限定,防止积分饱和*/
		if(pid->integral > LOC_INTEGRAL_MAX_VAL)
		{
			pid->integral = LOC_INTEGRAL_MAX_VAL;
		}
		else if(pid->integral < -LOC_INTEGRAL_MAX_VAL)
		{
			pid->integral = -LOC_INTEGRAL_MAX_VAL;
		}
	}	

	/*PID算法实现*/
	pid->output_val = pid->Kp * pid->err +
	                  pid->Ki * pid->integral +
	                  pid->Kd * (pid->err - pid->err_last);

	/*误差传递*/
	pid->err_last = pid->err;

	/*返回当前实际值*/
	return pid->output_val;
}

串级控制代码

//周期定时器的回调函数
void AutoReloadCallback()
{
	static uint32_t location_timer = 0;    // 位置环周期
	
	static __IO int encoderNow = 0;    /*当前时刻总计数值*/
    static __IO int encoderLast = 0;   /*上一时刻总计数值*/
	int encoderDelta = 0; /*当前时刻与上一时刻编码器的变化量*/
	float actual_speed = 0;  /*实际测得速度*/
	int actual_speed_int = 0;
	
	int res_pwm = 0;/*PID计算得到的PWM值*/
	static int i=0;
	
	/*【1】读取编码器的值*/
	encoderNow = read_encoder() + EncoderOverflowCnt*ENCODER_TIM_PERIOD;/*获取当前的累计值*/
	encoderDelta = encoderNow - encoderLast; /*得到变化值*/
	encoderLast = encoderNow;/*更新上次的累计值*/
	
	/*【2】位置PID运算,得到PWM控制值*/
	if ((location_timer++ % 2) == 0)
	{
		float control_val = 0;   /*当前控制值*/
		
		/*位置PID计算*/
		control_val = location_pid_realize(&pid_location, encoderNow);  
		
        /*目标速度值限制*/
		speed_val_protect(&control_val);

		/*设定速度PID的目标值*/
		set_pid_target(&pid_speed, control_val);    
	}
	  
	/* 转速(1秒钟转多少圈)=单位时间内的计数值/总分辨率*时间系数, 再乘60变为1分钟转多少圈 */
    actual_speed = (float)encoderDelta / TOTAL_RESOLUTION * 10 * 60;
    
	/*【3】速度PID运算,得到PWM控制值*/
	actual_speed_int = actual_speed;
	res_pwm = pwm_val_protect((int)speed_pid_realize(&pid_speed, actual_speed));
	
	/*【4】PWM控制电机*/
	set_motor_rotate(res_pwm);
	
	/*【5】数据上传到上位机显示*/
	set_computer_value(SEND_FACT_CMD, CURVES_CH1, &encoderNow, 1);   /*给通道1发送实际的电机【位置】值*/
}

PID的计算是通过定时器调用,每10ms一次,从代码中可以看到,内环(速度PID)控制的周期要比外环(位置PID)的周期短,位置PID是每两次循环计算一次,因为内环控制着最终的输出,这个输出对应的就是实际场景中的控制量 (本实验最终控制的是位置),位置是无法突变,是需要时间积累的,所以内环输出尽可能快些。

视频演示

视频中,测试以不同的目标速度到达目标位置,视频后半段测试引入干扰情况下的控制效果:

https://www.bilibili.com/video/BV1QK4y1g7yg?spm_id_from=333.999.0.0

poYBAGIfi1SAev4XAB7D6AFF3Bg344.png

开源代码

pYYBAGIfi1qAHxAXAADa2vDgLF0830.png
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    5992

    文章

    43909

    浏览量

    619656
  • 电机控制
    +关注

    关注

    3456

    文章

    1676

    浏览量

    263864
  • STM32
    +关注

    关注

    2232

    文章

    10650

    浏览量

    347885
  • PID
    PID
    +关注

    关注

    35

    文章

    1441

    浏览量

    83501
收藏 人收藏

    评论

    相关推荐

    电机控制进阶1——PID速度控制

    之前的几篇文章(电机控制基础篇),介绍的电机编码器原理、定时器输出PWM、定时器编码器模式测速等。 本篇在前几篇的基础上,继续来学习电机控制
    的头像 发表于 02-24 09:19 2.4w次阅读
    <b class='flag-5'>电机</b><b class='flag-5'>控制</b><b class='flag-5'>进阶</b>1——<b class='flag-5'>PID</b>速度<b class='flag-5'>控制</b>

    #工作原理大揭秘 #电子技术 #电机 速度位置双闭环的PID控制

    PID控制电机与驱动
    jf_76945564
    发布于 :2023年07月15日 14:54:46

    一文详解PID控制

    阀,从而对外环被控量具有更好的控制效果。这样的控制系统被称为系统。PID
    发表于 10-22 10:11

    实例分析:简单PIDPID的优劣

    什么是PID?什么是PID?顾名思义就是两个串起来的
    发表于 02-27 07:00

    电机控制进阶2之PID位置控制 相关资料推荐

    上篇文章电机控制进阶——PID速度控制讲解了电机的速度环控制
    发表于 06-29 07:39

    基于大疆RM3508电机PID相关资料推荐

    2.配置程序关于3508的配置程序以及一些其他部分在我的另外一篇博客里有详细的介绍,本篇主要是详细讲解3508pid(转固定角度)。大疆3508/2006/6020电机使用教程
    发表于 06-30 06:15

    PID控制的原理是什么?如何去实现PID的源码呢

    PID控制的原理是什么?如何去实现PID的源码呢?
    发表于 12-17 06:28

    如何用PID控制控制电机

    PID速度控制PID位置控制是什么?如何用PID
    发表于 12-21 06:45

    PID控制控制电机

    的加减速过程不考虑),该怎么控制呢?那就要将两者结合起来了,即PID控制控制
    发表于 01-10 08:30

    【创作者之星.No3电机控制原理与电路设计知识汇总

    参数,编码器模式配置,PID数值计算与控制逻辑等核心程序实现。6、电机控制进阶3——
    发表于 04-08 14:53

    PID调节控制电机

    PID调节控制电机
    发表于 11-17 18:35 12次下载

    PID控制电机分析

    控制电机中,PID控制器通常用来控制电机的转速或者位置。具体来说,
    发表于 03-12 10:39 2806次阅读

    电机控制中的PID

    FOC算法中的电流环,速度环都涉及到PID控制 PID又分位置式PID控制算法和增量式PID
    发表于 05-05 11:51 10次下载
    <b class='flag-5'>电机</b><b class='flag-5'>控制</b>中的<b class='flag-5'>PID</b>

    电机控制进阶——PID速度控制

    PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。 PID是经典的闭环控制算法,具有原理简单,易于实现,适用面广,控制参数
    发表于 05-05 15:01 4次下载
    <b class='flag-5'>电机</b><b class='flag-5'>控制</b><b class='flag-5'>进阶</b>——<b class='flag-5'>PID</b>速度<b class='flag-5'>控制</b>

    电机控制进阶2——PID位置控制

    本篇来介绍电机的位置环控制,实现电机快速准确地转动到指定位置。回顾上篇,电机速度PID控制的结构
    发表于 05-06 11:50 7次下载
    <b class='flag-5'>电机</b><b class='flag-5'>控制</b><b class='flag-5'>进阶</b>2——<b class='flag-5'>PID</b>位置<b class='flag-5'>控制</b>