编码电机PID调试(速度环|位置环|跟随)

文章目录

    • 1、编码电机认识
    • 2、上位机波形显示
      • 1、功能介绍
      • 2、协议说明
    • 3、速度环调试验证
    • 4、位置环调试验证
    • 5、实现跟随效果

前面的文章中有讲过编码电机串级PID相关的知识,以及一些PID的调试经验,这里我最近正好又把电机摸了一遍,同时将波形的工具加入了进去,个人认为这样的方式能帮助更多的人了解这个过程,同时也能够更好理解PID这个东西。

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

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

1、编码电机认识

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

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

首先是这里我们需要开启对应的中断,在中断中进行数据累加,这样就可以做一些比如角度以及圈数的记录了
编码电机PID调试(速度环|位置环|跟随)_第1张图片
这里我们还是回顾下编码器的线束,这里的线束就是电机转一圈的脉冲数目,但是我们编码器是AB相然后还存在可以上下边沿的捕获,这样就可以进行4倍频的采样了
编码电机PID调试(速度环|位置环|跟随)_第2张图片
最终圈数的设计如下所示,这里首先就是设计一个正反,正的话就相加,方向就减掉,然后这里最终的圈数记录也是一样的。
编码电机PID调试(速度环|位置环|跟随)_第3张图片
这样就可以直观的表现出来圈数的记录了,源码如下:

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+这个的介绍我这里就不进行说明了,网上资料比较多,基本上百度一搜索就能看到很多相关的资料
编码电机PID调试(速度环|位置环|跟随)_第4张图片
这里要使用他的博信显示功能的话就是按照我下面的操作了
编码电机PID调试(速度环|位置环|跟随)_第5张图片
将波形功能拉出来后为了全屏显示这里我们还要做一下填充,如下所示
编码电机PID调试(速度环|位置环|跟随)_第6张图片
图形种类选择波形图
编码电机PID调试(速度环|位置环|跟随)_第7张图片
一般我们x轴直接设置成时间就可以了
编码电机PID调试(速度环|位置环|跟随)_第8张图片
y轴就可以来设置我们的曲线了,这里注意,必须是有,如果数据还没发送是看不到的
编码电机PID调试(速度环|位置环|跟随)_第9张图片
然后我们在选择下自动缩放
编码电机PID调试(速度环|位置环|跟随)_第10张图片

2、协议说明

先进入我们这个协议与连接:
编码电机PID调试(速度环|位置环|跟随)_第11张图片
可以看到协议说明如下所示:
编码电机PID调试(速度环|位置环|跟随)_第12张图片
这里可以看下协议说明,如下所示:
编码电机PID调试(速度环|位置环|跟随)_第13张图片
另一种说明
编码电机PID调试(速度环|位置环|跟随)_第14张图片
主要就是这里的调试说明,这里可以看到第一种直接使用printf就可以了,不过两种都给了例子,所以我决定就还是用第一种的方法来实现,使用printf加上,就可以实现了。

3、速度环调试验证

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

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

采用的速度环PID如下所示,可以看到打印的参数为目标值和当前值:
在这里插入图片描述

这里我们来看下纯p调节的时候,此时KP=200,已经比较大了,仍然是存在稳态误差的
编码电机PID调试(速度环|位置环|跟随)_第15张图片
之后加上I把误差消除掉,这里I只是给了0.1
编码电机PID调试(速度环|位置环|跟随)_第16张图片
我们单纯的继续增大KP,就可以看到较明显的超调量了
编码电机PID调试(速度环|位置环|跟随)_第17张图片
这个时候如果一位的增大i就可以看到系统的稳定性下降
编码电机PID调试(速度环|位置环|跟随)_第18张图片
最后可以看下调试效果,如下所示:

4、位置环调试验证

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

下面是直接使用位置PID进行计算P[ID的情况
在这里插入图片描述
下面是使用速度和位置PID进行计算的情况了
编码电机PID调试(速度环|位置环|跟随)_第19张图片
这个过程感觉还是就跟着我上面说的调参方案吧,还是计较方便的,可以很快的调试出来,最终的效果如下所示:

5、实现跟随效果

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

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

你可能感兴趣的:(单片机学习记录,嵌入式硬件,stm32,单片机,mcu,arm)