《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > CORDIC算法在三軸電子羅盤中的應(yīng)用
CORDIC算法在三軸電子羅盤中的應(yīng)用
來(lái)源:電子技術(shù)應(yīng)用2010年第6期
李 翔, 李 智
桂林電子科技大學(xué) 電子工程學(xué)院, 廣西 桂林 541004
摘要: CORDIC算法是用于計(jì)算三角、反三角、指數(shù)、對(duì)數(shù)等超越函數(shù)的簡(jiǎn)捷算法。將該算法應(yīng)用在以單片機(jī)為核心的三軸電子羅盤中,用于實(shí)現(xiàn)羅盤的傾斜補(bǔ)償并計(jì)算俯仰角、橫滾角和航向角。實(shí)驗(yàn)表明,該算法可有效地在單片機(jī)上運(yùn)行,能夠較好地兼顧計(jì)算精度與效率,有實(shí)用價(jià)值。
中圖分類號(hào): TP368.1
文獻(xiàn)標(biāo)識(shí)碼: A
Application of CORDIC algorithm in 3-axis digital compass
LI Xiang,LI Zhi
School of Electronic Engineering, Guilin University of Electronic Technology, Guilin 541004, China
Abstract: CORDIC is an efficient algorithm for computing transcendental functions including trigonometric, inverse trigonometric, exponential and logarithmic functions. It has been applied to a 3-axis digital compass, which uses micro-controller as the control unit, for tilt-compensation and the calculation of pitch, roll and heading. Experiments show that the algorithm can run effectively on the micro-controller and keep a fair trade-off between accuracy and efficiency, and its practicality is demonstrated.
Key words : CORDIC;digital compass;micro-controller

    CORDIC算法(Coordinate Rotation Digital Computer)(即“坐標(biāo)旋轉(zhuǎn)數(shù)字計(jì)算機(jī)"),最早是由VOLDER J E.于1959年提出[1],當(dāng)時(shí)是為研制B-58轟炸機(jī)的導(dǎo)航系統(tǒng)而設(shè)計(jì)的。但該算法僅僅用到了移位和加減運(yùn)算,因此其硬件實(shí)現(xiàn)非常簡(jiǎn)單。后經(jīng)眾多學(xué)者加以研究和發(fā)展,使其成為數(shù)字電路中計(jì)算各種超越函數(shù)的一種簡(jiǎn)捷有效的算法[2]。CORDIC算法在FPGA中應(yīng)用甚廣[2-3],在DSP上也有所應(yīng)用[4],但鮮有在單片機(jī)上的應(yīng)用報(bào)道。
1 CORDIC算法簡(jiǎn)介
    CORDIC算法的基本原理來(lái)自二維坐標(biāo)的旋轉(zhuǎn)變換。當(dāng)平面直角坐標(biāo)系繞原點(diǎn)旋轉(zhuǎn)一個(gè)角度θ時(shí),新舊坐標(biāo)間的變換關(guān)系為:

    以上介紹的CORDIC算法屬于最基本的“圓周型”CORDIC算法。對(duì)迭代步驟稍作改動(dòng),即可將其變形為“直線型”或“雙曲型”CORDIC算法,從而可用于計(jì)算乘除法、雙曲函數(shù)、指數(shù)函數(shù)和對(duì)數(shù)函數(shù)[2]。
    CORDIC算法中的移位運(yùn)算很適合于在FPGA中用硬件實(shí)現(xiàn),不但計(jì)算速度快,而且相對(duì)于查表法明顯節(jié)省了硬件資源。而在DSP中,由于缺少專門的硬件支持,CORDIC算法相對(duì)于冪級(jí)數(shù)展開(kāi)法或查表法則缺乏優(yōu)勢(shì)[2-4]。對(duì)于經(jīng)典的PIC、8051等單片機(jī),因?yàn)槊繄?zhí)行1條移位指令只能將數(shù)據(jù)左移或右移1位,而執(zhí)行CORDIC算法時(shí)會(huì)在移位運(yùn)算上消耗大量的時(shí)間,從而影響CORDIC算法的效率。
2 羅盤載體姿態(tài)及其解算
 

   

式(7)、式(8)中的Bxh與Byh即是地磁場(chǎng)在水平面內(nèi)的2個(gè)正交分量,分別沿xh軸和yh軸方向。式(7)所描述的正是將載體坐標(biāo)系中測(cè)得的地磁分量變換到地平坐標(biāo)系的過(guò)程。
    參考文獻(xiàn)[5]給出了3種求解羅盤載體姿態(tài)的算法,上文介紹的就是其中的第1種,而第2種算法原理與其完全相同,只是利用三角函數(shù)的性質(zhì)略微簡(jiǎn)化了計(jì)算。應(yīng)當(dāng)指出,由于坐標(biāo)系及角度定義上的差異,式(5)、式(7)、式(8)與參考文獻(xiàn)[5]中的公式略有不同,但并不影響問(wèn)題的本質(zhì)。
 CORDIC算法本身可以計(jì)算三角函數(shù)與反三角函數(shù),因此可以直接將其用于上述算法中[6],但這樣并沒(méi)有完全發(fā)揮CORDIC算法的優(yōu)勢(shì)。如前所述,CORDIC算法的原理來(lái)自于坐標(biāo)旋轉(zhuǎn)變換,因此,可以直接利用CORDIC算法完成式⑺中的變換并由此獲得載體的姿態(tài),而無(wú)需計(jì)算三角與反三角函數(shù)。參考文獻(xiàn)[5]所給出的第3種算法就是基于這一思想,其步驟為:
 (1)用矢量模式將重力加速度矢量在yOz平面內(nèi)的投影旋轉(zhuǎn)到與z軸重合,求得橫滾角。
 (2)再用矢量模式將重力加速度矢量(此時(shí)該矢量已在xOz平面內(nèi))旋轉(zhuǎn)到與z軸重合,求得俯仰角。
 (3)用旋轉(zhuǎn)模式補(bǔ)償橫滾角,計(jì)算補(bǔ)償后的地磁場(chǎng)分量。
 (4)再用旋轉(zhuǎn)模式補(bǔ)償俯仰角,計(jì)算補(bǔ)償后的地磁場(chǎng)分量。
 (5)用矢量模式,根據(jù)地磁場(chǎng)水平分量計(jì)算航向角。
3 CORDIC算法在單片機(jī)上的實(shí)現(xiàn)
3.1 用CORDIC算法計(jì)算三角函數(shù)

 表1給出了在VRS51L3074單片機(jī)上用CORDIC算法計(jì)算反正切函數(shù)的結(jié)果,并與Keil C51編譯器(V8.12)所提供的浮點(diǎn)庫(kù)函數(shù)進(jìn)行了對(duì)比。VRS51L3074是美國(guó)Ramtron公司的產(chǎn)品,基于增強(qiáng)型8051內(nèi)核,在兼容傳統(tǒng)8051指令集的基礎(chǔ)上提升了指令執(zhí)行速度。同時(shí),該單片機(jī)還擁有“增強(qiáng)型算術(shù)單元”的外圍模塊,該模塊中有32位桶形移位器。表1也列出了在CORDIC算法中使用該移位器的結(jié)果。

    此處所用CORDIC算法的輸入、輸出均采用16位數(shù)據(jù)格式,角度以度為單位,小數(shù)點(diǎn)設(shè)在兩字節(jié)之間,即角度分辨率為1/256度,迭代次數(shù)為14次(不含第1次45°的旋轉(zhuǎn)),這是由角度的分辨率決定的(第15次及其后的迭代所轉(zhuǎn)角度已小于1/256度)。為便于比較,所有計(jì)算結(jié)果均已換算為十進(jìn)制格式(單位為度,保留4位小數(shù))。表1還列出了由單片機(jī)的定時(shí)器T0所記錄的函數(shù)執(zhí)行時(shí)間,T0時(shí)鐘為系統(tǒng)時(shí)鐘(不分頻)。因此,計(jì)時(shí)結(jié)果即為函數(shù)從調(diào)用到返回所經(jīng)歷的系統(tǒng)時(shí)鐘周期數(shù)。
 從表1的結(jié)果可看出,CORDIC算法具有一定的速度優(yōu)勢(shì),但其精度無(wú)法與浮點(diǎn)函數(shù)相比。另外,使用桶形移位器代替單片機(jī)的移位指令,可明顯提升CORDIC算法的執(zhí)行速度。這也證明了CORDIC算法在單片機(jī)上運(yùn)行時(shí),在移位操作上消耗了大量的時(shí)間。CORDIC算法的主要優(yōu)點(diǎn)在于: (1)代碼較為簡(jiǎn)潔;(2)可自定義輸出角度單位及格式(浮點(diǎn)庫(kù)函數(shù)所給出的角度單位總是弧度); (3)在計(jì)算y/x的反正切時(shí)不必計(jì)算除法,并且該算法在±90°時(shí)也是收斂的。
 在單片機(jī)上運(yùn)行CORDIC算法還需注意,輸入矢量的模長(zhǎng)既不能過(guò)大也不能過(guò)小。如模長(zhǎng)過(guò)大,則由于CORDIC算法在將矢量旋轉(zhuǎn)的同時(shí)還會(huì)將其“拉長(zhǎng)”(這也正是CORDIC算法需要模校正因子的原因),將會(huì)導(dǎo)致計(jì)算過(guò)程出現(xiàn)溢出。而若模長(zhǎng)過(guò)小,則會(huì)導(dǎo)致精度降低[7]。表2為輸入矢量的模長(zhǎng)對(duì)CORDIC算法的影響:在4個(gè)輸入矢量的輻角均相等的情況下,第1個(gè)矢量由于模長(zhǎng)過(guò)大導(dǎo)致CORDIC計(jì)算過(guò)程溢出,第2個(gè)矢量計(jì)算結(jié)果正常,第3和第4個(gè)矢量由于模長(zhǎng)過(guò)小導(dǎo)致CORDIC計(jì)算精度降低。

 移位操作耗時(shí)過(guò)多以及計(jì)算精度受輸入矢量模長(zhǎng)影響這兩個(gè)缺點(diǎn),使得用CORDIC算法在單片機(jī)上計(jì)算三角函數(shù)的實(shí)用價(jià)值并不理想。
3.2 CORDIC算法用于姿態(tài)解算
 如上所述,CORDIC算法并不適合于在單片機(jī)上直接計(jì)算三角函數(shù)。但將其用于羅盤載體的姿態(tài)解算仍然是可行的,這是基于以下兩點(diǎn):(1)由于傳感器特性的不一致性,其采集的原始數(shù)據(jù)均需經(jīng)過(guò)零點(diǎn)、增益等校準(zhǔn)后才可用于姿態(tài)解算,這就相當(dāng)于為CORDIC算法的輸入矢量模長(zhǎng)做了歸一化處理;(2)如前所述,利用CORDIC算法計(jì)算俯仰角與橫滾角并對(duì)其加以補(bǔ)償時(shí),并不需要具體計(jì)算三角與反三角函數(shù),只需完成坐標(biāo)變換即可。
 參考文獻(xiàn)[5]不僅給出了用CORDIC算法求解航向角的思路,并且在FPGA上進(jìn)行了驗(yàn)證。將這一算法移植到單片機(jī)時(shí),還可再稍作簡(jiǎn)化,具體計(jì)算步驟為:
 (1)將重力加速度矢量在yOz平面內(nèi)的投影旋轉(zhuǎn)到與z軸重合,同時(shí)地磁場(chǎng)矢量亦作同步的旋轉(zhuǎn),從而得到橫滾角并同時(shí)對(duì)其加以補(bǔ)償。
 (2)將重力加速度矢量(此時(shí)該矢量已在xOz平面內(nèi))旋轉(zhuǎn)到與z軸重合,同時(shí)地磁場(chǎng)矢量亦作同步的旋轉(zhuǎn),從而得到俯仰角并同時(shí)對(duì)其加以補(bǔ)償。
 (3)根據(jù)地磁場(chǎng)水平分量計(jì)算航向角。
 以上計(jì)算過(guò)程相當(dāng)于把參考文獻(xiàn)[5]所述算法步驟的第1、第3步和第2、第4步分別合并。與CORDIC算法的矢量模式和旋轉(zhuǎn)模式在FPGA上的實(shí)現(xiàn)方式不同,在單片機(jī)上則不必拘泥于這兩種模式的區(qū)分,從而可以使程序更加緊湊。
 表3給出了在VRS51L3074上使用增強(qiáng)算術(shù)單元實(shí)現(xiàn)CORDIC求解載體姿態(tài)的實(shí)驗(yàn)結(jié)果,并同時(shí)給出按式(5)~式(8)利用浮點(diǎn)運(yùn)算所得結(jié)果進(jìn)行對(duì)比。磁場(chǎng)矢量的模長(zhǎng)已被限制到4 096(相當(dāng)于十六進(jìn)制的0x1000),重力加速度矢量的模長(zhǎng)則限制為8 192(相當(dāng)于十六進(jìn)制的0x2000)。

 電子羅盤的俯仰角、橫滾角和航向角要求達(dá)到0.1°的分辨率。由表3可見(jiàn),CORDIC算法的計(jì)算精度能夠滿足這一要求,并且該算法完成1次姿態(tài)解算所需的時(shí)間僅相當(dāng)于浮點(diǎn)運(yùn)算所需時(shí)間的1/8~1/9,能很好地滿足電子羅盤對(duì)姿態(tài)解算的實(shí)時(shí)性要求。
 CORDIC算法無(wú)需乘除運(yùn)算和大規(guī)模的查找表即可實(shí)現(xiàn)三角函數(shù)、反三角函數(shù)以及其他超越函數(shù)的運(yùn)算。盡管CORDIC算法通常被用于FPGA,實(shí)踐結(jié)果證明,這一算法也可有效地在8051內(nèi)核單片機(jī)上運(yùn)行,并且具有優(yōu)于C語(yǔ)言浮點(diǎn)庫(kù)函數(shù)的運(yùn)行速度和一定的精度。
 在單片機(jī)上,制約CORDIC算法效率的主要因素是移位操作耗時(shí)過(guò)多。若單片機(jī)擁有桶形移位器,如VRS51L3074單片機(jī)的增強(qiáng)型算術(shù)單元,則可改善移位操作耗時(shí)過(guò)多的問(wèn)題,從而提升該算法的效率。此外,適當(dāng)調(diào)節(jié)輸入矢量的模長(zhǎng)也是應(yīng)用該算法時(shí)需要注意的問(wèn)題。
 采用合理安排的計(jì)算步驟,CORDIC算法可以準(zhǔn)確、高效地完成電子羅盤中的傾角補(bǔ)償與航向計(jì)算,同時(shí)也為電子羅盤中的單片機(jī)節(jié)約了程序空間和時(shí)間。
參考文獻(xiàn)
[1] VOLDER J E. The birth of CORDIC[J]. Journal of VLSI Signal Processing, 2000,25:101-105.
[2] ANDRAKA R. A survey of CORDIC algorithm for FPGA based computers[A]. Proceedings of the 1998 ACM/SIGDA    International Symposium on Field Programmable Gate Arrays[C]. ACM, 1998:191-200.
[3] 李全,陳石平,李曉歡,等. 正交三角函數(shù)的CORDIC實(shí)現(xiàn)[J]. 微計(jì)算機(jī)信息,2008,24(12-3):268-269,252.
[4] 馬士超,王貞松. 基于DSP的三角函數(shù)快速計(jì)算[J]. 計(jì)算機(jī)工程,2005,31(22):12-14.
[5] LAULAINEN E, KOSKINEN L, KOSUNEN M, et al. Compass tilt compensation algorithm using CORDIC[A].  IEEE International Symposium on Circuits and Systems, 2008[C]. ISCAS, 2008:1188-1191.
[6] 崔曉松,胡建萍,李陬. CORDIC 算法在導(dǎo)航解算系統(tǒng)中的應(yīng)用[J].杭州電子科技大學(xué)學(xué)報(bào),2007,27(6):5-8.
[7] KOTA K, CAVALLARO J R. Numerical accuracy and hardware tradeoffs for CORDIC arithmetic special-purpose processors[J]. IEEE Transactions on Computers, 1993, 42(7):769-779.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
西西裸体人体做爰大胆久久久| 麻豆成人在线观看| 久久成年人视频| 亚洲一二三区在线观看| 亚洲精品日韩综合观看成人91| 尤物精品在线| 黑丝一区二区| 国产一区三区三区| 国内成人在线| 精品av久久707| 尤物九九久久国产精品的分类| 国内伊人久久久久久网站视频| 国产专区欧美精品| 精品成人在线| 亚洲国产高清一区二区三区| 亚洲国产精品成人精品| 亚洲电影成人| 亚洲黄一区二区| 亚洲日本中文字幕区| 亚洲精品一二三区| 一区二区免费在线观看| 一区二区三区产品免费精品久久75 | 欧美日韩亚洲视频| 欧美日韩高清一区| 欧美亚一区二区| 国产精品爽黄69| 国产一区av在线| 一区二区三区在线看| 亚洲成人在线| 亚洲免费观看| 亚洲一区二区三区在线观看视频 | 欧美日韩国产精品成人| 欧美日韩直播| 国产精品毛片大码女人| 国产精品系列在线播放| 国内精品久久久久影院优| 黄色小说综合网站| 亚洲第一综合天堂另类专| 99精品视频免费观看| 亚洲一级片在线观看| 久久精品视频播放| 亚洲精品美女在线观看播放| 99国产精品国产精品久久 | 欧美在线日韩精品| 久色婷婷小香蕉久久| 欧美激情成人在线| 国产精品美女999| 激情欧美一区二区三区在线观看| 亚洲区欧美区| 亚洲欧美日韩中文视频| 亚洲经典在线看| 亚洲欧美三级在线| 美女诱惑黄网站一区| 欧美性猛交xxxx免费看久久久 | 99在线精品观看| 午夜视频久久久久久| 美女诱惑黄网站一区| 欧美色区777第一页| 国产一区二区三区久久精品| 最新国产精品拍自在线播放| 亚洲免费在线视频| 亚洲欧洲日产国产综合网| 亚洲影院色无极综合| 久久久久久伊人| 欧美性大战久久久久久久蜜臀| 好吊日精品视频| 在线亚洲观看| 亚洲日本乱码在线观看| 欧美在线1区| 欧美理论在线播放| 国产在线播放一区二区三区| 野花国产精品入口| 91久久在线视频| 欧美一区二区日韩| 欧美日韩免费在线视频| 一区在线视频观看| 午夜日韩在线| 亚洲综合第一页| 欧美精品在线视频观看| 国内外成人在线视频| 亚洲一区二区在线看| 亚洲精品久久久久久久久久久 | 久久久人成影片一区二区三区| 欧美亚州在线观看| 亚洲欧洲日产国产网站| 久久激情综合网| 欧美一区二区三区在线观看视频| 欧美日韩国产电影| 亚洲国产精品成人| 亚洲电影中文字幕| 久久av一区二区三区亚洲| 国产精品成人午夜| 日韩视频在线观看免费| 亚洲精品一区二区三区樱花| 久热精品视频在线观看一区| 国产一区二区三区奇米久涩 | 欧美1区免费| 黄色亚洲网站| 欧美在线在线| 久久精品国产69国产精品亚洲| 国产精品裸体一区二区三区| 一本色道久久| 一区二区高清在线| 欧美精品久久久久久久| 亚洲第一福利在线观看| 久久激情视频| 久久亚洲春色中文字幕久久久| 国产午夜精品在线| 欧美一区二区在线播放| 久久er精品视频| 国产精品一区二区男女羞羞无遮挡| 在线视频欧美日韩精品| 亚洲先锋成人| 国产精品久久久久av免费| 一区二区三区视频在线| 亚洲一区二区三区激情| 欧美三级电影大全| 在线亚洲自拍| 亚洲综合欧美日韩| 国产精品免费一区二区三区观看| 一区二区精品| 午夜精品在线视频| 国产精品视屏| 欧美一区二区免费| 久久精品视频99| 国内成+人亚洲+欧美+综合在线| 欧美一区二区黄色| 久久人人97超碰精品888| 一区二区在线视频播放| 亚洲欧洲精品一区二区精品久久久| 久久最新视频| 亚洲国产日韩欧美在线动漫| 亚洲作爱视频| 国产精品久久精品日日| 亚洲尤物在线视频观看| 久久黄金**| 伊人色综合久久天天| 亚洲美女尤物影院| 国产精品爱啪在线线免费观看| 亚洲欧美不卡| 久久免费偷拍视频| 最新日韩中文字幕| 亚洲欧美国产不卡| 国产一二精品视频| 亚洲国产小视频在线观看| 欧美精品手机在线| 亚洲视频www| 久久精品一区蜜桃臀影院| 精品成人在线| 在线亚洲自拍| 国产欧美在线| 亚洲欧洲精品一区| 国产精品大片免费观看| 欧美一区二区三区视频| 米奇777超碰欧美日韩亚洲| 亚洲精品一区二区在线| 午夜精彩国产免费不卡不顿大片| 国产亚洲欧美另类中文| 亚洲人体大胆视频| 国产精品久久久久久久久婷婷| 欧美一区二区视频观看视频| 免费国产一区二区| 一区二区三区日韩欧美| 久久亚洲国产成人| 日韩视频免费在线观看| 久久不射中文字幕| 亚洲精品久久久蜜桃| 欧美在线视频导航| 亚洲精品综合| 久久激情综合网| 亚洲区在线播放| 欧美一区二区三区免费视| 亚洲国产女人aaa毛片在线| 亚洲欧美国产高清| 在线精品视频在线观看高清| 亚洲永久免费| 在线看欧美日韩| 亚洲欧美中日韩| 亚洲国产另类精品专区| 欧美一区二区三区四区夜夜大片| 最新日韩欧美| 久久久久青草大香线综合精品| 日韩亚洲精品在线| 久久香蕉国产线看观看网| 一区二区三区视频在线看| 美女图片一区二区| 亚洲欧美日韩久久精品 | 亚洲免费观看视频| 久久久久久亚洲综合影院红桃 | 91久久中文字幕| 久久九九国产精品怡红院| 日韩午夜在线电影| 美女尤物久久精品| 午夜精品亚洲| 欧美视频日韩| 亚洲精品精选| 国内精品久久久久久久果冻传媒| 亚洲欧美国产毛片在线| 亚洲人成欧美中文字幕| 久久综合久久综合九色|