【Day28】:STM32实际应用1—马达精准控速(PID初浅教学(下))

实际编程

昨天介绍了PID的理论与原理,最後以下面这个公式收尾
https://ithelp.ithome.com.tw/upload/images/20210927/20141525F833JNky4E.jpg
但我们到底要怎麽在程序当中积分、微分呢?
没错,我们的确没有办法直接使用这个公式,对我们来说,我们只能以离散的形式来做计算,而上面的式子经过转换後就会变成下面这个离散的形式。
https://ithelp.ithome.com.tw/upload/images/20210927/20141525C6mzbZZIj5.jpg
虽然很多人会觉得这个式子并没有比刚刚的好多少啊,而且还多冒出来一个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让你的步进马达不再失步

30天轻松学会unity自制游戏-制作Player

开启专案先开一个新场景,File->New Scene开启一个空场景,新场景选Basic有多一...

Day 2 - 如何运用sail快速建置Laravel 8.0

观看Laravel 8.0的官方文件教学,可以看到一个新的东西就是我们这次要介绍的Sail,用起来非...

Day6 宣告元件 - Class Component

Class Component用的是ES6中的class语法建立元件,接着去 extends(继承)...

Day03:职场生态观察力

一、前言   上一篇文章分享了我的求职前中後记录,重要的职场生态观察力我决定独立一篇来写,应该更清楚...

【Day 24】半监督式学习(Semi-supervised Learning)(上)

我们知道监督式学习(Supervised Learning)就是有一堆Label好的训练资料,而半监...