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

猜你喜欢

转载自blog.csdn.net/kuokuo666/article/details/84797029