天天看點

FPGA驅動步進電機

利用FPGA驅動步進電機電機的正反轉,可通過調節PWM的頻率來控制電機的轉速

步進電機

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

五線四相步進電

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

FPGA驅動步進電機

  五線四相步進電機一般采用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      

仿真結果

FPGA驅動步進電機

四線二相步進電機

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

FPGA驅動步進電機

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

  八拍驅動時序:

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

FPGA驅動步進電機

  實作

//--------------------------------------------------------------
//功能:這是四線二相電機驅動子產品,輸入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      

  四拍驅動時序

FPGA驅動步進電機

總結

  該子產品可通過控制PWM信号實作電機旋轉角度和旋轉速度的控制,友善使用,移植友善。