CORDIC (坐标旋转数字计算模块)
简介
坐标旋转数字计算模块 (Coordinate Rotation Digital Computer) 提供了在电机控制、计量、信号处理 和许多其他应用中经常使用的特定数学函数 (正弦、余弦、双曲正弦、双曲余弦、反正切 (atan/atan2)、 反双曲正切、模值、平方根、自然对数函数) 的硬件加速。与软件实现相比,CORDIC 加速了这些函数的计算, 使得可以使用更低的操作频率,或者释放处理器周期以执行其他任务。
功能概述
支持24bit 的 CORDIC 旋转引擎
支持圆坐标系和双曲坐标系模式
支持旋转和向量模式
支持以下函数:正弦、余弦、双曲正弦、双曲余弦、反正切 (atan/atan2)、反双曲正切、模值、平方根、自然对数
支持可配置迭代精度;
每个时钟周期迭代 4 次;
支持 16 位和 32 位定点输入和输出格式;
支持轮询和中断上报;
支持零延迟模式,结果可以在准备好后立即读取,无需轮询或中断;
支持 DMA 读写;
功能概述
CORDIC模块使用需要注意以下配置,输入数据的个数、输出数据的个数、输入输出数据格式、需要计算的函数几个方面,具体的函数输入范围和函数讲解,在用户手册中有对应的介绍。这里以实际输入输出数据为例进行说明:
数据格式
ET6001芯片中的CORDIC仅支持定点数输入和输出,输入数据和输出数据格式分为s(32,31)和s(16,15)两种,输入输出数据需要进行转换处理;
由于格式限制输入输出范围仅支持[-1,1]的范围,所以当遇到超出范围的数据时,需要对输入输出进行比例系数配置 CORDIC_Scale ,
先对输入值做运算ARG=x/2^n,使得输入值在[-1,1]范围内,然后进行计算,计算完成后,读取结果再乘以比例系数,得到最终结果。
不同的函数对于scale的配置同样存在限制,具体范围在手册中介绍。
关于圆周坐标旋转伸缩因子k的计算,只和迭代次数相关,计算公式如下:
迭代次数可配置值为[4,8,12,16,20,24],当迭代次数为16时,基本接近极限值,当n->∞时,Kh->1.207497,1/Kh->0.828159;转为定点数:1/Kh=0x6A011D36,用于配置部分函数输入参数2;
关于双曲坐标旋转伸缩因子kh的计算,只和迭代次数相关,计算公式如下:
输入输出数据
不同函数的初始化配置基本一致,但是在输入输出数据的范围上存在差异:
余弦(Cosine)
Param |
描述 |
值域 |
|---|---|---|
变量1 |
角度θ,单位为π*弧度 |
[-1,1] |
变量2 |
幅度 m/k |
[0,1/k] |
结果1 |
m*cosθ |
[-1,1] |
结果2 |
m*sinθ |
[-1,1] |
比例系数 |
N/A |
0 |
例如:如果想使用CORDIC计算25°的Cosine值,则需要对输入值进行转换,将25°转换为弧度为0.436332,由于输入范围限制,需要将输入值除以π,即0.436332/π=0.1475,将对应小数转为s(32,31)格式的值为0.1475*2^31=33554432; 将最终得到的定点数写入ARG1进行计算,指定幅值增益m=1,配置ARG2为1/Kn;计算完成后读取结果值,将结果值除以2^31转换为浮点值结果即可。
- 正弦(Sine)
输入对应关系与余弦相同;
- 相位(Phase)
相位计算的输入为限制与K值相等,输入数据需要进行处理才行,输出值1为计算的对应角度的弧度值除以π;需要进行处理转换;
例如:在图中点(x,y),(x1,y1)输入输出结果是一致的,此时为x=y,理论和实际计算输出结果为0x20000000,转浮点数为0.25,实际弧度对应为0.25*π=0.785398,对应角度为45°;
备注
输入数据时需要注意输入数据精度问题,点(0.1,0.1)和点(0.000001,0.000001)输出结果存在差异,后者输出数据会存在较大误差;
- 幅度(Modulus)
幅度计算与相位计算输入一致,仅输出结果1输出结果2的顺序变化;
- 反正切函数(Arctan)
反正切函数的输入值范围超出范围较大,所以需要配置比例系数,扩展输入范围,下图以输入两端值[-1,1]为示例,方便用于在确认输入的情况下配置最合适的比例系数值:
最大计算范围为89.5523°,超出范围的需要通过其他方式进行间接计算求得;
- 双曲余弦(Cosh)
双曲余弦函数的计算比例系数需要固定配置为1,输入变量1设计限制在输入值范围为[-1.1181.1.1181],在比例系数为1的情况下,实际输入值为[-0.559,0.559], 实际输入范围为[0xB872B021,0x478D4FDF];
输入变量2固定配置为1/kh/2=0.4140795 = 0x35008E9B; 超出范围的需要通过其他方式进行间接计算求得;
- 双曲正弦(Sinh)
比例系数固定为1,与双曲余弦函数计算一致,无其他注意事项;
- 双曲反正切(Arctanh)
比例系数固定为1,除对于输入数据范围限制外,无其他注意事项;
- 自然对数(Logarithm)
自然对数计算的比例系数可配范围为[1,4], 计算方式限制可以确定输入信号值域范围[0.1069, 9.3573],配置比例系数确认在不同sacle下能计算的输入不同;
- 平方根(Square Root)
自然对数计算的比例系数可配范围为[0,2],在不同的比例系数下对应输入输出范围:
16bit数据格式
当数据输入输出配置为16bit数据格式时,输入输出的数据个数默认不可配。总线是32bit的,所以一次性配置至少都会写入或者输出两个16bit数据。
当函数选择为余弦、正弦、相位、幅度、反正切、双曲余弦、双曲正弦时,默认输入两个参数(不受CORDIC_NARGS寄存器配置影响)输出两个参数,此时高16bit表示输入参数2,低16bit表示输入参数1;其余函数默认输入一个参数(不受CORDIC_NARGS寄存器配置影响)输出一个参数,参数值写入低16bit,高16bit数据不关注。
例如:当函数配置为余弦函数,输入参数为25°,则需要将25°转换为弧度为0.436332,由于输入范围限制,需要将输入值除以π,即0.436332/π=0.1475,将对应小数转为s(16,15)格式的值为0.1475*2^15 = 4833;指定幅值增益m=1,系数2配置为1/Kn = 0x4DBA;最终将两个系数组合成一个32bit数据[(系数2 << 16)|(系数1)] 作为输入一次性写入。
计算完成后读取结果值, CORDIC_getResult1 接口函数每次都是一次读取32bit结果,需要使用者自行换算,高16bit为结果2(sine值),低16bit为结果1(cos值)。
备注
在当前格式中,系数2是一定要写入的,如果当做输入一个值进行配置,高16bit写入0,输出结果都会为0,因为会用0来替代系数2进行计算。
软件配置流程
配置流程如下:
CORDIC初始化 调用
CORDIC_init()传入参数结构体指针
设置CORDIC参数 调用
CORDIC_setArg()传入参数获取CORDIC结果 调用
CORDIC_getResult1()和CORDIC_getResult2()
应用示例
CORDIC cos计算示例:CORDIC/CORDIC_Calcos_ZO。
CORDIC sqrt计算-DMA示例:CORDIC/CORDIC_Calsqrt_DMA。
API Reference
Header File
Functions
-
void CORDIC_initStruct(CORDIC_InitParams *initParams)
Initializes the CORDIC parameters to default values.
- 参数:
initParams –
- 返回:
* void
-
void CORDIC_init(CORDIC_InitParams *initParams)
Initializes the CORDIC.
- 参数:
initParams –
- 返回:
* void
-
void CORDIC_setArg(uint32_t arg)
set CORIDC parameters
- 参数:
arg –
- 返回:
* void
-
uint32_t CORDIC_getResult1(void)
get CORIDC calculation result 1
- 返回:
* uint32_t
-
uint32_t CORDIC_getResult2(void)
get CORIDC calculation result 2
- 返回:
* uint32_t
-
uint32_t CORDIC_getStatus(void)
Get CORDIC status.
- 返回:
* uint32_t This parameter can be a value of CORDIC_STATUS_xxxx
-
void CORDIC_clearStatus(uint32_t statusMasks)
clear CORDIC status
- 参数:
statusMasks – This parameter can be a value of CORDIC_STATUS_xxxx
- 返回:
* void
-
bool CORIDC_IsRReady(void)
check whether CORDIC result is valid
- 返回:
true ready
- 返回:
false not ready
-
uint32_t CORDIC_getCurrentArgNum(void)
gets the count of the number of variables currently written
- 返回:
* uint32_t
-
void CORDIC_enableInterrupt(uint32_t interruptFlagMask)
enable CORDIC interrupts
- 参数:
interruptFlagMask –
- 返回:
* void This parameter can be a value of CORDIC_INTERRUPT_FLAG_xxxx
-
void CORDIC_disableInterrupt(uint32_t interruptFlagMask)
disable CORDIC interrupts
- 参数:
interruptFlagMask –
- 返回:
* void
-
void CORDIC_setInterruptMask(uint32_t interruptFlagMask)
set CORDIC interrupts mask
- 参数:
interruptFlagMask –
- 返回:
* void
-
void CORDIC_clearInterruptMask(uint32_t interruptFlagMask)
clear CORDIC interrupts mask
- 参数:
interruptFlagMask –
- 返回:
* void
-
void CORDIC_forceInterrupt(uint32_t interruptFlagMask)
force trigger CORDIC interrupt
- 参数:
interruptFlagMask –
- 返回:
* void
-
void CORDIC_clearInterruptStatus(uint32_t interruptFlagMask)
clear CORDIC interrupts status
- 参数:
interruptFlagMask –
- 返回:
* void
-
uint32_t CORDIC_getInterruptStatusRaw(void)
- 返回:
* uint32_t
-
uint32_t CORDIC_getInterruptStatus(void)
- 返回:
* uint32_t
Structures
-
struct CORDIC_InitParams
CORDIC parameats.
Public Members
-
CORDIC_MathFunc function
function type
-
CORDIC_MathFunc function
Macros
-
CORDIC_STS_CALCULATE_COMPLETE
CORIDC status emuminations.
-
CORDIC_STS_ARG_PARAM_OVERFLOW
-
CORDIC_INT_FLAG_CALCULATE_COMPLETE
CORDIC interrput flags.
-
CORDIC_INT_FLAG_ARG_PARAM_OVERFLOW
Enumerations
-
enum CORDIC_MathFunc
CORDIC function types.
Values:
-
enumerator CORDIC_FUNCTION_COSINE
-
enumerator CORDIC_FUNCTION_SINE
-
enumerator CORDIC_FUNCTION_PHASE
-
enumerator CORDIC_FUNCTION_MODULUS
-
enumerator CORDIC_FUNCTION_ARCTANGENT
-
enumerator CORDIC_FUNCTION_HYPERBOLIC_COSINE
-
enumerator CORDIC_FUNCTION_HYPERBOLIC_SINE
-
enumerator CORDIC_FUNCTION_HYPERBOLIC_ARCTANGENT
-
enumerator CORDIC_FUNCTION_NATURAL_LOGARITHM
-
enumerator CORDIC_FUNCTION_SQUAREROOT
-
enumerator CORDIC_FUNCTION_COSINE
-
enum CORDIC_ArgIndexTypeDef
CORDIC arguments type definition.
Values:
-
enumerator CORDIC_ARG_INDEX1
argument 1
-
enumerator CORDIC_ARG_INDEX2
argument 2
-
enumerator CORDIC_ARG_INDEX1
-
enum CORDIC_ArgResNum
CORDIC result type definition.
Values:
-
enumerator CORDIC_ARG_RES_NUM1
-
enumerator CORDIC_ARG_RES_NUM2
-
enumerator CORDIC_ARG_RES_NUM1
-
enum CORDIC_DataFormat
CORDIC data format.
Values:
-
enumerator CORDIC_DATA_FORMAT_BIT16
-
enumerator CORDIC_DATA_FORMAT_BIT32
-
enumerator CORDIC_DATA_FORMAT_BIT16
-
enum CORDIC_WorkMode
CORDIC work mode.
Values:
-
enumerator CORDIC_WORK_MODE_INTERRUPT
-
enumerator CORDIC_WORK_MODE_POLLING
-
enumerator CORDIC_WORK_MODE_ZERO_OVERHEAD
-
enumerator CORDIC_WORK_MODE_DMA
-
enumerator CORDIC_WORK_MODE_INTERRUPT
-
enum CORDIC_Scale
scale select not take affect when math functions are sin,cos,phase,modulus
Values:
-
enumerator CORDIC_SCALE_0
-
enumerator CORDIC_SCALE_1
-
enumerator CORDIC_SCALE_2
-
enumerator CORDIC_SCALE_3
-
enumerator CORDIC_SCALE_4
-
enumerator CORDIC_SCALE_5
-
enumerator CORDIC_SCALE_6
-
enumerator CORDIC_SCALE_7
-
enumerator CORDIC_SCALE_0