编码电机PID调试(速度环|位置环|跟随)
前面的文章中有讲过编码电机串级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输入量由另一个的电机的传感器采集的数据来代替,但是最终控制量确是另外一个电机。
最终实现的效果如下所示:
更多推荐
所有评论(0)