昨天介绍了PID的理论与原理,最後以下面这个公式收尾
但我们到底要怎麽在程序当中积分、微分呢?
没错,我们的确没有办法直接使用这个公式,对我们来说,我们只能以离散的形式来做计算,而上面的式子经过转换後就会变成下面这个离散的形式。
虽然很多人会觉得这个式子并没有比刚刚的好多少啊,而且还多冒出来一个Sigma的符号。事实上,这已经可以让我们在程序当中实做出来了,它把积分转换成为连加,而微分转换成为误差差值除以时间,这些都是基本的加减乘除运算。
实作的思路大致上是:
利用一个TIMER,并且设定好进入中断的周期,而中断函式内要做的事有两个:计算转速、以PID计算输出值。
一般来说PID计算的周期越短,我们可以更快的达到目标值,但是当周期越短,我们测量马达转速的精准度也会下降。因此要在两者间取个平衡,目前我使用约1ms~10ms这个区间的取样周期。
程序的结构大致如下
void Motor::pid() {
/***Parameter***/
double P = 5000;
double I = 5;
double D = 350;
/***Measurement***/
rps = (double) v_angular / 360 * 1000 / t_measure;
/*** Control Speed ***/
err = goal-rps;
rps_aft = rps;
proportion = (double) P * err;
integral += (double) I * err * t_measure / 1000;
differential = (double) -1 * D * (double) (rps_aft - rps_bef) / t_measure* 1000;
cycle += proportion + integral + differential;
/***Output***/
}
先计算出马达的转速,详细的使用方式可以看之前的encoder介绍与实际使用教学喔~总之这个步骤就是要给出rps的值就对了。接着第二步骤就是要进行PID的运算,误差err等於目标值扣掉当前转速,且根据上面离散型PID的公式,分别计算出PID三个的值,再加总。
<<: 【Day27】:STM32实际应用1—马达精准控速(PID初浅教学(上))
>>: 【Day29】:STM32实际应用2—DMA让你的步进马达不再失步
开启专案先开一个新场景,File->New Scene开启一个空场景,新场景选Basic有多一...
观看Laravel 8.0的官方文件教学,可以看到一个新的东西就是我们这次要介绍的Sail,用起来非...
Class Component用的是ES6中的class语法建立元件,接着去 extends(继承)...
一、前言 上一篇文章分享了我的求职前中後记录,重要的职场生态观察力我决定独立一篇来写,应该更清楚...
我们知道监督式学习(Supervised Learning)就是有一堆Label好的训练资料,而半监...