【程序】【必须】PID位置环控制,代码+调参

这篇具有很好参考价值的文章主要介绍了【程序】【必须】PID位置环控制,代码+调参。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

​ 前面两篇博文已经实现了电机测速和PID速度环控制,在这篇博文中,我们主要说明位置环的代码怎么写以及PID参数怎么调。

1. 位置环代码实现

​ 写完速度环后位置环就很简单了。

​ 在串级PID中,内环的控制量一般是外环控制量的微分。在我们这里,外环是控制量是电机转动的位置(也可以说是角度),内环是电机转动的速度,刚好满足这个微分关系。

​ 我们的思路是这样的,我们给外环PID设定电机转动的目标位置,位置环PID计算得到电机此时的理想转速,送到内环速度环,速度环计算得到此时PWM理想的占空比,并输出给电机。双环PID就需要两个反馈量,速度环的反馈量仍然是电机的速度,而位置环的反馈量可以使用编码器输出的脉冲总数。由于电机正转时脉冲总数会增加,而反转时脉冲总数会减少,所以脉冲总数其实是和电机转动的位置一一对应的。

​ 位置环实现代码如下

​ 因为死区和刹车这些东西位置环和速度环不一样,为了和速度环区分开,我们需要在PID.c中加上一个位置环的PID函数。

PID pid_speed,pid_position;
/**********************************
 * 功能:PID结构体参数初始化
 * 输入:无
 * 返回:无
 * *******************************/
void PID_Init(void)//PID参数初始化
{
    pid_speed.err = 0;
    pid_speed.integral = 0;
    pid_speed.maxIntegral = 1000;
    pid_speed.maxOutput = __HAL_TIM_GetAutoreload(&PWM_TIM);
    pid_speed.lastErr = 0;
    pid_speed.output = 0;
    pid_speed.kp = KP_speed;
    pid_speed.ki = KI_speed;
    pid_speed.kd = KD_speed;

    pid_position.err = 0;
    pid_position.integral = 0;
    pid_position.maxIntegral = 80;
    pid_position.maxOutput = __HAL_TIM_GetAutoreload(&PWM_TIM);
    pid_position.lastErr = 0;
    pid_position.output = 0;
    pid_position.kp = KP_position;//这几个宏定义要自己补充
    pid_position.ki = KI_position;
    pid_position.kd = KD_position;
}

/****************************************
 * 作用:位置环PID计算
 * 参数:PID参数结构体地址;目标值;反馈值
 * 返回值:无
 * ****************************************/
float Location_PID_Realize(PID* pid,float target,float feedback)//一次PID计算
{
     if(pid->err < 0.5 && pid->err > -0.5) pid->err = 0;//pid死区
    pid->err = target - feedback;
    pid->integral += pid->err;

    if(pid->ki * pid->integral < -pid->maxIntegral) pid->integral = -pid->maxIntegral / pid->ki;//积分限幅
    else if(pid->ki * pid->integral > pid->maxIntegral) pid->integral = pid->maxIntegral / pid->ki;

    pid->output = (pid->kp * pid->err) + (pid->ki * pid->integral) + (pid->kd * (pid->err - pid->lastErr));//全量式PID

    //输出限幅
    if(pid->output > pid->maxOutput) pid->output = pid->maxOutput;
    if(pid->output < -pid->maxOutput) pid->output = -pid->maxOutput;

    pid->lastErr = pid->err;

    return pid->output;
}

​ 定时器函数如下

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{

    Motor_Contorl(htim);//我把测速和PID封装成一个函数了
}
    
void Motor_Contorl(TIM_HandleTypeDef *htim)
{
    Motor_Get_Speed(htim);//得到电机转速
    Now_Position = (float)(motor1.totalCount-10000)// 得到当前位置 10000编码器脉冲计数的初始值
    Target_Speed = Location_PID_Realize(&pid_position,Target_Position,Now_Position);//位置环 Target_Position是目标位置,自行定义即可
    motor_Out = Speed_PID_Realize(&pid_speed,Target_Speed,motor1.speed);//速度环
    if(motor_L_Out >= 0)
    {
        __HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL_FORWARD, 1000);
        __HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL_BACKWARD, 1000-motor_Out);
    }
    else
    {
        __HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL_BACKWARD, 1000);
        __HAL_TIM_SetCompare(&MOTOR_TIM, MOTOR_CHANNEL_FORWARD, 1000+motor_Out);
    }
}

​ 现在位置环的代码就完成了,下一步我们需要进行PID调参

2. 位置环PID调参

​ 位置环调参和速度环有很大区别,按我的经验来说,一般用不到I和D,我们只要调整P就好。

​ 我们从0开始逐步增大P,直到电机在前往目标位置的过程中是满速,而到达目标位置后不会超调、震荡就行,位置环调好后曲线应该是这样的:

位置环pid,程序,stm32,驱动开发,硬件工程,单片机,嵌入式硬件

​ 上图中,红线是目标位置,绿线是当前位置,这里的位置并不是脉冲数,而是换算到了实际场景中,单位是cm,用脉冲数也是一样的。

如果觉得电机达到目标速度的过程中速度过快,可以对位置环的输出进行限幅。文章来源地址https://www.toymoban.com/news/detail-787907.html

到了这里,关于【程序】【必须】PID位置环控制,代码+调参的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX 直流电机串级PID位置速度控制、HAL库、cubemx、PID、串级PID、位置控制、速度控制、双环控制

    提示:本文章的串级PID位置速度控制,是在前两篇文章速度控制,位置控制的基础上实现的,这一章节中不需要额外的cubemx的配置,只需要写简单的代码即可,复杂的地方在于串级pid的调试过程。 pid是我们在学习单片机中首先要学会的控制算法,而串级pid又是在单pid的基础上

    2024年02月14日
    浏览(51)
  • 三天让车立起来!STM32平衡车入门PID —— 第三天(PID调参)

    说明:本文章适用于STM32初学者,想完成一个好玩且有深度的项目但不知道从何下手的同学。 PID调参是平衡车的精髓所在,参数整定的好坏直接影响到平衡车的平衡效果。有的车平衡时来回晃而参数选的好的车就能稳稳地平衡在原地。可见PID调参在PID中是重中之重。我们一定

    2023年04月18日
    浏览(37)
  • STM32写的PID算法温度控制程序示例

    使用STM32写的PID算法温度控制程序示例,该程序通过读取温度传感器的数据,并采用PID控制算法,输出PWM信号来控制加热器的工作,以实现温度的稳定控制。  以上代码基于STM32F10x的单片机实现,使用了定时器来输出PWM信号,以控制加热器的加热功率。同时,该程序还实现了

    2024年02月15日
    浏览(35)
  • STM32应用(十)经典控制算法PID(单级和串级)原理与代码实现

    PID是什么,P,I,D的分别功能 你和PID调参大神之间,就差这篇文章! P(比例): 简单来说,P就是凉了加热水,热了加凉水。 比目标值小 ,我就 增加 一点, 比目标值大 ,我就 减小 一点。 (现在) P可能出现的问题: 1.P太小,达到目标值需要花费很长的时间,而且会有

    2024年02月03日
    浏览(42)
  • PID控制器调参

    PID控制器是工业自动化控制中最常用的一种控制器,它可以实现系统的稳定控制和精确调节。然而,PID控制器的效果与调参有着极大的关系,良好的调参能够使得PID控制器的控制效果更加优秀。本文将详细介绍PID控制器的调参技术。 PID控制器由比例项、积分项和微分项三部分

    2024年02月16日
    浏览(49)
  • STM32 HAL库PID控制电机 第三章 PID控制双电机

    注:本文含全部PID控制代码,保证可以运行,如不能运行可以留言回复 1 基础配置 1.1 编码器电路图及配置 引脚 定时器通道 PA0 TIM2_CH1 PA1 TIM2_CH2 PB6 TIM4_CH1 PB7 TIM4_CH2 因此需要把TIM2、TIM4配置为编码器模式。在STM32CubeIDE中找到定时器2与定时器4,进行模式配置。以下以定时器2为

    2024年02月16日
    浏览(36)
  • PID超详细教程——PID原理+串级PID+C代码+在线仿真调参

    目录 前言 仿真调参环境 案例引入——小球位置控制 抛开案例——更专业地理解PID 由虚到实——代码编写 最后一步——PID参数调整 总结——使用PID的步骤 更进一步——串级PID 很多人应该都听说过PID,它的运算过程简单,并能在大多情况下实现较好的控制效果,因此它是工

    2024年02月02日
    浏览(53)
  • 【Simulink】仿真_PID控制器调谐/调参/整定

    如何使用PID调谐器自动调优PID控制器块? 模型下载: 转速闭环 PID调谐器提供了一种快速和广泛适用的 single-loop PID通过Simulink控制块的整定方法。通过这种方法,可以调优PID控制器参数,以实现具有所需响应时间(response time)的鲁棒(robust)设计。 PID调谐器的典型设计工作流程包括

    2024年02月05日
    浏览(50)
  • 基于stm32的减速直流电机PID算法控制

    本例程采用了HAL库进行项目开发(主要使用软件CubexMX和keil5),文章末尾会有代码开源,欢迎各位对文章进行指正和探讨。         硬件组成:stm32f103c8t6最小系统板;0.96寸LED12864(I2C通讯模式);智能小车12v移动电源;25GA370直流减速电机(带霍尔编码器);JDY-31蓝牙模块

    2024年02月20日
    浏览(42)
  • 【OpenMV+STM32】PID控制二维自由舵机色块追踪

    1、芯片:STM32F407ZGT6 2、CubeMX 3、KEIL5 4、OpenMV  5、舵机         利用由两个自由舵机组装而成的二维云台来控制OpenMV的位置,以实现追踪指定阈值色块的效果。 3.1 初始化配置 3.2 定时器配置(PWM波输出)         这里我使用TIM3的通道1和TIM4的通道1分别实现对两个舵机

    2024年03月19日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包