唐 釧,劉 昱,曾 林
(1.天津大學 微電子學院,天津 300072;2.北京智芯微電子科技有限公司,北京 100089)
步進電機是一種將輸入的電脈沖信號轉化為相應角位移的機電元件,具有運動精確、易于控制、響應迅速等特點,廣泛應用于自動控制等領域[1]。步進電機控制器一般以數字信號處理器(Digital Signal Processor, DSP)芯片和ARM架構的微控制器(MCU)為核心[2-4],其優點在于硬件結構成熟,功能設計完備。但是,這種方案的基礎軟硬件平臺的版權大多屬于商業公司,有嚴格的使用限制或源碼不公開以及需要版稅等問題。在嵌入式軟核處理器中,具有代表性的有Intel公司的NIOSⅡ軟核和Xilinx公司的MicroBlaze軟核[5-6],在滿足性能的同時,也簡化了開發流程,但是都局限于自家廠商的開發套件,通用性不高,并且無法更改軟核內部的結構,不利于深入研究和開發。
為了構建步進電機控制技術方案,設計了基于RISC-V指令集架構的微控制器。一方面,RISC-V開源指令集具有免費開放、架構精簡、模塊化、可擴展等優勢[7];另一方面,將處理器、存儲器、總線以及其他IP核集成到單一的FPGA芯片上,能夠減少系統的物理組件數,方便不同應用領域的差異化設計。目前,國內外關于RISC-V處理器在電機控制器中的應用相對較少[8-9],且大部分都集中在商用領域。
開源指令集,比如OpenRISC、OpenSPARC和MIPS R6等,由于指令集設計的不完備、碎片化以及運營模式等原因無法廣泛持續地生存下去。美國加州大學伯克利分校的研究人員,設計RISC-V開源指令集[10-11]。RISC-V指令集具有模塊化、架構精簡、安全、無需向后兼容、可擴展等特點。RISC-V官方詳細比較了指令集設計的衡量標準,相比其他指令集架構,在成本、簡潔性、性能、架構和具體實現的分離、提升空間、程序大小、易于編程/編譯/鏈接等方面,RISC-V均具有一定優勢[12-13]。RISC-V指令集由基本的整數指令集“I”和可選的擴展指令集組成。I指令集包括RV32I、RV32E、RV64I或RV128I,數字前綴表示以位為單位的地址空間。RV32E是RV32I面向嵌入式系統設計的簡化版本,其整數寄存器的數目從32個減少到16個。擴展指令集包括整數與除法指令“M”、原子操作指令“A”、單精度(32比特)浮點指令“F”、雙精度(64比特)浮點指令“D”、壓縮指令“C”等[14-15]。RISC-V這種模塊化的設計使得在不同的場景中,可以選擇配置不同的指令集組合來滿足應用需求,不管是小面積、低功耗的嵌入式場景,還是高性能計算領域,RISC-V均能有一席之地。
設計的微控制器采用基于RISC-V指令集架構的32位處理器內核,存儲模塊包括指令存儲(Instruction RAM)、數據存儲(Data RAM)和用于存放內核啟動代碼的Boot ROM,微控制器使用AXI作為系統高速總線,通過總線協議轉換橋可連接到APB子系統。AXI總線連接了SPI Slave以及JTAG調試接口,APB總線掛載了PLIC和CLINT中斷接口以及UART、PWM、GPIO、SPI等常見的外設模塊。微控制器的具體結構如圖1所示。

圖1 微控制器結構示意圖Fig. 1 Schematic diagram of microcontroller structure
為了使微控制器的各個模塊正常工作,在硬件設計中通過總線分發模塊設置各個模塊的地址區間,對不同模塊的地址進行分配。通過在板級支持包BSP文件中定義與硬件模塊相同的地址,在軟件開發過程中,通過基地址加地址偏移量的方法配置底層寄存器,能夠有效地配置系統各個模塊的工作方式,設置和使用不同的外設功能。微控制器的地址映射如表1所示。指令存儲和數據存儲的大小可以設置,默認為64 kB。在外設區域,每個普通的外設單元占4 kB的地址空間,并預留了足夠的空間方便擴展其他需要的外設。

表1 微控制器的地址分配
設計的32位RSIC-V處理器具有四級流水線結構,單發射順序執行,支持RV32IM整數和乘除法指令集的配置組合。處理器流水線結構如圖2所示。

圖2 處理器流水線結構圖Fig. 2 Processor pipeline diagram
該處理器的流水線結構為“取指”、“譯碼”、“執行”、和“訪存及寫回”4個階段。在取指階段,IFU取指單元通過生成的地址控制信號訪問指令存儲或者外部存儲,Lite BPU采用簡單的靜態分支預測對指令的跳轉地址進行判斷,地址生成邏輯“PC_REG”產生待取指令的地址信號送入譯碼模塊。譯碼模塊主要是由組合邏輯電路組成,將取指階段發送過來的指令按照RISC-V指令編碼規則分解出各個指令字段,得到指令類型、操作數寄存器等信息,在寄存器文件模塊中實現了32個32位的整數通用寄存器,其中X0被預留為常數0,處理器可以同時對2個寄存器進行讀操作和1個寄存器進行寫操作。在執行模塊中,通過對具體指令和操作數的解析后派遣給不同的運算單元模塊去執行。主要有以下幾種:算術邏輯運算單元ALU模塊,整數乘除法單元MULDIV模塊,處理異常狀態寄存器的CSR模塊以及自定義指令運算單元CUSTOM模塊。通過運算單元復用一條數據通路的設計,減小了這部分的面積開銷。訪存及寫回模塊主要用于Load和Store指令的地址生成,對指定地址的內存進行讀或寫,與數據存儲進行數據交互,并將不同運算單元執行的結果寫回到寄存器文件中。控制模塊不屬于流水線階段,主要控制整個流水線的暫?;蚯宄僮?。
文中步進電機控制系統主要由上位機和下位機兩部分構成,如圖3所示,上位機系統由PC機組成,可以通過USB轉UART與微控制器通信,通過USB轉JTAG向微控制器下載程序或者代碼調試等,下位機系統以Artix-7 FPGA實現的RISC-V微控制器作為主要控制模塊,分別連接電機驅動器、步進電機、編碼器以及正交編碼脈沖(QEP,Quadrature Encoder Pulse)檢測電路等模塊。這種模塊化的系統結構可以降低整體的耦合度,提高系統的可移植性以及錯誤排查效率。

圖3 系統結構設計圖Fig. 3 System structure
在系統硬件結構中,通過微控制器的PWM外設來生成相應數目和頻率的脈沖,控制電機的運行速度和轉動方向。驅動器主要由控制級驅動電路和功率驅動電路兩部分構成,其中,控制級驅動電路主要用于分配脈沖信號給步進電機的各相繞組,功率級驅動電路用于提供高電壓、大電流給步進電機。為了驗證步進電機系統工作的準確性,采用了增量式光電編碼器來檢測步進電機轉子位置。
為了準確控制步進電機的運動,利用PWM脈寬調制技術生成相應數目和頻率的脈沖。設計中的PWM模塊支持3個子模塊,分別為PWM0、PWM1、PWM2。其中,PWM0是寬度8 bit的比較器,而PWM1和PWM2寬度為16 bit,工作原理和特性完全相同。每個PWM支持4個可編程的比較器(PWMCMP0-PWMCMP3),每個比較器可以產生對應的1路PWM輸出和中斷,文中的微控制器最多可以支持12路PWM輸出通道。PWM的可配置寄存器如表2所示。

表2 PWM寄存器和功能
PWM模塊掛載在APB總線上,以32位對齊的訪問方式讀寫內部寄存器,通過對PWMCFG寄存器各比特域的賦值來開啟或關閉特定功能,可以選擇不同的PWM脈沖以及生成方式。PWMCOUNT寄存器反映的是PWM計數器的值,使用后會在每個時鐘周期加1,達到預先設定的值后,計數器歸0;假如沒有預設值,計數到最大值即全1后溢出歸0。當PWM計數器歸0后,可以設置寄存器使其重新開始計數或者停止。當PWMCOUNT的值大于PWMS的值時,PWM輸出信號為高電平;反之,信號為低電平。如圖4所示,假設采用2 bit寬的PWMS,當PWMS計數器計數至最大值3時,溢出歸0并重新開始計數。此時,PWM計數周期為4。當PWMCMP0分別配置為0、1、2、3時,PWM輸出的脈沖信號波形。

圖4 PWM脈沖信號輸出波形Fig. 4 Output waveform of PWM pulse signal
通過設置PWMCFG寄存器,配置PWM0和PWM1的2個通道各產生不同頻率和占空比的脈沖,在PWM的輸出引腳端同時對4個通道用邏輯分析儀進行測量,如圖5所示,PWM輸出端均得到了準確的頻率和占空比的脈沖,PWM功能驗證正確。

圖5 PWM輸出脈沖信號測試Fig. 5 Test diagram of PWM output pulse signals
為了驗證步進電機系統工作的準確性,通過增量式光電編碼器來檢測步進電機的轉子位置。編碼器固定在步進電機轉軸上,當電機旋轉時,編碼器輸出2路正交的A、B方波脈沖以及用于基準點定位的脈沖信號Z。QEP檢測模塊主要由載有上拉電阻及濾波電容的功能板、光耦隔離模塊以及GPIO端口連線組成。由于該編碼器是開漏輸出的,需要接上拉電阻才能連接到GPIO端口。濾波電容用來濾除編碼器輸出端產生的部分雜波。光耦隔離模塊用來實現模擬信號和數字信號的隔離,避免編碼器的輸出信號與控制模塊的引腳連線產生干擾信號。QEP模塊的主要工作原理是:利用GPIO端口檢測A或B相脈沖的上升沿,通過脈沖相位來判斷電機轉動方向,在上升沿進行觸發并根據方向信號判定增或減計數。
對于設計的微控制器平臺能夠通過編寫C代碼方便地實現外圍設備的控制功能,并且在FPGA中能夠對各個組成模塊進行修改和優化。利用Vivado軟件完成對微控制器在FPGA上的實現,整個微控制器系統的資源占用情況如表3所示。其中,PWM模塊所占用的LUT數目為356,消耗資源數較少,滿足步進電機控制器的應用需求。

表3 FPGA資源占用表
通過選取不同的嵌入式軟核,將蜂鳥E203、RI5CY和Cortex-M3內核在FPGA(-1等級)中的資源消耗、最高頻率以及Coremark跑分結果與文中處理器內核進行對比,內核消耗資源和性能對比如表4所示。

表4 不同軟核處理器的比較
相比RISC-V架構的內核即蜂鳥E203和RI5CY,CoreMark執行結果表明,文中處理器內核在單位頻率的計算能力上有一定提升。相比ARM架構的Cortex-M3內核,在FPGA實現的最高運行頻率提高了14.3%,電路資源消耗減小了58.7%,在使用FPGA資源不多的情況下,實現了較高的運行頻率和單位頻率計算能力。
系統的軟件開發在Ubuntu環境下進行,開發步驟如下:首先,使用命令行運行腳本文件,通過RISC-V GNU工具鏈對C語言程序進行編譯;然后,編寫OpenOCD的底層驅動文件,使得GDB調試工具通過JTAG接口連接到RISC-V微控制器;最后,將程序下載到硬件平臺中,對其實際運行情況進行測試。在UART通信、LED點燈以及中斷控制等一系列功能測試后,均觀察到正確的實驗結果,說明微控制器的軟硬件功能設計正確。板級驗證成功后,生成內存配置文件(MCS)寫入FLASH中,由于FLASH掉電不丟失的特性,上電即可運行MCU系統,使用時無需反復寫FPGA,使得軟件編程更方便。
在步進電機控制系統的性能測試實驗中,驅動對象是1臺步距角為1.8°、扭矩為1.2 N·m、額定電流為2.5 A、轉動慣量為300 g·cm2的兩相四線混合式步進電機,型號57BYG250B。該步進電機主要應用于低速工業控制領域,轉速不超過1 200 r/min。驅動器使用的是東芝公司TB67S109A芯片,是一種配備PWM斬波器的兩相步進電機驅動器,外圍元件較少,提供高達4 A的峰值電流和DC40V的最大工作電壓。編碼器選用的是HN38-06-N型號的增量型旋轉編碼器,線數為600,即每轉一次產生600個脈沖,DC7-30V電壓供電。實驗原理如圖6所示,在實驗中驅動器的供電電壓為24 V,編碼器供電電壓為12 V。驅動器采用的是共陽極接法,將PUL+、DIR+、EN+與FPGA開發板的3.3 V相連,EN-、DIR-與GPIO相連,通過控制GPIO電平使能電機或者控制其正反轉,PUL-與PWM脈沖輸出端相連,將輸出脈沖傳遞給驅動器。

圖6 實驗原理圖Fig. 6 Experimental schematic diagram
在系統測試中,先對每個組件進行單獨測試,檢查無誤后,用杜邦線連接系統的各個模塊,連線完畢后如圖7所示。系統測試的程序流程為:硬件初始化后,配置外部中斷和計時器中斷,從串口終端發送控制命令,通過是否使能、正反轉、產生脈沖頻率以及運行時間的配置,設置PWM相關的寄存器,PWM產生相應的輸出脈沖到步進電機驅動器。然后開啟計時器,GPIO端口檢測編碼器輸出的A或B相脈沖上升沿信號,根據方向判斷邏輯得到電機轉動方向,并根據上升沿信號進行計數。當計時到設定值時,串口發送編碼器A或B相的累計脈沖總數,程序結束。系統測試程序的主要流程如圖8所示。其中,定時部分是通過CLINT實現的,在計時器中斷開啟后,根據定時時間來設置mtimecmp比較寄存器,mtime計時器一直默認計數,當其值大于或等于mtimecmp的值后,步進電機停止運動,程序結束。

圖7 系統結構組成圖Fig. 7 System connection diagram

圖8 系統測試程序流程圖Fig. 8 Flow chart of system test program
在實驗中,檢查系統的各個模塊并且連線無誤后通電,打開串口終端并設置波特率,將編譯后的主程序下載到微控制器中進行測試。PWM模塊所在時鐘域的頻率為32 MHz,選擇PWM0的通道0作為脈沖產生通道,設置時鐘分頻系數為2使其產生31.25 kHz頻率的輸出脈沖。在1/32細分的測試實驗中,對編碼器輸出的A、B兩相脈沖用示波器多次測量得到,兩相脈沖輸出頻率范圍在2.89~2.95 kHz之間,編碼器頻率的理論值應為2.93 kHz。該誤差是信號經過各級設備時的傳輸誤差以及編碼器存在的固有誤差,在允許范圍以內。
在1/32細分模式下,分別設置運行時間為1 s、10 s、1 min,對應的理論脈沖數為2 929、29 296、175 781,3組實驗實際對應的脈沖計數結果如圖9所示。實際結果和理論結果進行誤差計算,如表5所示,實驗的相對誤差控制在千分之一量級以下。更改細分模式為1/16,此時驅動器輸出的頻率較大,步進電機產生嘯叫聲且無法工作,所以更改PWM分頻系數為3,即PWM輸出頻率為15.625 kHz,在不同運行時間的實驗測試中,實驗誤差和1/32細分實驗近似相同。

圖9 編碼器脈沖計數示意圖Fig. 9 Schematic diagram of encoder pulse count

表5 實驗數據表
對于步進電機運行時間長的失步情況,可采取步校驗設計,將圖8中的“停止運動”替換為“編碼器脈沖計數小于理論值,則補償相差的輸入脈沖數”,比如,在運行時間為1 min的實驗中,對其補償98個脈沖,即可實現位移的精確控制。經過測試,該控制系統能夠準確地控制步進電機的運行步數,滿足步進電機低速控制場景的性能要求。
1)針對步進電機控制系統的應用要求,采用開源的RISC-V指令集設計32位的四級流水線處理器核,通過AXI和APB片上總線實現對外部設備的控制。
2)在單片FPGA中實現了RISC-V軟核處理器、總線、存儲器、外設和調試接口等模塊組成的微控制器,通過板級測試驗證了微控制器設計的正確性。與其他嵌入式軟核相比,文中設計的內核在使用FPGA資源不多的情況下,實現了較高的運行頻率和單位頻率計算能力。
3)設計了PWM和QEP等模塊,結合FPGA核心板、驅動器、PC機等搭建了步進電機控制系統。通過軟硬件仿真和實驗測試表明,系統的相對誤差控制在千分之一量級,通過步校驗設計控制效果更加精確。