FPGA驅動步進電機


步進電機

  步進電機是將電脈沖信號轉變為角位移線位移的開環控制電機,是現代數字程序控制系統中的主要執行元件,應用極為廣泛。在非超載的情況下,電機的轉速、停止的位置只取決於脈沖信號的頻率和脈沖數,而不受負載變化的影響,當步進驅動器接收到一個脈沖信號,它就驅動步進電機按設定的方向轉動一個固定的角度,稱為“步距角”,它的旋轉是以固定的角度一步一步運行的。可以通過控制脈沖個數來控制角位移量,從而達到准確定位的目的;同時可以通過控制脈沖頻率來控制電機轉動的速度加速度,從而達到調速的目的。

五線四相步進電

  機是從兩個線圈中間引出兩根線,作為公共端,因此有5根線。

  五線四相步進電機一般采用8拍進行驅動。

verilog代碼實現

//--------------------------------------------------------------
//功能:這是五線四相電機驅動模塊,輸入PWM.DIR,EN就可以控制電機的轉動
//PWM:脈沖數越多電機轉的角度或者圈數越多,PWM的頻率越高,電機轉速越快
//RST_n:低電平下降沿復位
//EN:使能信號
//M_OUT:電機控制時序輸出引腳
//---------------------------------------------------------------

module motor_sig(
    PWM,  //驅動脈沖輸入,脈沖數決定轉的圈數,脈沖頻率決定轉速
    RST_n,//低復位
    DIR,//方向
    EN,//使能信號,1:有效   0:關閉
    //五線四相電機的輸出引腳
    M_OUT
);

input PWM,RST_n,DIR,EN;
output  [3:0]M_OUT;//【a,b,c,d】
reg [3:0]motor_ctl;



always@(negedge RST_n or posedge PWM)
begin
    if(!RST_n)begin
        motor_ctl <= 4'b0000;
    end
    else begin
        if(EN)begin//使能信號有效
            if(DIR)begin//CCW
                case(motor_ctl)
                    4'b0000: motor_ctl <= 4'b1000;
                    4'b1000: motor_ctl <= 4'b1100;
                    4'b1100: motor_ctl <= 4'b0100;
                    4'b0100: motor_ctl <= 4'b0110;
                    4'b0110: motor_ctl <= 4'b0010;
                    4'b0010: motor_ctl <= 4'b0011;
                    4'b0011: motor_ctl <= 4'b0001;
                    4'b0001: motor_ctl <= 4'b1001;
                    4'b1001: motor_ctl <= 4'b1000;
                    default:motor_ctl <= 4'b1000;
                endcase    
            end
            else begin //CW
                case(motor_ctl)
                    4'b0000: motor_ctl <= 4'b1001;
                    4'b1001: motor_ctl <= 4'b0001;
                    4'b0001: motor_ctl <= 4'b0011;
                    4'b0011: motor_ctl <= 4'b0010;
                    4'b0010: motor_ctl <= 4'b0110;
                    4'b0110: motor_ctl <= 4'b0100;
                    4'b0100: motor_ctl <= 4'b1100;
                    4'b1100: motor_ctl <= 4'b1000;
                    4'b1000: motor_ctl <= 4'b1001;
                    default:motor_ctl <= 4'b1000;
                endcase            
            end
        end    
    end
end

assign M_OUT[3:0] = motor_ctl[3:0];


endmodule

仿真結果

 

四線二相步進電機

  這種步進電機相當於五線四相步進電機沒有引出抽頭。如果將五線四相步進電機引出的抽頭不使用。且兩個抽頭沒有連接在一起,可以將其作為二相電機使用。

  四線二相步進電機的驅動有八拍和四拍的。

  八拍驅動時序:

  八個狀態:1、在 A A-正電壓,B B-不給電懸空;2、在 A A-正電壓,BB-也給正電壓;3A A-不給電壓懸空,B B-正電壓;4A A-給負電壓,BB-給正電壓;5AA-給負電壓,B B-不給懸空;6AA-給負電壓,BB-給負電壓;7A A-不給電懸空,B B-給負電壓;8A 與給正電壓,B B-給負電壓;按以上八個狀態輪流供電,控制一下脈寬就可以了。

  實現

//--------------------------------------------------------------
//功能:這是四線二相電機驅動模塊,輸入PWM.DIR,EN就可以控制電機的轉動
//PWM:脈沖數越多電機轉的角度或者圈數越多,PWM的頻率越高,電機轉速越快
//RST_n:低電平下降沿復位
//EN:使能信號
//M_OUT:電機控制時序輸出引腳
//---------------------------------------------------------------

module motor_sig_42(
    PWM,  //驅動脈沖輸入,脈沖數決定轉的圈數,脈沖頻率決定轉速
    RST_n,//低復位
    DIR,//方向
    EN,//使能信號,1:有效   0:關閉
    //四線二相電機的輸出引腳
    M_OUT
);

input PWM,RST_n,DIR,EN;
output  [3:0]M_OUT;//【A+,A-,B+,B-】
reg [3:0]motor_ctl;



always@(negedge RST_n or posedge PWM)
begin
    if(!RST_n)begin
        motor_ctl <= 4'b0000;
    end
    else begin
        if(EN)begin//使能信號有效
            if(DIR)begin//CCW
                case(motor_ctl)
                    4'b0000: motor_ctl <= 4'b1000;
                    4'b1000: motor_ctl <= 4'b1010;
                    4'b1010: motor_ctl <= 4'b0010;
                    4'b0010: motor_ctl <= 4'b0110;
                    4'b0110: motor_ctl <= 4'b0100;
                    4'b0100: motor_ctl <= 4'b0101;
                    4'b0101: motor_ctl <= 4'b0001;
                    4'b0001: motor_ctl <= 4'b1001;
                    4'b1001: motor_ctl <= 4'b1000;
                    default:motor_ctl <= 4'b1000;
                endcase    
            end
            else begin //CW
                case(motor_ctl)
                    4'b0000: motor_ctl <= 4'b1001;
                    4'b1001: motor_ctl <= 4'b0001;
                    4'b0001: motor_ctl <= 4'b0101;
                    4'b0101: motor_ctl <= 4'b0100;
                    4'b0100: motor_ctl <= 4'b0110;
                    4'b0110: motor_ctl <= 4'b0010;
                    4'b0010: motor_ctl <= 4'b1010;
                    4'b1010: motor_ctl <= 4'b1000;
                    4'b1000: motor_ctl <= 4'b1001;
                    default:motor_ctl <= 4'b1000;
                endcase            
            end
        end    
    end
end

assign M_OUT[3:0] = motor_ctl[3:0];


endmodule

  四拍驅動時序

 

 

總結

  該模塊可通過控制PWM信號實現電機旋轉角度和旋轉速度的控制,方便使用,移植方便。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM