STM32 进阶教程 19 - IQmath数学库的使用
前言
STM32 M3 系列是不帶浮點運算單元的,小數(shù)運算都是采用定點轉(zhuǎn)浮點試式實現(xiàn)的,本節(jié)給大家介紹一個很好用的定點轉(zhuǎn)浮點數(shù)學運算庫,IQmath是德州儀器 (TI) 的一個高度優(yōu)化的高精度數(shù)學函數(shù)集合,使 C/C++ 編程人員可以將浮點算法無縫植入定點代碼中。這些例程通常用于計算密集型實時應(yīng)用,最佳執(zhí)行速度和高精確度是這些應(yīng)用的關(guān)鍵。通過使用這些例程,您可以獲得比使用標準 ANSIC 語言編寫的等效代碼更快的執(zhí)行速度。 IQmath 庫還能通過定義可編程動態(tài)范圍和分辨率,解決定點數(shù)學的局限性。
IQmath 優(yōu)勢:
· 用于定點處理器的數(shù)學函數(shù)庫加快了計算浮點值的速度
o 提供 Sin,cos,tan,arcsin,arccos,sqrt,fractional mpy,dv 等的計算
· 加快了對以下操作的處理速度:
o 電機控制
o 伺服控制
o 音頻/圖像編碼和解碼
o 定點 Q 數(shù)學
o 圖形旋轉(zhuǎn)
· 可根據(jù)應(yīng)用要求調(diào)節(jié)分辨率
o 指定 GLOBAL_Q 24
· 可在定點和浮點器件之間實現(xiàn)代碼的無縫兼容性
?
IQmath 函數(shù)表
· 格式轉(zhuǎn)換實用程序
atoIQN, IQN, IQNfrac, IQNint, IQNtoa, IQNtoD, IQNtoF, IQNtoIQ,
IQtoIQN, IQtoQN, QNtoIQ
· 算術(shù)函數(shù)
IQdiv, IQmpy, IQNdiv, IQNmpy, IQNmpy, IQNmpyI32, IQNmpyI32frac,
IQNmpyI32int, IQNmpyIQX, IQNrmpy, IQNrsmpy
· 三角函數(shù)
IQNacos, IQNasin, IQNatan, IQNatan2, IQNatan2PU, IQNcos, IQNcosPU,
IQNsin, IQNsinPU
· 數(shù)學函數(shù)
IQNexp2, IQNisqrt, IQNmag, IQNsqrt
· 其它
IQNabs, IQNsat
?
本節(jié)將給大家展示一下如保在STM32f103系列MCU中如何使用IQmath數(shù)字庫,以及其與標準數(shù)學庫在效率上的對比。
示例詳解
基于硬件平臺: STM32F10C8T6最小系統(tǒng)板, MCU 的型號是?STM32F103c8t6, 使用stm32cubemx 工具自動產(chǎn)生的配置工程,使用KEIL5編譯代碼。
?
? ?
?
本示例所用的最小系統(tǒng)板原理圖:
? ?
?
??
??
?
??
? ?
??
? ?
?
?
? ?
? ?
運行程序,結(jié)果如下:
可以看到,用IQmath后,同樣做40000次運算,IQmath庫所用時間大大減小,只有標準庫的1/5多一點點,時間大大降低。不過需要注意的是在使用IQmath時需要多多注意數(shù)據(jù)范圍,比如本例中IQ變量采用默認的24位(可以在IQmathLib.h 中修改GLOBAL_Q 值來更改IQ數(shù)據(jù)格式 ),即long(32)位中,高8位且于表示整數(shù),低24位用于表示小數(shù),那個 _iq 定義的主量范圍是 -128~127.999999,這也是為什么本例代碼要寫成用i,j,z三個循環(huán)來操作,且z最大取40的原因,若將z最大值設(shè)為50,代碼及對應(yīng)結(jié)果如下:
IQmath中加和減可能直接用運算符 +/-,但乘除等其它運算需在用到專門的函數(shù)如本例中用到的乘法運算 _IQmpy,除法 _IQdiv ,當然不有提定格式乘除運德 ?_IQNmpy, _IQNdiv,N是IQ數(shù)據(jù)格式,如_IQ16mpy, _IQ12div等。下數(shù)提供一些常用函數(shù)列表:
· 格式轉(zhuǎn)換實用程序
atoIQN, IQN, IQNfrac, IQNint, IQNtoa, IQNtoD, IQNtoF, IQNtoIQ,
IQtoIQN, IQtoQN, QNtoIQ
· 算術(shù)函數(shù)
IQdiv, IQmpy, IQNdiv, IQNmpy, IQNmpy, IQNmpyI32, IQNmpyI32frac,
IQNmpyI32int, IQNmpyIQX, IQNrmpy, IQNrsmpy
· 三角函數(shù)
IQNacos, IQNasin, IQNatan, IQNatan2, IQNatan2PU, IQNcos, IQNcosPU,
IQNsin, IQNsinPU
· 數(shù)學函數(shù)
IQNexp2, IQNisqrt, IQNmag, IQNsqrt
· 其它
IQNabs, IQNsat
?
關(guān)于IQmath下載及接口函數(shù)使用介紹可以去TI官網(wǎng)下載安裝StellarisWare工具,在該工具中包含有各種不同處理器的IQmath庫,以及使用幫助文檔。在StellarisWare工具的安裝目錄 StellarisWare\IQmath 下包含了 IQmath 庫如下圖:
簡要的iqmath說明文教程:https://blog.csdn.net/zhanglifu3601881/article/details/97617573
OK,本期實驗完成!下期見!同時如果大家有什么疑問或是有想了解的其它內(nèi)容,也歡迎大家留言!!最后喜歡這個公眾號的同學們記得加關(guān)注了,會有不定期技術(shù)干貨推出!!
文中源碼資料下載,在公眾號里給十三發(fā)消息:
下載|STM32進階教程 19
? ?
?
關(guān)注十三公眾號
? ?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的STM32 进阶教程 19 - IQmath数学库的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 进阶教程 18 – ADC间
- 下一篇: IQmath中文手册