0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CW32L012实现CORDIC模块微秒级快速运算SIN、COS等三角函数

CW32生态社区 来源:CW32生态社区 2026-01-05 16:56 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

CW32L012具有CORDIC 协处理器,能够实现微秒级快速计算三角函数功能。

一、CW32L012的CORDIC运算原理

CORDIC是一种坐标旋转数字计算机算法。CW32L012的CORDIC提供某些数学函数的硬件加速,特别是三角函数,通常用于电机控制、计量、信号处理和许多其他应用。与软件实现相比,它加快了这些功能的计算速度,允许较低的工作频率,或释放处理器周期以执行其他任务。

CW32L012的CORDIC支持余弦 cos、正弦 sin、相位角 atan2、模 hypot、反正切 atan、双曲余弦 cosh、双曲正弦 sinh、双曲反正切 atanh 函数运算。迭代次数可进行配置(范围 6~66)。

具体运算定义如下:

图片

wKgZO2lU852AIdU6AAA1AKOGvSI167.jpg

关于 q1.15q1.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(&init);  //sin cos运算初始化

角度定义

int32_t angle; 
angle = 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(float value) {
    return (int32_t)round(value * 2147483648.0); // 2^31
}

运算

while (CORDIC_GetStatus().busy);//运算前判断BUSY状态 
CW_CORDIC->Z =angle;   // 写入Z寄存器启动运算
while (!CORDIC_GetStatus().eoc);  // 等待运算完成,完成时标志硬件置1,读取运算结果时硬件清0

读取结果

int32_t y1,y2;
float  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格式的定点数转换为浮点数函数定义如下:

float q1_15_to_float(int32_t value)
{
    return (float)value / 32768.0f;
}

参考例程

CW32L012的标准库文件夹下有参考例程,可以直接运行。标准库文件可在武汉芯源半导体有限公司的官方网址上直接下载(资料下载固件库)。

例程路径如下:

CW32L012_StandardPeripheralLib_V1.0.3ExamplesCORDICcordic_cosMDK

MDK工程打开示意图如下:

图片

该例程可以在CW32L012的最小系统架构中运算。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电机控制
    +关注

    关注

    3602

    文章

    2228

    浏览量

    279521
  • 数学函数
    +关注

    关注

    0

    文章

    10

    浏览量

    6485
  • 三角函数
    +关注

    关注

    0

    文章

    17

    浏览量

    6989
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    RX系列三角函数单元(TFU)的使用介绍

    硬件加速器三角函数单元(Trigonometric Function Unit)能够高速处理三角函数sincos、arctan和sqrt(x2+y2)
    的头像 发表于 12-04 12:25 4817次阅读
    RX系列<b class='flag-5'>三角函数</b>单元(TFU)的使用介绍

    怎么在Hightec编译环境中调用三角函数,是需要包含某些库吗?

    怎么在Hightec编译环境中调用三角函数sin(),cos(),tan(),求教,是需要包含某些库吗?
    发表于 02-18 08:44

    坚持继续布局32位MCU,进一步完善产品阵容,96Mhz主频CW32L012新品发布!

    (EAU),可以提供部分数学函数、算术运算的硬件加速,特别适用于电机控制、电源、计量、信号处理应用。 同时,CW32L012 是基于 eFlash 的单芯片低功耗微控制器,集成了双1
    发表于 07-16 16:32

    三角函数的查表法

    在单片机运算中,以整数形式或说定点数形式进行运算会比以浮点数形式运算快。电机控制中,经常需要用到三角函数,正弦,余弦,或者正切,求解这一类函数
    发表于 11-19 08:06

    MATLAB三角函数命令

    MATLAB三角函数命令Sin 正弦 Sinh 双曲正弦 Asin 反正弦 Asinh 反双曲正弦 Cos 余弦 Cosh 双曲余弦 Acos 反余弦 Acosh 反双曲余弦 Tan 正切&
    发表于 09-22 16:04

    请教高手求解方程组含有三角函数

    请教高手求解方程组含有三角函数方程如下 :cos(θ2+θ3)cosθ1Px+cos(θ2+θ3)sinθ1Py+
    发表于 03-17 14:35

    ARM7如何实现三角函数

    ARM7中如何编程实现三角函数sincos,软件用的是TKStudio,求大神
    发表于 11-12 16:31

    请问一下,28035的cla支持三角函数运算

    请问一下,28035的cla支持三角函数运算吗,为什么使用sin函数时,编译有错,那该怎么使用三角函数
    发表于 05-14 00:58

    labview中的三角函数问题

    我想使用三角函数中的余弦函数(输入是角度的那种)我试了一下,发现cos90°算出来不是0,为什么呀,算别的角度是对的,就是算值等于0的度数会有问题。用了弧度角度换算、公式节点、直接输入π/2,这种方法出来都不是0
    发表于 04-09 14:18

    基于DSP的三角函数快速计算

    基于DSP的三角函数快速计算
    发表于 04-07 14:33 53次下载
    基于DSP的<b class='flag-5'>三角函数</b><b class='flag-5'>快速</b>计算

    三角函数arcranx运算电路

    三角函数arcranx运算电路
    发表于 04-09 10:16 3110次阅读
    反<b class='flag-5'>三角函数</b>arcranx<b class='flag-5'>运算</b>电路

    利用Cordic算法来计算三角函数的值

    运算,就能计算常用三角函数值,如SinCos,Sinh,Cosh函数。 J. Walthe
    发表于 11-17 16:37 7792次阅读
    利用<b class='flag-5'>Cordic</b>算法来计算<b class='flag-5'>三角函数</b>的值

    如何使用Cordic算法C语言实现三角函数的计算

    三角函数的计算是个复杂的主题,有计算机之前,人们通常通过查找三角函数表来计算任意角度的三角函数的值。这种表格在人们刚刚产生三角函数的概念的时候就已经有了,它们通常是通过从已知值(比如
    发表于 04-25 18:27 9次下载
    如何使用<b class='flag-5'>Cordic</b>算法C语言<b class='flag-5'>实现</b><b class='flag-5'>三角函数</b>的计算

    CW32L012与STM32F103的三角运算性能对比

    没有硬件浮点运算单元。 但在运算三角函数时,CW32L012支持CORDIC算法。 二、 三角
    的头像 发表于 12-29 15:32 2619次阅读
    <b class='flag-5'>CW32L012</b>与STM32F103的<b class='flag-5'>三角</b><b class='flag-5'>运算</b>性能对比

    CW32L012与STM32G431的CORDIC三角函数运算性能对比

    CORDIC协处理器的三角运算性能对比。对比结果出乎意料。 一、硬件架构 二、运算100W次SIN30度与
    的头像 发表于 12-29 15:55 2928次阅读
    <b class='flag-5'>CW32L012</b>与STM32G431的<b class='flag-5'>CORDIC</b><b class='flag-5'>三角函数</b><b class='flag-5'>运算</b>性能对比