用逆向设计和回归算法估算PWM

20170223211517407-0

大家在使用直流电机时经常遇到一个问题,那就是无法准确的控制他的转速。当然很多高手义无反顾的用上了码盘啊,霍尔啊等测速装置再加上PID啊啥的来完成设计。这种设计方法固然没错,但是也有一些人手头没有那么多资源或者暂时没有完成这整个工作的能力。我就见过一位同学无奈之下采用查表的办法来判断在需求什么样的速度时给多少PWM。这里我教各位一个小窍门,妈妈再也不担心我控制不好电机转速了。

首先,将电机接上PWM,记录下在各PWM数值时,电机的转速。并列表记录,如下表:

20170223211517444-0

我随便填几个数,以便下一步演示。数据当然是越多越好,稍有误差也关系不大。随后我们将数据输入Microsoft Office EXCEL中。然后选中两行,点击菜单栏中的Insert ,然后选择Scatter,最后在弹出菜单后悬着那个有点和曲线的图标,来生成曲线。

20170223211517714-0

从我随意输入的数据中,我们可以得到一个这样的曲线:

20170223211517925-0

点击曲线,然后在右键菜单中选择Add Trendline…,会弹出下面这个对话框。一般我们选择Polynormial, 并在后面的Order框内选3以上的数(一般来说数字越高则对复杂曲线的拟合度越好,当然也有例外)。然后别忘了把最底部的两个小框点上钩。

20170223211517636-0

选完后点Close, 图上就多了一条线,还有两个公式。第一个公式就是那根新的线,第二个R^2叫coefficient of determination。就是表示第一条公式和你的数据的相差多少。数字越接近1,公式越接近你的测量结果。所以我们只要在程序中输入这条公式,你的程序就知道该在需要什么转速的时候给多少PWM了。

y = -7E-06×4 + 0.0019×3 – 0.1569×2 + 5.7408x + 16.96 写进程序里就是:

int x = target_speed;//需要的速度
int pwm = int(-0.000007 * power(x,4) + 0.0019 * power(x, 3) - 0.1569 * power(x,2) + 5.7408 * x + 16.96);//根据EXCEL给的公式把速度换算成PWM。

备注1:此办法虽说能在一定程度上解决问题,但并不可靠,毕竟不是闭环控制。

备注2:在测试转速时,最好在电机带负载,电压恒定的情况下进行测试。不然测试数据会很不靠谱。数据也当然是越多越好。

备注3:此方法不但可以应用于电机,也可以用于各种连续系统,比如距离传感器就可以用这种办法来标定。

作者 Lee苦海



坐沙发

发表评论

你的邮件地址不会公开


*