CocosCreator之KUOKUO帶你輕鬆理解直流電機PID調速系統
本次引擎2.0.5
編輯工具VSCode
神奇的腦洞浮現!CocosCreator如何模擬電機轉速控制呢?
哇咔咔!KUOKUO帶你學知識,0基礎也能看懂!
我相信我們在生活中都接觸過小的直流電機,玩具裡就有很多。
我們都知道對於直流電機,我們給上一定的電壓,它就會工作,就會轉起來。
對於我們的正常生活來說,轉速變化多與少並不重要,快一點,慢一點都可以。
但是,對於一些需要固定轉速的應用場景來說,轉速的穩定至關重要。
如何穩定?
比如一個的直流電機,我們給上一定電壓,電機的轉速就會從0提高到某一個值,並執行下去。
突然,由於某些原因,電機振動了一下,導致轉速下降了一些,你覺得這樣的工作狀態不滿足要求,
你想提高轉速,準備升高給定的電壓,但是你不知道升多少!怎麼辦?
你靈機一動!買了一個轉速測量裝置,裝了上去。轉速顯示目前是1800轉,但是你想獲得2000轉。
你就提高電壓,同時盯著那個轉速顯示,1850,1880,1900,1950,,,,2010,,
哎呀,超過了,怎麼辦?你又開始降壓,,,哎呀!又低了。。。。
這就是人為控制不了的情況。
。。。。。。
這就人們設計PID自動調節器的目的!它能有效的調整轉速使電機穩定執行。
不明白PID是啥?沒錯,我正要講呢!!!
而且還是用CocosCreator來講!
正片開始!
新建個工程,建個背景,找個輪子素材(圓的就行,其實不是圓的也行,模擬電機轉的)
如圖:
然後讓我們寫個輪子的指令碼:round吧;並繫結在輪子上。
這樣改變speed就可以控制轉速,讓輪子轉起來。
看看轉起來啦!
好了,讓我們寫個總控制指令碼,來控制速度。
新建main.js繫結在Canvas上。
用require獲取round指令碼,然後初始化時速度為0;
嗯,好了。我們再新增文字顯示速度吧!
這樣觀察更直觀:
給出程式碼:
var round = require('round'); cc.Class({ extends: cc.Component, properties: { Round : { type : round, default : null, }, label : cc.Label, }, onLoad () { this.Round.speed = 0; }, start () { this.Round.speed = 100; }, update (dt) { this.label.string = this.Round.speed + ''; }, });
嗯,這樣轉速就很直觀了。
我們先模擬一下剛才的操作:
給電壓後,電機啟動。用計時器寫一下。20秒到達2000轉。
次數要記得減去1;
看一下效果:
怎麼樣,有感覺沒!!!
接下來,我們突然轉速下降。人為去調整。
看程式碼:
var round = require('round');
// 獲取指令碼
cc.Class({
extends: cc.Component,
properties: {
Round : {
type : round,
default : null,
},
// 顯示轉速
label : cc.Label,
// time間隔
time : 0
},
onLoad () {
// 初始為0
this.Round.speed = 0;
this.time = 0;
},
start () {
// 模擬啟動過程
// this.schedule(function() {
// this.Round.speed += 1;
// },0.01,2000 - 1,0);
// 轉速突然掉到1800
this.Round.speed = 1800;
},
update (dt) {
this.time += dt;
// 人為每兩秒調整一下
if (this.time >= 2) {
this.time = 0;
// 模擬人為調整電壓的升速降速
// 人不是精確的,隨機數取整
var num = Math.floor(100 * Math.random());
if (this.Round.speed < 2000) {
this.Round.speed += num;
}
else if (this.Round.speed > 2000) {
this.Round.speed -= num;
}
}
// 實時的轉速
this.label.string = this.Round.speed + '';
},
});
效果:
多了降,少了升,但是不精確;
這就是人為很難做到轉速的調整的,這樣看大家應該明白了。
接下來,我們先介紹PID中的P環節:比例環節。
它能實現快速性,人是2秒完成一次,但電路很快完成一次。
而且它是根據當前轉速與目標轉速的差來調速的。
看程式碼一下子就懂:
它會先求出當前值與目標值的差,如果差的大,升壓快,如果差小了就慢慢升。
看效果:
這樣轉速會快速上升到接近目標轉速,但是達不到目標值。
怎麼辦?
加入PID中的I積分環節;
就是在變化量少的時候累加變化量,讓其快速達到目標轉速。
還是上程式碼:
這樣它會在2000轉速附近浮動,穩定性弱些,但是抵抗擾動能力強。
不信??我們試一下,我們新建個按鈕!
突然一個原因讓它轉速下降到1000,看它是否快速恢復!
繫結指令碼,函式;
試一試:
當轉速在2000浮動時,突減轉速。
看,恢復快吧!一般的工程用PI調節就夠了。
但是我還是講一下PID調節器中的微分環節D
通俗的講就是把轉速的變化提前預知,做到轉速無超調(就是儘量不過2000轉)
看一下實現程式碼:(很簡單的)
這樣轉速無超調,穩定2000以下:
怎麼樣,明白了嗎?
O(∩_∩)O~~