首页 > 版块 > 直流无刷驱动 > 帖子正文

归一化在电机控制中究竟有什么用?

赵云 发布于 2021-10-13 11:12
收藏 1 回复 0 浏览 235 原创

哈喽,大家好,今天我们来了解一下归一化在电机控制中的作用,那么首先我们需要先了解一下归一化的概念,这样才能更好的了解电机控制中为什么会经常用到归一化。

归一化就是将一个数据变换到(0,1)或者(-1,1)之间的小数,这样的话把数据范围都统一了,在一些算法处理中会更加方便,容易理解。

下面,我们举两个例子,这样可以更好的理解归一化,假设某个数据的变化范围是[0,1023],那么我们知道这个数据范围的最小值(xmin)是0,最大值(xmax)是1023,若我们得到的一个数据为x,那么归一化的方式就可以表示为:

1.png 

如果x=1023,那么此时对1023归一化之后的结果为:

2.png 

如果x=500,那么此时对500归一化之后的结果为:

3.png 

接着我们再来看如果某个数据的变化范围是[-1023,1023],那么对于大于0的部分的归一化方式跟上面一致,归一化公式还是如下:

4.png 

对于小于0的部分[-1023,0],归一化方式就可以表示为:

 5.png 

假设得到的数据x是-1023,那么可以得到此数据对应的归一化值为:

6.png 

假设得到的数据x是-500,那么可以得到此数据对应的归一化值为:

7.png 

通过以上实例分析,我们知道了归一化的实际实现方式,当我们有其它数据需要归一化时,就可以很容易的得到对应的归一化值。

在电机控制中,我们会对电角度进行归一化,我们都知道电角度的变化范围是0至360度,或者-180至180度,那么,同样我们也有两种归一化方式,对于用0-360度范围表示的电角度来说,归一化方式如下:

8.png 

如果输入的角度是360度,那么得到的归一化值为1,如果输入的角度是180度,那么归一化值就是0.5,其它角度可以根据上面的角度归一化公式进行计算,这样对于0至360度范围的值就可以变化到0至1范围内了。

对于-180至180度范围表示的电角度来说,归一化的方式如下:


9.png

如果输入的电角度是180度,那么得到的归一化值为1,如果输入的电角度是-60度,那么得到的归一化值为-0.333333333,这样对于-180至180度范围的值就可以变化到-1至1范围内了。

归一化弄清楚之后,通过归一化,可以得到0至1或者-1至1之间的小数了,但是在电机控制中,大多数的单片机都没有浮点运算单元,而电机控制的算法中会用到大量的乘法运算,如果对于没有浮点运算单元的单片机来说,直接使用进行小数乘法或者小数除法,那么计算一个小数乘法或者计算一个小数乘法需要花费的时间是很长的。

假设我们整个电机控制算法全部执行完毕需要的时间是30us,那么如果一个小数乘法或者除法运算就花费了几微秒或者几十微秒,整个电机控制算法的就可能无法在30us以内完成了,那么对于一款没有浮点运算单元的单片机来说,又想实现小数乘法或者小数除法应该怎么做呢?

其实大部分的单片机有整数乘法,如果我们把小数乘法转化为整数形式乘法,那么也是可以实现小数乘法运算的,而且整数乘法运算的速度是比较快的,大部分的单片机都是单指令周期就可以实现,那么怎么实现把小数乘法转换为小数乘法呢?

接下来我们就要引入定点小数格式了,先给大家介绍一下定点小数格式的表示方法。

定义为:约定单片机中所有数据的小数点位置是固定不变的。数据的最高位表示符号位,小数点是隐含在符号位之后的。这种格式通常被称为1.15Q15格式,1.15中的1表示数据整数部分的位数,而15表示小数部分的位数。

下面用一个图示给大家说明下这个定点小数的数据格式啊。

10.png 

大家看这幅图啊。Q15格式的话,就是对于一个16位数来说,把最高位作为符号位,然后小数点是隐含在符号位后面的,剩余的15位作为数据位。

我们不妨根据上面这个数据格式来举例说明一下小数跟定点小数格式的转换方式,假设有一个数为0.5,那么对应的定点小数格式表示就是:

11.png 

对应的16位数据格式的16进制表示为0x4000,十进制表示为16384。也就是说,对于-1至1范围的小数来说,16384表示0.5。

我们再假设有一个数据为-0.3,那么通过定点小数格式表示为:

12.png 

计算的方式为:

微信图片_20211013110810.png 

上图对应的16位数据格式的16进制表示为0xD99A,十进制表示为-9830。也就是说,对于-1至1范围的小数来说,-9830表示-0.3。

以上是-1至1之间小数(有符号小数)的定点小数格式表示方式,那么在电机控制中有时还会用到无符号小数(0至1之间的小数),这个时候其实就是将Q15格式表示中的符号位去掉,所有的位都表示数据位,具体表示方式如下图所示:

 13.png

我们不妨也对这种表示方式举个具体的例子来说明一下,假设小数为0.5,那么对应定点小数格式就表示为:

 14.png

上图对应的16位数据格式的16进制表示为0x8000,十进制表示为32768。也就是说,对于0至1范围的小数来说,32768表示0.5。

假设得到的小数为0.7,那么对应定点小数格式就表示为:

15.png 

计算的方式为:

18.png 

上图对应的16位数据格式的16进制表示为0xB333,十进制表示为45875。也就是说,对于0至1范围的小数来说,45875表示0.7。

那么通过以上分析,我们知道了如何将一个小数表示为定点小数(整数)格式,经过这样的表示后,在我们程序编写中,就很好实现一个小数乘法了,最后给大家总结一下将小数转换为整数表示及将整数表示的小数转换为实际的小数对应的公式:

① 有符号小数负数部分转换为整数形式表示公式:

16位有符号数定点小数值 = 对应的小数 * 32768

② 无符号小数转换为整数形式表示公式:

16符号数定点小数值 = 对应的小数 * 65536

③ 有符号整数形式定点小数转换为实际小数表示公式:

实际小数值 = 16位有符号数定点小数值 / 32768

④ 无符号整数形式定点小数转换为实际小数表示公式:

实际小数值 = 16位有符号数定点小数值 / 65536

好了,那么本次文章就给大家分享到这里了,如果大家后期想关注更多的电机驱动方面的知识,可以持续关注我们张飞实战电子,谢谢大家!


0 1
发表评论 侵权投诉
评论 (0)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表乌云踏雪网立场。

文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。