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 标志位被置位并不影响继续进行新一轮运算,无论新一轮运算是什么类型。当新一轮运算被启动时,标志位自动清零并根据新一轮运算的情况重新进行指示。
二、 编程实验过程
(1)初始化定义:
计算COS SIN运算,Q1.15格式,初始化代码如下:
cordic_init_t init = {.func = CORDIC_FUNC_COS, // 选择余弦函数.scale = 0, // 不使用扩展范围.format = CORDIC_FORMAT_Q1_15, // 使用q1.15格式.iter = CORDIC_ITER_20, // 迭代次数.comp = 1, // 硬件补偿伸缩因子.ie = 0, // 禁用中断.dmaeoc = 0, // 禁用DMA.dmaidle = 0 // 禁用DMA空闲};// 初始化CORDIC模块CORDIC_Init(&init);
(2)角度定义
若计算45度的正余弦,则令angle为0.25(即1/4)的Q15格式数据。
// 输入角度(以pi为单位,q1.15格式)int32_t angle = float_to_q1_15(0.25);// 0.25即:PI/4 Q1.15: 0x2000
注意,写入角度参数前需要将数据转化为Q1.15格式。
将浮点数转换为Q1.15格式,函数定义如下
// 浮点数转换为Q1.15格式的定点数int32_t float_to_q1_15(float value){return (int32_t)round(value * 32768.0f);}
(3)运算
CW_CORDIC->Z = angle; // 写入Z寄存器启动运算// 等待运算完成while (!CORDIC_GetStatus().eoc); //运算完成标志硬件置1,读取运算结果硬件清0
(4)读取结果
X寄存器为余弦结果,Y寄存器为正弦结果
// 读取结果int32_t result = CW_CORDIC->X; // 余弦结果在X寄存器
如需要将Q1.15格式的定点数转换为浮点数,则可使用以下函数:
float q1_15_to_float(int32_t value){return (float)value / 32768.0f;}
(5)参考例程及实验结果
参考例程如下:
通过网盘分享的文件:Coridc求正余弦 实例.zip
链接: https://pan.baidu.com/s/1yLn-6D8OsbbVVstQDheWWQ?pwd=L012 提取码: L012
MDK工程仿真运行示意图如下:
如上图所示1/4PI的余弦结果为23171(Q15格式)。
扫码加入QQ群3群| 610403240
526