学习制作平衡小车:(四)PID学习、位置PID参数整定以及匿名上位机显示
一、PID学习
PID的知识网上有很多教学讲解的非常清楚,可以再参考学习【平衡小车之家】的视频教程。
二、位置PID学习
位置PID控制公式为:Pwm=Kp*e(K)+Ki*∑e(K)+Kd[e(K)-e(k-1)];其中:
Kp=设定的比例系数;Ki=设定的积分系数;Kd=设定的微分系数;e(K)=当前差(值);e(K-1)=上次差(值);∑e(K):历次差(值)的累积;
C语言实现函数:
int Position_PID(int encoder,int target)
{float position_Kp=10,position_Ki=0.03,position_Kd=15;static float bias,pwm,integral_bias,last_bias;bias=encoder-target; //计算偏差integral_bias+=bias; //求出偏差的积分pwm=position_Kp*bias+position_Ki*integral_bias+position_Kd*(bias-last_bias); last_bias=bias; //存储当前偏差作为下次计算的依据return pwm;
}
函数实现流程:首先必须设定一个标准的定时,循环读取和反馈PID控制;
读取电机Encoder编码;
PID控制计算,计算出控制量;
PID控制量作为电机PWM控制电机转动;
encoder_R=__HAL_TIM_GET_COUNTER(&htim3); //读取右电机编码器的值
motor_R_PWM=Position_PID(encoder_R,target); //PID控制计算
Set_PWM(motor_R_PWM,0); //取绝对值/限幅/赋值给电机
data_to_computer(&encoder_R,&target); //上位机发送数据
三、匿名科创地面站(上位机)使用(简单的数据波形使用):
1、首先查看自己的USB转TTL设备使用的端口-不知道怎么查看的可以直接打开串口调试助手查看;
2、打开匿名客串地面站V4.34,在“程序设定”里设定刚才查到的端口号和设定的波特率;
3、点击右下角打开连接,如果程序运行正常,会看到RX有数据的传输;
4、点击“高级收码”,“帧格式设置”,选择“1”,勾选“使能该帧”和“显示该帧”;下面的“数据容器设置”中,选择页标签1的数据来源=帧1,数据位置=1,选择页标签“2”的数据来源=帧1,数据位置=4;
5、点击进入“数据波形”页面,勾选UserData_1和UserData_2,点击“开始显示”,即可在“数据波形”页面看到发送来的读取的点击Encoder编码数据和设定的目标值数据:
四、位置PID参数整定:
在使用PID控制中,比例控制是最基本的控制,根据需要PID控制可以衍生出P或PI、PD控制。其中:
比例P参数主要用于提高响应速度-即影响快速性;
积分I参数主要用于减少静差-即影响准确性;
微分D参数主要用于抑制震荡-即影响稳定性;
我用的电机的编码器是260线,A/B双相再经X4设置后,电机输出轴转动1轴的总编码数=1040,这里设定位置PID的目标=1040:
int target=1040; //位置PID参数整定:目标值
在PID控制子函数中设置Kp/Ki/Kd的值,并通过观察波形对PID参数进行调整:
1、设定position_Kp=500,position_Ki=0,position_Kd=0,波形如下:
Kp取值过高,电机处于抖动状态;
2、设定position_Kp=30,position_Ki=0,position_Kd=0,波形如下:
可以看出,只要比例P参数设定得当,单独的比例P控制就基本上能够达到预定目的,但是存在过量,需要减少Kd;存在震荡,可以加入Kd系数(一般Kd>Kp)抑制震荡;并且存在静差(稳定值同目标值有差异),可以加入Ki减少静差(Ki一般设置Kp的1/200左右);
3、设定position_Kp=10,position_Ki=0,position_Kd=15,波形如下:
五、增量式速度PID
1、增量PID控制公式:
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
在闭环速度控制中,可以只使用PI控制就能够达到目的,所以公式可以简化为:
pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
2、C语言实现的函数
int Incremental_PI (int Encoder,int Target)
{ float Kp=20,Ki=30; static int Bias,Pwm,Last_bias;Bias=Encoder-Target; //计算偏差Pwm+=Kp*(Bias-Last_bias)+Ki*Bias; //增量式PI控制器Last_bias=Bias; //保存上一次偏差 return Pwm; //增量输出
}
3、测试函数
先测试在最大pwm时电机编码器5ms读取数据的差额:
设定pwm=7000,并使电机向前转动:
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_3,7000);//右电机Pwm输出
Motor_R_Forward(); //测试:使右电机向前转动
5ms定时循环读取并使用printf串口打印:
/*由stm32f1xx_it.c中void SysTick_Handler(void)子函数产生的5ms定时*/
if(delay5ms_flag==1) //5ms定时
{ encoder_R=__HAL_TIM_GET_COUNTER(&htim3); //测试:读取右电机编码器的值printf("encoder_R=%d\r\n",encoder_R); delay5ms_flag=0;
}
pwm=7000时每5ms编码器大约=70
设定目标值
int target=30; //速度PID参数整定目标值:不能超过Pwm=7000时的速度
测试函数
/* 电机速度PID闭环控制测试代码 */
encoder_R=__HAL_TIM_GET_COUNTER(&htim3); //测试:读取右电机编码器的值
bias_encoder_R=encoder_R-last_encoder_R; //计算同上次的差值:M法则 5ms编码器数据
motor_R_PWM=Incremental_PI(bias_encoder_R,target);//PI控制 Set_PWM(motor_R_PWM,0); //取绝对值/限幅/电机赋值 last_encoder_R=encoder_R;//保存本次编码器值
data_to_computer(&bias_encoder_R,&target); //上位机发送数据
下载的原代码加压后需要打开目录下的"Car_Test_PID"stm32CubeMX工程,重新生产MDK工程,编译前,点魔法棒“Options for Target”,在C/C++下添加自己的库函数“My Modular”文件夹的目录,并在“Application/user”组下添加目录下的所有.c文件,再编译。
学习制作平衡小车:(四)PID学习、位置PID参数整定以及匿名上位机显示相关推荐
- 【单片机学习笔记】(28):图形用户界面(GUI),串口通信协议与匿名上位机,获取MPU6050欧拉角,H桥电路、制作风力摆(空心杯电机、TB6612)
Graphical User Interface(GUI) (OLED)使用图形用户界面 简易菜单 菜单和各种显示都放到main.c里面,要显示的数据经过字符转化之后放到buff里面再 调用显示 . ...
- 零基础制作平衡小车【连载】8---位置式PID和增量式PID
上一节说的PID公式属于位置式PID,位置式PID控制的输出与整个过去的状态有关,用到了误差的累加值,而增量式PID的输出只与当前拍和前两拍的误差有关.就温控系统来说,位置式PID输出的结果就是PWM ...
- 零基础制作平衡小车【连载】12---平衡小车控制原理
前言 截止目前,初代小车已经调试完毕,功能上只能直立,后期还会加上更多功能. 前面关于pid的内容也已经更新完毕,如果你是跟着我的教程走的话,那么现在的你最起码对PID已经有所了解了,那么后面我就主要 ...
- 开源遥控平衡小车_ 记录制作平衡小车的问题
1.发生了电机堵转:问题居然是固定电机的前两个孔不能用于固定....无语!!! 2.一直在弄MPU6050的DMP,原来野火有教程. 移植成功:STM32移植MPU6050/9250的DMP官方库(m ...
- PID算法实现及参数整定图解(附代码)
一. PID含义 PID是英文单词比例(Proportion),积分(Integral),微分(Differential coefficient)的缩写.PID调节实际上是由比例.积分.微分三种调节方 ...
- 永磁同步电机矢量控制(四)——速度环 PI 参数整定(四)
上一节讲了速度环参数整定的理论知识,这节讲下实际应用中速度环PI参数的整定方法.假如,有如下速度闭环系统: 其中,电机的极对数Pn=4:磁链 flux =0.0083:转动惯量J = 0.000258 ...
- 【智能小车】舵机的基本原理(学习自平衡小车之家的资料)
概述: 根据控制方式舵机应该称为微型伺服马达.早期在模型上使用最多,主要用于控制模型的舵面,所以俗称舵机.舵机特点是接受一个简单的控制指令就可以自动转到一个比较精确的角度. 注: 微型伺服马达:一个微 ...
- 零基础制作平衡小车【连载】7---模拟PID到离散型PID的转换
上一节对PID三个参数进行了分析,知道了三个参数各自的优缺点,这节我们将三个参数整合到一起,通过他们之间优缺点互补,真正形成一个稳定的系统. PID雏形 将上一小节的公式相加: OUT = OUTp ...
- STM32平衡小车 TB6612电机驱动学习
TB6612FNG简介 单片机引脚的电流一般只有几十个毫安,无法驱动电机,因此一般是通过单片机控制电机驱动芯片进而控制电机.TB6612是比较常用的电机驱动芯片之一. TB6612FNG可以同时控制两 ...
最新文章
- React 组件绑定点击事件,并且传参完整Demo
- Java 未死,依然很牛逼!
- 系统架构师学习笔记-数据通信与计算机网络(二)
- echarts热力地图
- 使用J2SE进行服务器架构技术选型的变迁
- java并发(二):初探syncronized
- 华为云 GaussDB 数据库,会是新的国产之光吗?
- matlab 可视化 —— 常用绘图函数
- Software - ASCII码表
- 44. Wildcard Matching (String; DP, Back-Track)
- java 观察者模式_设计模式-Java-观察者模式-RxJava
- UNIX网络编程第三版
- 浙大PAT 1102
- JASS随机物品系统
- 美服lol服务器状态,LOL美服训练模式上线:炮塔可关闭 野区无限刷新
- ASP视频教程:SQL语句1
- Loadrunner_集合点(rendezvous)
- 000webhost虚拟主机绑定自定义二级域名
- 【Redis】初探Redis
- 微信公众平台开发——引言