CW32L012具有CORDIC 協(xié)處理器,能夠?qū)崿F(xiàn)微秒級快速計算三角函數(shù)功能。
一、CW32L012的CORDIC運(yùn)算原理
CORDIC是一種坐標(biāo)旋轉(zhuǎn)數(shù)字計算機(jī)算法。CW32L012的CORDIC提供某些數(shù)學(xué)函數(shù)的硬件加速,特別是三角函數(shù),通常用于電機(jī)控制、計量、信號處理和許多其他應(yīng)用。與軟件實(shí)現(xiàn)相比,它加快了這些功能的計算速度,允許較低的工作頻率,或釋放處理器周期以執(zhí)行其他任務(wù)。
CW32L012的CORDIC支持余弦 cos、正弦 sin、相位角 atan2、模 hypot、反正切 atan、雙曲余弦 cosh、雙曲正弦 sinh、雙曲反正切 atanh 函數(shù)運(yùn)算。迭代次數(shù)可進(jìn)行配置(范圍 6~66)。
具體運(yùn)算定義如下:


關(guān)于 q1.15 和 q1.31:
? 用 sint16/sint32 代表 [-1,1)之間的實(shí)數(shù)
? sint16 對應(yīng)的 q1.15 = sint16 / pow(2,15)
? sint32 對應(yīng)的 q1.31 = sint32 / pow(2,31)
關(guān)于迭代次數(shù):
? q1.15 建議迭代 16-20 次,q1.31 建議迭代 24-32 次。
關(guān)于啟動:
? 只有一個數(shù)據(jù)輸入(x 或 y 或 z)時,寫入該數(shù)據(jù)即啟動運(yùn)算。
? 需要兩個數(shù)據(jù)輸入(x 和 y)時,寫入 y 啟動運(yùn)算。
CORDIC 存在 2 個狀態(tài)標(biāo)志,用來指示 CORDIC 的當(dāng)前工作狀態(tài),包括工作狀態(tài)標(biāo)志 BUSY、運(yùn)算完成標(biāo)志忙標(biāo)志(CORDIC_CSR.BUSY)
CORDIC_CSR.BUSY 標(biāo)志位指示當(dāng)前 CORDIC 是否處于運(yùn)算結(jié)束或空閑狀態(tài)。
當(dāng)CORDIC CSR.BUSY 為 0 時,表示 CORDIC 處于運(yùn)算結(jié)束或空閑狀態(tài),可以讀取結(jié)果或開始新的運(yùn)算;當(dāng)CSR.BUSY 為 1 時,表示 CORDIC 處于忙碌狀態(tài),當(dāng)前數(shù)據(jù)運(yùn)算正在進(jìn)行中,無法提供運(yùn)算結(jié)果或開始新的運(yùn)算。
運(yùn)算完成標(biāo)志位CORDIC_CSR.EOC 指示 CORDIC 運(yùn)算完成。EOC 標(biāo)志位被置位并不影響繼續(xù)進(jìn)行新一輪運(yùn)算,無論新一輪運(yùn)算是什么類型。當(dāng)新一輪運(yùn)算被啟動時,標(biāo)志位自動清零并根據(jù)新一輪運(yùn)算的情況重新進(jìn)行指示。
二、編程實(shí)現(xiàn)
初始化定義:
cordic_init_t init = {
.func = CORDIC_FUNC_COS, // 選擇余弦函數(shù)
.scale = 0, // 不使用擴(kuò)展范圍
.format = CORDIC_FORMAT_Q1_31, // 使用q1.31格式
.iter = CORDIC_ITER_20, // 迭代次數(shù)
.comp = 1, // 硬件補(bǔ)償伸縮因子
.ie = 0, // 禁用中斷
.dmaeoc = 0, // 禁用DMA
.dmaidle = 0 // 禁用DMA空閑
};
CORDIC_Init(&init); //sin cos運(yùn)算初始化
角度定義
int32_t angle; angle = float_to_q1_31(0.167);
若計算45度的正余弦,則令angle=0.25(即1/4)。這樣運(yùn)算的參數(shù)為 PI/4(45度),寫入角度參數(shù)前需要將數(shù)據(jù)轉(zhuǎn)化為Q1.31格式或Q1.15格式。
若計算30度的正余弦, 則令angle=0.167(即1/6)。這樣運(yùn)算的參數(shù)為PI/6 (30度),寫入角度參數(shù)前需要將數(shù)據(jù)轉(zhuǎn)化為Q1.31格式或Q1.15格式。
將浮點(diǎn)數(shù)轉(zhuǎn)換為Q1.31格式,函數(shù)定義如下:
int32_t float_to_q1_31(float value) {
return (int32_t)round(value * 2147483648.0); // 2^31
}
運(yùn)算
while (CORDIC_GetStatus().busy);//運(yùn)算前判斷BUSY狀態(tài) CW_CORDIC->Z =angle; // 寫入Z寄存器啟動運(yùn)算 while (!CORDIC_GetStatus().eoc); // 等待運(yùn)算完成,完成時標(biāo)志硬件置1,讀取運(yùn)算結(jié)果時硬件清0
讀取結(jié)果
int32_t y1,y2; float y11,y22; y1=CW_CORDIC->Y;// 正弦結(jié)果在Y寄存器 ,Q1.31格式 y2=CW_CORDIC->X;// 余弦結(jié)果在X寄存器 Q1.31格式 y11=q1_31_to_float(y1); //正弦結(jié)果轉(zhuǎn)浮點(diǎn)數(shù),可根據(jù)需要使用 y22=q1_31_to_float(y2); //余弦結(jié)果轉(zhuǎn)浮點(diǎn)數(shù),可根據(jù)需要使用
其中Q1.31格式的定點(diǎn)數(shù)轉(zhuǎn)為浮點(diǎn)數(shù)函數(shù)定義如下:
float q1_31_to_float(int32_t value) {
return (float)value / 2147483648.0; // 2^31
}
Q1.15格式的定點(diǎn)數(shù)轉(zhuǎn)換為浮點(diǎn)數(shù)函數(shù)定義如下:
float q1_15_to_float(int32_t value)
{
return (float)value / 32768.0f;
}
參考例程
CW32L012的標(biāo)準(zhǔn)庫文件夾下有參考例程,可以直接運(yùn)行。標(biāo)準(zhǔn)庫文件可在武漢芯源半導(dǎo)體有限公司的官方網(wǎng)址上直接下載(資料下載固件庫)。
例程路徑如下:
CW32L012_StandardPeripheralLib_V1.0.3ExamplesCORDICcordic_cosMDK
MDK工程打開示意圖如下:

該例程可以在CW32L012的最小系統(tǒng)架構(gòu)中運(yùn)算。
-
電機(jī)控制
+關(guān)注
關(guān)注
3600文章
2131瀏覽量
277641 -
數(shù)學(xué)函數(shù)
+關(guān)注
關(guān)注
0文章
10瀏覽量
6475 -
三角函數(shù)
+關(guān)注
關(guān)注
0文章
17瀏覽量
6963
發(fā)布評論請先 登錄
RX系列三角函數(shù)單元(TFU)的使用介紹
怎么在Hightec編譯環(huán)境中調(diào)用三角函數(shù),是需要包含某些庫嗎?
堅持繼續(xù)布局32位MCU,進(jìn)一步完善產(chǎn)品陣容,96Mhz主頻CW32L012新品發(fā)布!
三角函數(shù)的查表法
MATLAB三角函數(shù)命令
請教高手求解方程組含有三角函數(shù)
ARM7如何實(shí)現(xiàn)三角函數(shù)
請問一下,28035的cla支持三角函數(shù)運(yùn)算嗎
labview中的三角函數(shù)問題
利用Cordic算法來計算三角函數(shù)的值
如何使用Cordic算法C語言實(shí)現(xiàn)三角函數(shù)的計算
CW32L012與STM32F103的三角運(yùn)算性能對比
CW32L012與STM32G431的CORDIC三角函數(shù)運(yùn)算性能對比
CW32L012實(shí)現(xiàn)CORDIC模塊微秒級快速運(yùn)算SIN、COS等三角函數(shù)
評論