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


關于 q1.15 和 q1.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的最小系統架構中運算。
-
電機控制
+關注
關注
3600文章
2131瀏覽量
277695 -
數學函數
+關注
關注
0文章
10瀏覽量
6475 -
三角函數
+關注
關注
0文章
17瀏覽量
6963
發布評論請先 登錄
怎么在Hightec編譯環境中調用三角函數,是需要包含某些庫嗎?
堅持繼續布局32位MCU,進一步完善產品陣容,96Mhz主頻CW32L012新品發布!
MATLAB三角函數命令
labview中的三角函數問題
如何使用Cordic算法C語言實現三角函數的計算
CW32L012實現CORDIC模塊微秒級快速運算SIN、COS等三角函數
評論