STM32f4日记6之最基础的PID教学(运用TIM定时器的编码器模式实时调节电机速度达到要求值)

STM32f4日记6之最基础的PID教学(运用TIM定时器的编码器模式实时调节电机速度达到要求值)
板子:stm32f407zgt6正点原子迷你版
鉴于目前网上的教学形态各异,很多带有迷惑、误导性质,所以写这篇文章交流自己的看法,也权当纪录自己的学习经历。

作者:shawn
可咨询QQ:965798711(要代码可在评论区留下邮箱)
2021.2.1
22:36
All rights reserved

//
如果你觉得对你有帮助,请点赞同,这对我很重要,谢谢。
//
在这里插入图片描述

一、算法介绍
划重点
举个栗子:如果给一个电压5V能使一辆车以每秒5m速度前进,那么想让车前进100m,则给电压5V20s就能达到??????????

这在理论上是可行的,但是现实生活中是绝对不可行的。因为有惯性摩擦等一系列元素的干扰存在,那么我们就要运用一种算法能够实时调节电压使得小车在100m的时候停下,此时速度为0,加速度也为0。完全刹车,所以引入PID算法
PID:
在过程控制中,按偏差的比例(P)、积分(I)和微分(D)进行控制的PID控制器(亦称PID调节器)是应用最为广泛的一种自动控制器。它具有原理简单,易于实现,适用面广,控制参数相互独立,参数的选定比较简单等优点;而且在理论上可以证明,对于过程控制的典型对象──“一阶滞后+纯滞后”与“二阶滞后+纯滞后”的控制对象,PID控制器是一种最优控制。PID调节规律是连续系统动态品质校正的一种有效方法,它的参数整定方式简便,结构改变灵活
~~·引自百度百科
PID控制的实质就是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出。
在工业过程中,连续控制系统的理想PID控制规律为:
在这里插入图片描述

式中,Kp——比例增益,Kp与比例度成倒数关系;
Tt——积分时间常数;
TD——微分时间常数;
u(t)——PID控制器的输出信号;
e(t)——给定值r(t)与测量值之差。
听起来很复杂,简单来说就可以根据目前的状态实时调试达到要求值的一个系统算法
二、C语言的理解
以下是一段C语言的代码,读者可以自行运行以下

#include<stdio.h>
#include<stdlib.h>

struct _pid{
    
    
    float SetSpeed;           //定义设定值
    float ActualSpeed;        //定义实际值
    float err;               //定义偏差值
    float err_next;           //定义上一个偏差值
    float err_last;           //定义最上前的偏差值
    float Kp,Ki,Kd;           //定义比例、积分、微分系数
}pid;//此处定义一个结构体pid用来放pid运行过程中必要的参数

void PID_init(){
    
    
    pid.SetSpeed=0.0;
    pid.ActualSpeed=0.0;
    pid.err=0.0;
    pid.err_last=0.0;
    pid.err_next=0.0;
    pid.Kp=0.2;      //KP
    pid.Ki=0.015;    //KI
    pid.Kd=0.2;      //KD
}//初始化pid里面的值

float PID_realize(float speed){
    
    
    pid.SetSpeed=speed;
    pid.err=pid.SetSpeed-pid.ActualSpeed;
    float incrementSpeed=pid.Kp*(pid.err-pid.err_next)+pid.Ki*pid.err+pid.Kd*(pid.err-2*pid.err_next+pid.err_last);    
     //pid算法的核心
    pid.ActualSpeed+=incrementSpeed;
    pid.err_last=pid.err_next;
    pid.err_next=pid.err;
    return pid.ActualSpeed;
}

int main(){
    
    
    PID_init();
    int count=0;
    while(count<1000)
    {
    
    
        float speed=PID_realize(200.0);//设定要求值为200.0计算1000次,分别打印出输出的speed值
        printf("%f\n",speed);
        count++;
    }
    return 0;
}

运算的效果如下:

83.000000
11.555000
59.559677
28.175407
52.907417
38.944157
51.891697
46.141655
53.339050
51.510002
55.908447
55.944637
58.970676
59.882942
62.224998
63.537247
65.527710
67.011055
68.810646
70.355316
72.042030
73.595650
75.207611
76.745438
78.301521
79.812134
81.321922
82.800301
84.268906
85.713104
87.143448
88.553001
89.946953
91.322083
92.680992
94.022240
95.347191
96.655251
97.947189
99.222816
100.482613
101.726578
102.955055
104.168129
105.366074
106.549019
107.717194
108.870758
110.009903
111.134811
112.245651
113.342613
114.425858
115.495567
116.551895
117.595024
118.625114
119.642326
120.646828
121.638763
122.618309
123.585602
124.540810
125.484070
126.415543
127.335373
128.243698
129.140686
130.026443
130.901138
131.764893
132.617859
133.460159
134.291931
135.113297
135.924408
136.725372
137.516327
138.297394
139.068695
139.830353
140.582489
141.325226
142.058685
142.782974
143.498199
144.204498
144.901962
145.590714
146.270844
146.942474
147.605713
148.260651
148.907410
149.546082
150.176773
150.799576
151.414597
152.021927
152.621674
153.213913
153.798752
154.376282
154.946594
155.509781
156.065918
156.615112
157.157440
157.692993
158.221848
158.744095
159.259811
159.769073
160.271973
160.768585
161.258987
161.743271
162.221481
162.693726
163.160065
163.620575
164.075333
164.524399
164.967865
165.405777
165.838226
166.265259
166.686951
167.103378
167.514587
167.920670
168.321671
168.717667
169.108704
169.494858
169.876175
170.252731
170.624588
170.991791
171.354401
171.712479
172.066086
172.415268
172.760086
173.100601
173.436844
173.768890
174.096786
174.420578
174.740326
175.056076
175.367889
175.675797
175.979858
176.280121
176.576630
176.869431
177.158569
177.444092
177.726044
178.004471
178.279419
178.550934
178.819046
179.083817
179.345276
179.603470
179.858429
180.110214
180.358841
180.604370
180.846817
181.086243
181.322662
181.556137
181.786682
182.014359
182.239182
182.461197
182.680435
182.896942
183.110733
183.321854
183.530334
183.736206
183.939514
184.140274
184.338531
184.534302
184.727631
184.918533
185.107056
185.293228
185.477066
185.658615
185.837891
186.014923
186.189743
186.362381
186.532852
186.701202
186.867432
187.031601
187.193710
187.353790
187.511871
187.667984
187.822128
187.974365
188.124680
188.273132
188.419724
188.564484
188.707428
188.848587
188.987976
189.125626
189.261566
189.395798
189.528351
189.659256
189.788513
189.916168
190.042221
190.166702
190.289627
190.411011
190.530884
190.649246
190.766144
190.881561
190.995544
191.108109
191.219254
191.329025
191.437408
191.544449
191.650146
191.754517
191.857590
191.959366
192.059875
192.159134
192.257141
192.353928
192.449509
192.543884
192.637085
192.729126
192.820007
192.909760
192.998383
193.085907
193.172333
193.257675
193.341965
193.425186
193.507385
193.588531
193.668686
193.747818
193.825974
193.903152
193.979370
194.054626
194.128952
194.202332
194.274811
194.346375
194.417053
194.486832
194.555756
194.623810
194.691010
194.757370
194.822906
194.887619
194.951523
195.014633
195.076950
195.138489
195.199265
195.259277
195.318542
195.377060
195.434845
195.491913
195.548264
195.603912
195.658859
195.713135
195.766724
195.819641
195.871902
195.923508
195.974472
196.024796
196.074493
196.123566
196.172028
196.219879
196.267136
196.313797
196.359879
196.405380
196.450317
196.494690
196.538513
196.581787
196.624512
196.666702
196.708374
196.749512
196.790146
196.830261
196.869888
196.909012
196.947647
196.985809
197.023483
197.060699
197.097443
197.133728
197.169556
197.204941
197.239883
197.274384
197.308456
197.342102
197.375320
197.408127
197.440521
197.472519
197.504105
197.535309
197.566116
197.596542
197.626587
197.656250
197.685547
197.714478
197.743042
197.771255
197.799118
197.826630
197.853806
197.880630
197.907120
197.933289
197.959122
197.984634
198.009827
198.034698
198.059265
198.083527
198.107483
198.131134
198.154495
198.177567
198.200348
198.222839
198.245056
198.266998
198.288666
198.310059
198.331177
198.352036
198.372635
198.392975
198.413071
198.432907
198.452499
198.471848
198.490952
198.509811
198.528442
198.546829
198.565002
198.582932
198.600647
198.618134
198.635406
198.652466
198.669312
198.685944
198.702377
198.718597
198.734619
198.750443
198.766068
198.781494
198.796722
198.811768
198.826614
198.841278
198.855759
198.870056
198.884186
198.898132
198.911911
198.925507
198.938934
198.952194
198.965286
198.978226
198.990997
199.003616
199.016068
199.028366
199.040512
199.052505
199.064346
199.076050
199.087601
199.099014
199.110275
199.121399
199.132385
199.143234
199.153946
199.164520
199.174973
199.185287
199.195465
199.205521
199.215454
199.225266
199.234955
199.244522
199.253967
199.263290
199.272507
199.281601
199.290588
199.299454
199.308212
199.316864
199.325409
199.333847
199.342178
199.350403
199.358521
199.366547
199.374466
199.382294
199.390015
199.397644
199.405167
199.412613
199.419952
199.427200
199.434357
199.441422
199.448410
199.455307
199.462112
199.468842
199.475479
199.482040
199.488510
199.494904
199.501221
199.507462
199.513611
199.519699
199.525696
199.531631
199.537476
199.543259
199.548965
199.554611
199.560181
199.565674
199.571106
199.576462
199.581757
199.586990
199.592148
199.597244
199.602280
199.607254
199.612167
199.617020
199.621811
199.626541
199.631210
199.635818
199.640366
199.644867
199.649307
199.653687
199.658020
199.662292
199.666519
199.670685
199.674805
199.678864
199.682877
199.686844
199.690750
199.694626
199.698441
199.702209
199.705933
199.709610
199.713242
199.716827
199.720367
199.723862
199.727310
199.730713
199.734085
199.737411
199.740692
199.743942
199.747147
199.750305
199.753433
199.756516
199.759567
199.762573
199.765549
199.768478
199.771378
199.774231
199.777054
199.779846
199.782593
199.785309
199.787994
199.790649
199.793259
199.795853
199.798401
199.800919
199.803406
199.805862
199.808289
199.810684
199.813049
199.815384
199.817688
199.819962
199.822220
199.824432
199.826630
199.828796
199.830933
199.833054
199.835144
199.837204
199.839233
199.841248
199.843231
199.845200
199.847137
199.849045
199.850937
199.852798
199.854645
199.856461
199.858261
199.860031
199.861786
199.863510
199.865219
199.866898
199.868561
199.870209
199.871826
199.873428
199.875015
199.876572
199.878113
199.879639
199.881149
199.882629
199.884094
199.885544
199.886978
199.888397
199.889786
199.891174
199.892532
199.893875
199.895203
199.896515
199.897812
199.899094
199.900360
199.901611
199.902847
199.904068
199.905273
199.906464
199.907639
199.908798
199.909943
199.911072
199.912186
199.913284
199.914368
199.915436
199.916489
199.917526
199.918564
199.919571
199.920578
199.921570
199.922546
199.923523
199.924469
199.925415
199.926346
199.927261
199.928177
199.929077
199.929962
199.930832
199.931702
199.932556
199.933395
199.934235
199.935059
199.935867
199.936676
199.937469
199.938248
199.939026
199.939789
199.940536
199.941284
199.942017
199.942749
199.943466
199.944168
199.944870
199.945557
199.946243
199.946915
199.947586
199.948242
199.948883
199.949524
199.950150
199.950775
199.951385
199.951996
199.952591
199.953186
199.953766
199.954346
199.954910
199.955475
199.956024
199.956573
199.957108
199.957642
199.958176
199.958694
199.959213
199.959717
199.960220
199.960724
199.961212
199.961700
199.962173
199.962646
199.963120
199.963577
199.964035
199.964478
199.964920
199.965363
199.965790
199.966217
199.966644
199.967056
199.967468
199.967880
199.968277
199.968674
199.969070
199.969452
199.969833
199.970215
199.970581
199.970947
199.971313
199.971664
199.972015
199.972366
199.972717
199.973053
199.973389
199.973724
199.974045
199.974380
199.974701
199.975021
199.975327
199.975632
199.975937
199.976242
199.976532
199.976822
199.977112
199.977402
199.977676
199.977966
199.978241
199.978516
199.978790
199.979050
199.979309
199.979568
199.979828
199.980072
199.980331
199.980576
199.980820
199.981064
199.981293
199.981537
199.981766
199.981995
199.982224
199.982437
199.982666
199.982880
199.983093
199.983307
199.983521
199.983719
199.983932
199.984131
199.984329
199.984528
199.984726
199.984909
199.985107
199.985291
199.985474
199.985657
199.985840
199.986023
199.986191
199.986374
199.986542
199.986710
199.986877
199.987045
199.987213
199.987366
199.987534
199.987686
199.987839
199.987991
199.988144
199.988297
199.988449
199.988586
199.988739
199.988876
199.989014
199.989151
199.989288
199.989426
199.989563
199.989685
199.989822
199.989944
199.990067
199.990189
199.990311
199.990433
199.990555
199.990677
199.990799
199.990906
199.991028
199.991135
199.991257
199.991364
199.991470
199.991577
199.991684
199.991791
199.991898
199.992004
199.992096
199.992203
199.992294
199.992401
199.992493
199.992584
199.992676
199.992767
199.992859
199.992950
199.993042
199.993134
199.993225
199.993301
199.993393
199.993469
199.993561
199.993637
199.993713
199.993790
199.993866
199.993942
199.994019
199.994095
199.994171
199.994247
199.994324
199.994400
199.994476
199.994537
199.994614
199.994675
199.994751
199.994812
199.994873
199.994934
199.994995
199.995056
199.995117
199.995178
199.995239
199.995300
199.995361
199.995422
199.995483
199.995544
199.995605
199.995667
199.995712
199.995773
199.995819
199.995880
199.995926
199.995987
199.996033
199.996078
199.996124
199.996170
199.996216
199.996262
199.996307
199.996353
199.996399
199.996445
199.996490
199.996536
199.996582
199.996628
199.996674
199.996719
199.996765
199.996811
199.996857
199.996887
199.996933
199.996964
199.997009
199.997040
199.997086
199.997116
199.997162
199.997192
199.997238
199.997269
199.997299
199.997330
199.997360
199.997391
199.997421
199.997452
199.997482
199.997513
199.997543
199.997574
199.997604
199.997635
199.997665
199.997696
199.997726
199.997757
199.997787
199.997818
199.997849
199.997879
199.997910
199.997940
199.997971
199.998001
199.998032
199.998062
199.998093
199.998108
199.998138
199.998154
199.998184
199.998199
199.998230
199.998245
199.998276
199.998291
199.998322
199.998337
199.998367
199.998383
199.998413
199.998428
199.998459
199.998474
199.998505
199.998520
199.998535
199.998550
199.998566
199.998581
199.998596
199.998611
199.998627
199.998642
199.998657
199.998672
199.998688
199.998703
199.998718
199.998734
199.998749
199.998764
199.998779
199.998795
199.998810
199.998825
199.998840
199.998856
199.998871
199.998886
199.998901
199.998917
199.998932
199.998947
199.998962
199.998978
199.998993
199.999008
199.999023
199.999039
199.999054
199.999069
199.999084
199.999100
199.999115
199.999130
199.999146
199.999161
199.999176
199.999191
199.999207
199.999222
199.999237
199.999252
199.999268
199.999283
199.999298
199.999298
199.999313
199.999313
199.999329
199.999329
199.999344
199.999344
199.999359
199.999359
199.999374
199.999374
199.999390
199.999390
199.999405
199.999405
199.999420
199.999420
199.999435
199.999435
199.999451
199.999451
199.999466
199.999466
199.999481
199.999481
199.999496
199.999496
199.999512
199.999512

感谢你能翻到这里,
我们分析这么多数据可以观察到一开始输出的speed数据个体差异非常大,
但在pid_realize这个函数的运行下开始逐渐接近目标值200.0
最后相差无几,
而这仅仅是1000次运算的结果,可以想见这个算法的奥秘。

三、PID参数的调节奥秘
众所周知,PID算法核心的三个参数KP,KI,KD。
那么这三个参数到底有什么意义呢?
在这里插入图片描述
本来是个动图。。。。。。。。
我推荐一个视频
https://www.bilibili.com/video/BV1k7411q7HB平衡小车PID理论简单讲解——来自up主<天下行走ㅍ_ㅍ>

https://www.bilibili.com/video/BV1k7411q7HB

平衡小车PID理论简单讲解——来自up主<天下行走ㅍ_ㅍ>
推荐从33:16开始看

KP:提高响应速度,减少静差
KI:减少稳态误差
KD:减少震荡以及超调
这里我就不再过多赘述,读者可自行观看视频了解知识,比较直观

三、运用到STM32工程的PID调速
PID调速基于实时的速度反馈拥有当前速度值之后,我们才能对其进行调节
***TIM定时器的编码器模式***请看我上一篇文章

https://blog.csdn.net/qq_51564898/article/details/113359450

或者点击我头像看,里面有详细的介绍

1.那我们想要进行PID调速首先要有一个current speed
2.然后每隔单位之间将其放入float Velocity函数里面计算PID,
3.输出一个pwm占空比放入TIM_SetCompare函数里调节
4.然后再进行一次运算根据情况再运算再运算再调节再调节
5.直到在目标值±0.0001波动达到我们想要的结果
但是速度环的调节不必动用kp,ki,kd三个,实际上kp,ki就可以解决
下面给出代码:

float Velocity(PIDCONTORLLER *pid,float target,float current)//int Target,int encoder_left,int encoder_right)
{
    
    
	
	float a=0.7;
	
	//1.计算速度偏差
	Encoder_Err=target-current;
	//2.用公式滤波
	//low_out=(1-a)*Ek+a*low_out_last;
	EnC_Err_Lowout=(1-a)*Encoder_Err+a*EnC_Err_Lowout_last;//滤波使得其更加平滑
	EnC_Err_Lowout_last=EnC_Err_Lowout;//赋值
	//3.防止速度过大
	Encoder_S+=EnC_Err_Lowout;
	//4.速度偏差积分
	Encoder_S=Encoder_S>10000?10000:(Encoder_S<(-10000)?(-10000):Encoder_S);
	
	//5.限制幅度
	PWM_out=pid->kp*EnC_Err_Lowout+pid->ki*Encoder_S;//output=(error*pid->kp)+pid->i*pid->ki+deltaerror*pid->kd;公式运算
	return PWM_out;//输出结果
}

请读者务必要浏览我上一篇文章结合起来看
然后,我们在定时器5的中断函数里这样写:

void TIM5_IRQHandler(void)                        
{
    
    
	if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET)    
	{
    
      
		encode=Read_Encoder();                          //读速度
		printf("电机脉冲为%d\r\n",encode);
		speed=(float)(encode*1.0/(13*90*0.05));
		printf("电机速度为%.4f\r\n",speed);		
		if(fabs(target-speed)>1e-2)//进行调速
		{
    
    
		PIDspeedout=(int)Velocity(&PID_control_speed,target,speed);//PID调速
		Limit(&PIDspeedout);//限制占空比不能大于8400
			printf("输出的占空比为(最大8400)%d\r\n",PIDspeedout);
		Load(PIDspeedout);//将其放入setcompare函数
		}
	}
	TIM_ClearITPendingBit(TIM5,TIM_IT_Update);        
}

KP.KI,KD三个参数要读者根据自己电机的参数debug里面一次次调节才能确定,请记得务必每次调试将
Encoder_S,
EnC_Err_Lowout_last,
PWM_out,
Encoder_Err,
EnC_Err_Lowout
清零

四、思考
如何编写位置环的PID调节
如何用编码器获知此时电机的位置信息

//
//

作者:shawn
可咨询QQ:965798711(要代码可在评论区留下邮箱)
2021.2.1
22:36
All rights reserved

猜你喜欢

转载自blog.csdn.net/qq_51564898/article/details/113530055