您的位置 首页 芯片行情

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

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

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

前两篇文章:

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

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

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

串级PID结构图

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

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

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

http://news.vvfanli.com/wp-content/uploads/2022/03/20220309060835-6228446371f2c.png

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

http://news.vvfanli.com/wp-content/uploads/2022/03/20220309060836-622844647f619.png

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

http://news.vvfanli.com/wp-content/uploads/2022/03/20220309060838-62284466047ba.png位置环+速度环实践

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

http://news.vvfanli.com/wp-content/uploads/2022/03/20220309060836-622844647f619.pngPID参数定义

由于是串级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控制流程如下图:

http://news.vvfanli.com/wp-content/uploads/2022/03/20220309060839-6228446785d37.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 err = 0;pid->integral = 0;pid->err_last = 0;}/*积分项,积分分离,偏差较大时去掉积分作用*/if(pid->err > -LOC_INTEGRAL_START_ERR && pid->err integral += pid->err;          /*积分范围限定,防止积分饱和*/if(pid->integral > LOC_INTEGRAL_MAX_VAL){pid->integral = LOC_INTEGRAL_MAX_VAL;}else if(pid->integral 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

http://news.vvfanli.com/wp-content/uploads/2022/03/20220309060840-62284468623ca.png开源代码http://news.vvfanli.com/wp-content/uploads/2022/03/20220309060842-6228446ade1cb.jpg <!–

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

作者: admin

为您推荐

如何使用GPU编程优化模型/代码

  使用 Python 和 NumPy 库开发的 HIM 模型在 hackathon 开始时没有并行或 GPU 计算。在活动期间, THINKLAB 团队使用 CuPy 为了使他们的代码在 GPU 上并行运行,然后重点将用户定义的 CUDA 内核应用于参数。结果是 672 倍加速,计算时间从 2 周缩短到大约 30 分钟。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

NVIDIA驱动程序支持OpenCL和Vulkan进行互操作

  OpenCL 和 Vulkan 之间的互操作在移动和桌面平台上都有很强的需求。 NVIDIA 与 Khronos OpenCL 工作组密切合作,发布了一套临时跨供应商的 KHR 扩展。这些扩展使应用程序能够在 OpenCL 和 Vulkan 等 API 之间高效地共享数据,与使用隐式资源的前一代互操作 API 相比,灵活性显著提高。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

准备去元宇宙过第二人生?小心别被骗了

准备去元宇宙过第二人生?小心别被骗了   电子发烧友网报道(文/黄山明)随着元宇宙在近期的大火,相信大家对于这一技术已不陌生。但元宇宙因为其特性,也需要建立合适的网络安全防护措施,来应对这项技术带来的独特挑战。并且在元宇宙想要得以持续,需要用去中心化的平权式共享机制与共治机制来作为保障,既要做大“蛋糕”,也要分好“蛋糕”。但问题在于,去中心化的元宇宙,在安全问题上也将面临更大的挑战。     先简单解释一下元\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

代工巨头再次换帅,中芯国际高管频频离职,业绩喜人之下原因为何?

电子发烧友网(文/黄山明)3月17日,中芯国际发出公告,公司代理董事长高永岗博士,获委任为中芯国际董事长,自2022年3月17日生效。而在半年前辞去中芯国际董事长职位的“芯片泰斗”周子学最终以身体原因为由,辞去了执行董事一职。   对于这一次的交接,有业内人士称这是一次完美的交接,对中芯国际乃至中国半导体产业都有着重要的影响。不过另一方面,自周子学辞任中芯国际董事长之后,其股价便一路走低,从半年前的21.1港元降至如今的\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

电子测量仪器企业普源精电上市!年营收超3亿,募资7.6亿加速自研芯片项目

电子发烧友网报道(文/莫婷婷)4月8日,普源精电在科创板上市,发行价格60.88元/股,公开发行股份约3032.74万股,占公司发行后总股本的比例为25%。该股上市当日开盘即破发,截至今日收盘,普源精电报39.78元,跌幅34.66%,总市值48.26亿元。   图源:东方财富   在上市之前,普源精电在招股书的风险因素中提到,“公司无法保证未来几年内实现盈利,公司上市后亦可能面临退市的风险”。2020年、2021年上半年,普源精电分别亏损2716.6万元、2036.48万元,连\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部