一、全称与直译
CORDIC = COordinate Rotation DIgital Computer 中文:坐标旋转数字计算机,一套只用加减 + 移位就能算三角函数、开方、反正切的迭代算法。
二、核心原理(极简版)
所有计算本质是平面向量旋转:
把任意目标角度,拆成一堆固定小角度:±arctan(1/2ⁿ)(45°、26.56°、14°…… 越来越小)
每次只旋转一个小角,旋转公式不含乘法,只有加减、右移(除以 2)
迭代几十次后向量逼近目标角度,直接得到 sin/cos/ 幅值 / 相位
两大工作模式(电机必用)
旋转模式(Rotation):角度→直角坐标 输入角度 θ,输出 cosθ、sinθ 用途:Park 逆变换、生成 SVPWM 正弦波、电流矢量旋转
向量模式(Vectoring):直角坐标→极坐标 输入 (x,y),输出:幅值√(x²+y²)、相位atan2(y,x) 用途:
- Clarke 变换后 αβ 求电角度
- 无传感器 FOC 磁链观测算转子位置
- 正交编码器 / 磁编码角度解算

三、对比三种常用计算方案(嵌入式电机)
math.h 浮点库 sin/cos/atan2 耗时极长、占用 CPU、中断实时性差,M0/M0 + 无 FPU 基本跑不动
查表法 速度快,但 ROM 占用大;精度越高表格越大,角度插值有误差
CORDIC(软件 / 硬件)
- 仅移位 + 加减,资源极小,无浮点依赖
- 精度可控(迭代次数越多越准)
- 执行周期固定,适合电机高频电流环(10~50kHz 斩波)
- STM32G4/H7 内置硬件 CORDIC 协处理器,单周期流水线计算,完全解放 CPU
四、在你的 BLDC/PMSM FOC 里干什么(重点)
FOC 全程离不开三角函数,全靠 CORDIC 提速:
Park 变换:Id,Iq = αβ 旋转(-θ) → 旋转模式 CORDIC
逆 Park 变换:αβ = IdIq 旋转 (θ) → 旋转模式
角度观测(滑模 / 磁链观测):输入 αβ 电压 / 电流,用向量模式atan2算转子电角度
SVPWM 调制:计算扇区、正弦调制波 sin/cos
电流幅值计算:sqrt(Iα²+Iβ²)
关键优势(配合你前面学的斩波恒流、高频 PWM)
电流环频率越高(超频斩波几十 kHz),单次中断留给 CPU 的时间越少; 硬件 CORDIC 几微秒完成 sin/cos/atan2,否则 CPU 算三角函数会拖慢环路,导致震荡、电流失控。
五、STM32 硬件 CORDIC 快速使用流程(G4/H7)
开启 CORDIC 外设时钟
配置运算模式:COS_SIN / ATAN2 / MODULUS(幅值)
设置精度迭代次数、定点 Q 格式(电机通用 Q1.31)
写入输入参数,硬件自动流水线运算
读取结果;可搭配 DMA 批量处理采样电流,零 CPU 干预

六、一句话总结
CORDIC 是嵌入式电机 FOC 的专用数学加速器,不用乘法、不用浮点,快速算 sin/cos/ 反正切 / 开方;高端 STM32 带硬件 CORDIC,是高频斩波恒流 FOC 稳定运行的核心外设。
对,你理解得完全到位,再给你捋顺一层更直观的逻辑:
目标:想要 θ 对应的 cosθ、sinθ,本质就是找到一个长度固定、角度等于 θ的向量,它的水平 x 值 = cosθ,竖直 y 值 = sinθ。
CORDIC 手里只有一堆固定小转角:45°、26.56°、14.04°、7.12°…… 越往后角度越小。它没法一步转到目标角度,只能一次转一小格。
每转一小格,只做两件事:加减、右移(除以 2),全程没有乘法。转完记录一共转了多少角度,和目标 θ 对比,差多少就反向修正。
反复微调几十次后,向量角度几乎等于 θ,此时读 x、y,就是 cosθ、sinθ。
举个生活化比喻: 好比你想把指针转到 30°,手里只有 45°、26.5°、14° 这些档位,不能直接调 30°。 先转 45°,发现转多了,再往回拨 26.5°,又少了,再往前补一点 14°…… 来回微调几次,指针无限贴近 30°,此时指针的横、竖坐标就是你要的 cos、sin。