在单片机运算中,以整数形式或说定点数形式进行运算会比以浮点数形式运算快。电机控制中,经常需要用到三角函数,正弦,余弦,或者正切,求解这一类函数对于性能没那么优秀的单片机来说十分吃力,实际表现为计算时间长,甚至超过实时运行着的电机系统控制周期,这样对电机控制是十分不利的。
为此可以构建一个三角函数表,使用查表来代替计算,缩短计算所需的时间。以下为构表思路。
一、计算正弦函数值
考虑到在单片机中使用数组去保存三角函数值,为了最大程度节省存储空间,所以在数组中只保存正弦函数在第一象限的函数值,余弦函数和正弦函数其他象限的函数值均由他们之间的关系得出。
以步长1°去构建正弦函数在第一象限的值,同时为了更快地在单片机中运算,把函数值放大1000倍取整,可以得出以下函数值。
补充一个值:10000*sin90 = 9999
二、正余弦函数之间的关系
以下角度范围统一为 -180°~+180°
在第一象限内正余弦函数有如下关系式:
第四象限与第一象限正余弦函数的关系式:
第二象限与第一象限正余弦函数的关系式:
第三象限与第一象限正余弦函数的关系式:
三、根据关系式编写代码
由以上各个象限之间的关系式,编写一个查询函数,如下:
返回值的定义:
三、验证
编写代码将查表的函数值与使用三角函数计算出来的值作对比,一致则建表成功。
验证代码如下:
部分结果输出截图如下:
从输出来看,查表得到的值与计算的值无差异,建表成功。
四、在LPC824上对比使用查表法与实时计算的耗时
单片机的系统时钟为30M,简单测试代码如下:
在循环中插入代码,然后单片机的GPIO0_13接入逻辑分析仪,高电平保持时间即为在单片机中实时计算三角函数的计算耗时。
实时计算的耗时如下:
平均约414us。
查表的耗时如下:
最长耗时一个查表周期约在13us,但绝大部分时间平均4us。
四、总结
从在LPC824上面的测试可以看出,使用查表法大大短缩了计算时间,对于需要复杂计算的控制系统来说,这一方法可以很好地提升系统的性能。在实际应用查表的时候,需要特别留意查表的精度,查表下标的检查,自定义的查表值是否合理。
评论