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的计算,只和迭代次数相关,计算公式如下:

k 计算公式 不同迭代次数时的k值

迭代次数可配置值为[4,8,12,16,20,24],当迭代次数为16时,基本接近极限值,当n->∞时,Kh->1.207497,1/Kh->0.828159;转为定点数:1/Kh=0x6A011D36,用于配置部分函数输入参数2;

  • 关于双曲坐标旋转伸缩因子kh的计算,只和迭代次数相关,计算公式如下:

kh 计算公式 不同迭代次数时的kh值(当i=4、13时重复)

输入输出数据

不同函数的初始化配置基本一致,但是在输入输出数据的范围上存在差异:

  • 余弦(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转换为浮点值结果即可。

COS函数输入弧度值值对应的实际写入到输入的值的对应关系
  • 正弦(Sine)

    输入对应关系与余弦相同;

  • 相位(Phase)

    相位计算的输入为限制与K值相等,输入数据需要进行处理才行,输出值1为计算的对应角度的弧度值除以π;需要进行处理转换;

Phase函数输入关系

例如:在图中点(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]为示例,方便用于在确认输入的情况下配置最合适的比例系数值:

Arctan函数在不同scale下能计算的结果范围

最大计算范围为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下能计算的输入不同;

不同scale下X实际输入范围
  • 平方根(Square Root)

    自然对数计算的比例系数可配范围为[0,2],在不同的比例系数下对应输入输出范围:

不同scale下实际输入输出范围

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进行计算。

软件配置流程

配置流程如下:

  1. CORDIC初始化 调用 CORDIC_init() 传入参数结构体指针

  1. 设置CORDIC参数 调用 CORDIC_setArg() 传入参数

  2. 获取CORDIC结果 调用 CORDIC_getResult1()CORDIC_getResult2()

应用示例

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

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
enum CORDIC_ArgIndexTypeDef

CORDIC arguments type definition.

Values:

enumerator CORDIC_ARG_INDEX1

argument 1

enumerator CORDIC_ARG_INDEX2

argument 2

enum CORDIC_ArgResNum

CORDIC result type definition.

Values:

enumerator CORDIC_ARG_RES_NUM1
enumerator CORDIC_ARG_RES_NUM2
enum CORDIC_DataFormat

CORDIC data format.

Values:

enumerator CORDIC_DATA_FORMAT_BIT16
enumerator CORDIC_DATA_FORMAT_BIT32
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
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
enum CORDIC_Precision

CORDIC Precision in Cycles Number.

Values:

enumerator CORDIC_PRECISIO_1
enumerator CORDIC_PRECISIO_2
enumerator CORDIC_PRECISIO_3
enumerator CORDIC_PRECISIO_4
enumerator CORDIC_PRECISIO_5
enumerator CORDIC_PRECISIO_6