CW32L012具有CORDIC协处理器,可以实现微秒级的三角函数快速计算。
一、CW32L012的CORDIC运算原理CORDIC 是一种坐标旋转数字计算机算法。 CW32L012 的CORDIC 提供某些数学函数的硬件加速,特别是三角函数,常用于电机控制、计量、信号处理和许多其他应用。与软件实现相比,它加快了这些函数的计算速度,从而允许较低的工作频率或释放处理器周期来执行其他任务。
CW32L012的CORDIC支持余弦cos、正弦sin、相位角atan2、模hypot、反正切atan、双曲余弦cosh、双曲正弦sinh、双曲反正切atanh函数运算。迭代次数是可配置的(范围6~66)。
具体操作定义如下:
关于 q1.15 和 q1.31:• 使用sint16/sint32 表示[-1,1) 之间的实数
• sint16 对应于q1.15=sint16/pow(2,15)
• sint32 对应于q1.31=sint32/pow(2,31)
关于迭代次数:• q1.15 建议16-20 次迭代,q1.31 建议24-32 次迭代。
关于启动:• 当只有一个数据输入(x 或y 或z)时,写入该数据开始操作。
• 当需要两个数据输入(x 和y)时,写入y 开始操作。
CORDIC有2个状态标志来指示CORDIC当前的工作状态,包括工作状态标志BUSY和操作完成标志忙标志(CORDIC_CSR.BUSY)
CORDIC_CSR.BUSY标志指示当前CORDIC是处于操作完成状态还是空闲状态。
当CORDIC CSR.BUSY为0时,表示CORDIC处于操作结束或空闲状态,可以读取结果或开始新的操作;当CSR.BUSY为1时,表示CORDIC处于忙碌状态,当前数据操作正在进行中,无法提供操作结果或启动新的操作。
操作完成标志位CORDIC_CSR.EOC 指示CORDIC 操作已完成。设置EOC标志并不影响新一轮操作的继续,无论新一轮操作的类型如何。当新一轮运算开始时,标志位自动清零,并根据新一轮运算的情况重新指令指令。
二、编程实现初始化定义:cordic_init_t init={ .func=CORDIC_FUNC_COS, //选择余弦函数.scale=0, //不使用扩展范围.format=CORDIC_FORMAT_Q1_31, //使用q1.31 格式.iter=CORDIC_ITER_20, //迭代次数.comp=1, //硬件补偿比例因子.ie=0, //禁用中断.dmaeoc=0, //禁用DMA .dmaidle=0 //禁用DMA 空闲}; CORDIC_Init(初始化); //正余弦运算初始化
角度定义int32_t 角度;角度=float_to_q1_31(0.167);
如果计算45度的正弦和余弦,则令angle=0.25(即1/4)。此操作的参数是PI/4(45 度)。在写入角度参数之前,需要将数据转换为Q1.31 格式或Q1.15 格式。
如果计算30度的正弦和余弦,则令angle=0.167(即1/6)。此操作的参数是PI/6(30 度)。在写入角度参数之前,需要将数据转换为Q1.31 格式或Q1.15 格式。
要将浮点数转换为Q1.31 格式,函数定义如下:
int32_t float_to_q1_31(浮点值) { return (int32_t)round(值* 2147483648.0); //2^31}
运算while (CORDIC_GetStatus().busy); //操作前判断BUSY状态CW_CORDIC-Z=angle; //写入Z寄存器开始操作while (!CORDIC_GetStatus().eoc); //等待操作完成。当运算完成时,标志硬件置1,当读取运算结果时,硬件清0
读取结果int32_t y1,y2;浮点y11,y22; y1=CW_CORDIC-Y;//正弦结果在Y寄存器中,Q1.31格式y2=CW_CORDIC-X;//余弦结果在X寄存器中Q1.31格式y11=q1_31_to_float(y1); //将正弦结果转换为浮点数,可以根据需要使用。 y22=q1_31_to_float(y2); //余弦结果转为浮点数,可以根据需要使用。
将Q1.31格式的定点数转换为浮点数的函数定义如下:
float q1_31_to_float(int32_t value) { return (float)value/2147483648.0; //2^31}
将Q1.15格式的定点数转换为浮点数的函数定义如下:
浮点q1_15_to_float(int32_t值){返回(浮点)值/32768.0f;}
参考例程CW32L012的标准库文件夹中有参考例程,可以直接运行。标准库文件可以直接从武汉芯源半导体有限公司官网下载(资料下载固件库)。
例程路径如下:
CW32L012_StandardPeripheralLib_V1.0.3示例CORDICcordic_cosMDK
MDK项目开启图如下:
该例程可以在CW32L012的最小系统架构中运行。
标题:CW32L012实现CORDIC模块微秒级快速运算SIN、COS等三角函数
链接:https://yqqlyw.com/news/sypc/67730.html
版权:文章转载自网络,如有侵权,请联系删除!