编码电机PID调试:速度、位置和跟随控制

文章目录

  • 1、编码电机认识
  • 2、上位机波形显示
  • 1、功能介绍
  • 2、协议说明
  • 3、速度环调试验证
  • 4、位置环调试验证
  • 5、实现跟随效果
  • 前面的文章中有讲过编码电机串级PID相关的知识,以及一些PID的调试经验,这里我最近正好又把电机摸了一遍,同时将波形的工具加入了进去,个人认为这样的方式能帮助更多的人了解这个过程,同时也能够更好理解PID这个东西。

    同时校招面试过程中,一些嵌入式的岗位里面做机器人控制相关的,包括就是介绍自己项目的时候一般都会问一些PID的调试过程,PID几个参数的作用,内环外环的描述等,因此PID还是比较重要的。

    如果本文各位大佬有意见的话欢迎提出!

    1、编码电机认识

    编码电机数据读取的内容在前面的文章中已经介绍过了,对应的链接如下所示,有需要的可以自行了解:
    直流编码电机双闭环(速度+角度)控制

    这里不在进行赘述,这里可以进行部分内容的补充,主要是编码器的数据处理那个部分,这样做是为了更好的获取到角度数据,步骤如下:

    首先是这里我们需要开启对应的中断,在中断中进行数据累加,这样就可以做一些比如角度以及圈数的记录了

    这里我们还是回顾下编码器的线束,这里的线束就是电机转一圈的脉冲数目,但是我们编码器是AB相然后还存在可以上下边沿的捕获,这样就可以进行4倍频的采样了

    最终圈数的设计如下所示,这里首先就是设计一个正反,正的话就相加,方向就减掉,然后这里最终的圈数记录也是一样的。

    这样就可以直观的表现出来圈数的记录了,源码如下:

    int Angle = 0;//角度
    int circr = 0;//圈数
    
    const int Step_Angle = 360/4/30;	
    
    void Motor_Get_Angle(TIM_HandleTypeDef *htim)	
    {
    	if(htim == &htim2)
    	{
    		if((htim->Instance->CR1 & 0x0010)>>4)//方向判断
    			// 这里也可以用htim->Instance->CR1来判断 0X01是顺时针,0X11是逆时针
    			Angle -= Step_Angle;
    		else
    			Angle += Step_Angle;
    	}
    	if(Angle == 360)
    	{
    		circr++;
    		Angle = 0;
    	}
    	if(Angle == -360)
    	{
    		circr--;
    		Angle = 0;
    	}
    }
    

    2、上位机波形显示

    1、功能介绍

    这里就是推荐使用VOFA+这个串口助手,带波形显示功能,比较强大,关于VOFA+这个的介绍我这里就不进行说明了,网上资料比较多,基本上百度一搜索就能看到很多相关的资料

    这里要使用他的博信显示功能的话就是按照我下面的操作了

    将波形功能拉出来后为了全屏显示这里我们还要做一下填充,如下所示

    图形种类选择波形图

    一般我们x轴直接设置成时间就可以了

    y轴就可以来设置我们的曲线了,这里注意,必须是有,如果数据还没发送是看不到的

    然后我们在选择下自动缩放

    2、协议说明

    先进入我们这个协议与连接:

    可以看到协议说明如下所示:

    这里可以看下协议说明,如下所示:

    另一种说明

    主要就是这里的调试说明,这里可以看到第一种直接使用printf就可以了,不过两种都给了例子,所以我决定就还是用第一种的方法来实现,使用printf加上,就可以实现了。

    3、速度环调试验证

    这里我还是搭建跟之前的那篇文章一样的PID架构,详见直流编码电机双闭环(速度+角度)控制

    关于PID的调试效果,可以见我的这篇文章,该文章使用simulink来模拟PID:Matlab使用simulink设置PID记录

    采用的速度环PID如下所示,可以看到打印的参数为目标值和当前值:

    这里我们来看下纯p调节的时候,此时KP=200,已经比较大了,仍然是存在稳态误差的

    之后加上I把误差消除掉,这里I只是给了0.1

    我们单纯的继续增大KP,就可以看到较明显的超调量了

    这个时候如果一位的增大i就可以看到系统的稳定性下降

    最后可以看下调试效果,如下所示:

    4、位置环调试验证

    这里位置环就是对电机的位置进行控制,这里直接想到的办法肯定就是直接使用对PID计算,这样是完全可以的,就是不太稳定,效果不是很好,抗扰动不是很行,因此就可以选择串级PID的方式来实现相关的功能,如下我对两种方案都进行了介绍:

    下面是直接使用位置PID进行计算P[ID的情况

    下面是使用速度和位置PID进行计算的情况了

    这个过程感觉还是就跟着我上面说的调参方案吧,还是计较方便的,可以很快的调试出来,最终的效果如下所示:

    5、实现跟随效果

    跟随其实就是一个PID和另外一个的联动,本质情况就是把其中的一个环的PID输入量由另一个的电机的传感器采集的数据来代替,但是最终控制量确是另外一个电机。

    最终实现的效果如下所示:

    物联沃分享整理
    物联沃-IOTWORD物联网 » 编码电机PID调试:速度、位置和跟随控制

    发表回复