以下文章來源于FPGA之旅,作者電擊小子
一. 簡(jiǎn)介
在使用有感FOC算法的時(shí)候,離不開使用編碼器來獲取電機(jī)角度,編碼器的種類非常多,常見的有AS5600、AS5047P和MT6835等等,它們的驅(qū)動(dòng)方式可以分為IIC、SPI、ABZ和HALL,其中最簡(jiǎn)單的就是ABZ方式了,因?yàn)樗鼘?duì)于任意編碼器來說,驅(qū)動(dòng)方式都是一樣的,只需要將脈沖對(duì)應(yīng)的角度分辨率修改一下即可,而IIC和SPI則會(huì)根據(jù)不同的芯片,內(nèi)部寄存器地址和位寬的不一樣,驅(qū)動(dòng)上會(huì)存在一些差異,針對(duì)這種驅(qū)動(dòng)方式,如何能夠在更換芯片后,對(duì)原工程的改動(dòng)量最小,代碼開發(fā)量最小,這正是本篇文章所要介紹的內(nèi)容。
二. 編碼器模塊介紹
在多路FOC驅(qū)動(dòng)板上,一共是支持了兩種編碼器和兩種角度獲取方式,分別是AS5047P和MT6835,SPI和ABZ。AS5047P的精度是14bit,MT6835的精度是21bit,它們的價(jià)格差不多,大家可以根據(jù)自己的需求進(jìn)行選擇,個(gè)人感覺精度越高的編碼器調(diào)試起來越難(達(dá)到編碼器精度所對(duì)應(yīng)的效果),不知道大家是否有同樣的感覺。
整個(gè)編碼器模塊的結(jié)構(gòu)如下圖所示,輸入端為ABZ、SPI的引腳信號(hào),則為角度、速度等信息。ABZ模塊、SPI驅(qū)動(dòng)模塊和角度..檢測(cè)模塊為固定模塊,更換編碼器后也不需要進(jìn)行修改,而AS5047P_SPI模塊和MT6835_SPI模塊則需要根據(jù)外接編碼器類型進(jìn)行選擇。

這樣一來換新編碼器的時(shí)候,只需要很小的開發(fā)工作就可以完成新編碼器的驅(qū)動(dòng)了。另外這三個(gè)角度獲取模塊通過generate條件編譯控制,根據(jù)外部parameter參數(shù)即可選擇對(duì)應(yīng)的模塊生效。

SPI驅(qū)動(dòng)模塊
SPI驅(qū)動(dòng)模塊的端口信號(hào)如下圖所示,CPOL、CPHA控制SPI的模式,SCLK_DIV控制SPI的通信速率,DATA_WIDTH控制單次SPI通信的數(shù)據(jù)位寬,這樣基本可以滿足所有通過SPI的方式來獲取角度的編碼器了。

2. AS5047P_SPI模塊
AS5047p讀角度信息的過程可以通過數(shù)據(jù)手冊(cè)來獲取,一共需要發(fā)起兩次的SPI傳輸,上一次發(fā)起的SPI回讀數(shù)據(jù)會(huì)在下一次SPI傳輸時(shí)輸出,過程如下圖所示。

角度獲取有兩個(gè)寄存器可以讀,分別是0x3FFF和0x3FFE,本次使用的是0x3FFF寄存器,然后NOP指令什么也不操作,最開始設(shè)計(jì)的時(shí)候也沒有考慮那么多,直接先發(fā)送一個(gè)0x3FFF,然后發(fā)送一個(gè)NOP,這樣就可以獲取到角度信息了,剛開始用的時(shí)候,基本沒有什么問題。

但是在后面繼續(xù)用的時(shí)候,就出現(xiàn)了非常嚴(yán)重的bug,AS5047P會(huì)一直讀到錯(cuò)誤的數(shù)據(jù),需要斷電一下編碼器才行。通過debug發(fā)現(xiàn)是回傳數(shù)據(jù)的EF位拉高了,導(dǎo)致無法獲取到正確的數(shù)據(jù),而該狀態(tài)信息是無法自行清除的,所以只要EF拉高了,在后續(xù)的通信過程中會(huì)一直拉高,導(dǎo)致角度獲取異常。
通過數(shù)據(jù)手冊(cè)可以看到,通過讀ERRFL可以將錯(cuò)誤狀態(tài)信息給清除,那么我們可以將第二階段的NOP指令換成ERRFL指令就可以了,這樣即使在通信的過程中出現(xiàn)了問題,也會(huì)在下一次角度獲取的時(shí)候,可以正常通信。

AS5047P的SPI精度為14bit,所以將獲取到的原始數(shù)據(jù)轉(zhuǎn)化為角度信息還需要將其乘上1440(擴(kuò)大65536)即可。
3. MT6835_SPI模塊
MT6835的角度獲取過程會(huì)比AS5047P的先對(duì)而已簡(jiǎn)單許多,只需要一次SPI傳輸即可,傳輸過程如下圖所示,在獲取到數(shù)據(jù)之后,按照手冊(cè)給的信息拼接成完整的角度。MT6835獲取到的原始數(shù)據(jù)數(shù)據(jù)為21bit,將其轉(zhuǎn)為角度需要乘上11.25即可。


4.角度、速度、位置檢測(cè)模塊
角度信息在輸入進(jìn)模塊的時(shí)候就已經(jīng)是角度了,直接將信息輸入即可。
速度信息采用單位時(shí)間內(nèi)角度變化量進(jìn)行求解,單位時(shí)間的選擇不宜過大也不宜過小,本設(shè)計(jì)采用的是100us,角度輸入的單位是°,直接計(jì)算出來的話是°/s,速度一般采用RPM轉(zhuǎn)每分鐘作為衡量單位,因此需要進(jìn)行單位的轉(zhuǎn)換,轉(zhuǎn)換過程如下圖所示。
10000為100us的倒數(shù)。
speed_angle_gap_sum為角度間隔總和
0.000015為每一個(gè)speed_angle_gap_sum代表的角度值, 轉(zhuǎn)換方式為 1/(360*65536)
最后將角度信息擴(kuò)大100倍進(jìn)行輸出

位置控制由兩個(gè)信號(hào)進(jìn)行控制,一個(gè)是使能信號(hào),當(dāng)該信號(hào)使能后,模塊才會(huì)累加角度間隔,避免在切換到位置控制的時(shí)候,目標(biāo)角度和實(shí)際角度誤差過大的問題。另外一個(gè)就是設(shè)置當(dāng)前位置為初始位置,也就是將位置信息置零。

5. ABZ模塊
略
三.小結(jié)
本次主要給大家介紹了一下FPGA FOC驅(qū)動(dòng)編碼器模塊的所有內(nèi)容,和設(shè)計(jì)過程。在后續(xù)新型號(hào)的編碼器添加進(jìn)來的話,可以以最小的代價(jià)完成這項(xiàng)工作。
-
FPGA
+關(guān)注
關(guān)注
1659文章
22364瀏覽量
632961 -
編碼器
+關(guān)注
關(guān)注
45文章
3928瀏覽量
141964 -
FOC
+關(guān)注
關(guān)注
21文章
379瀏覽量
46041
原文標(biāo)題:FPGA FOC編碼器(庫)模塊詳解
文章出處:【微信號(hào):FPGA研究院,微信公眾號(hào):FPGA研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
FOC電機(jī)驅(qū)動(dòng)磁編碼器怎么校準(zhǔn)?
怎樣使用Simple FOC庫運(yùn)行編碼器呢
RS連續(xù)編碼器的FPGA設(shè)計(jì)與實(shí)現(xiàn)
基于正余弦編碼器反饋處理的FPGA在伺服驅(qū)動(dòng)中的應(yīng)用
基于FPGA增量式編碼器的接口設(shè)計(jì)
基于FPGA的圓光柵編碼器數(shù)據(jù)采集系統(tǒng)設(shè)計(jì)
LDPC碼編碼器的FPGA實(shí)現(xiàn)
高精度增量式編碼器與基于DSP和FPGA編碼器信號(hào)測(cè)量模塊
基于FPGA+DSP的海德漢編碼器結(jié)構(gòu)及設(shè)計(jì)
基于FPGA的EnDat接口編碼器數(shù)據(jù)采集設(shè)計(jì)
旋轉(zhuǎn)編碼器測(cè)量_旋轉(zhuǎn)編碼器安裝方式
FPGA FOC驅(qū)動(dòng)編碼器模塊介紹
評(píng)論