问题提出
最近在写步进电机的S型加速算法,遇到了这个问题,由于要计算s型曲线,使用exp函数一次全部计算完大概需要1.2s,单片机的实时性得不到保证,每次在pwm中断回调中计算也是耗费算力。而且我对于函数的封装也是封装了很多层,各种数据类型之间相互转换,精度下降很多。
问题解决
计算速度慢的问题
我发现将double换为float,可以使速度提高10倍以上,因此使用expf,cosf函数将会大大节省运算时间。
数据精度差的问题
在运算是,我很多变量是使用的是u32或者int类型,在进行除法时导致了精度的损失,把这些数据都换为float型,精度提高了很多。另外需要注意的是float的数据存放方式和int不同,float的范围也远远大于int,如果出现(float)a==(int)b这种判断语句,请一定要考虑到float的精度损失,在这个时候a很可能不等于b