1. 程式人生 > >CocosCreator之KUOKUO帶你輕鬆理解直流電機PID調速系統

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~~