關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 實驗19:步進電機1

        實驗19:步進電機1

        作者: 時間:2023-10-13 來源:電子森林 收藏

        本實驗的任務是設計控制四相繞組的電機正轉、反轉、停止的控制電路。要求如下:
        電機運轉規律為:正轉30s→停10s→反轉30s→停10s→正轉30s……

        本文引用地址:http://www.104case.com/article/202310/451502.htm

        步進電機是將電脈沖信號轉變為角位移或線位移的開環控制元步進電機件。當電流流過定子繞組時,定子繞組產生一矢量磁場。該磁場會帶動轉子旋轉一角度,使得轉子的一對磁場方向與定子的磁場方向一致。當定子的矢量磁場旋轉一個角度。轉子也隨著該磁場轉一個角度。每輸入一個電脈沖,電動機轉動一個角度前進一步。它輸出的角位移與輸入的脈沖數成正比、轉速與脈沖頻率成正比。改變繞組通電的順序,電機就會反轉。按照實驗要求,我們可以將電機四相的時序圖畫出,用1代表高電平,用0代表低電平。則四相步進電機的工作狀態可以分成四個:狀態1:1001 ;狀態2:1100;狀態3:0110;狀態4:0011 。正轉:狀態1~4,反轉狀態4~1。根據要求中的正轉30s→停10s→反轉30s→停10s→正轉30s,我們可以將周期設為40s(其中高電平30s,低電平10s),占空比為3/4。


        設計文件 stepmotor1.v

         module stepmotor1(input wire clk,rst,output wire [5:0] led); wire 	clk1h;				//1秒時鐘reg	[5:0] dir;				//電機轉動方向控制。正轉000111,反轉111000,停止000000reg	[5:0] timecont;			//計時 parameter 	S1 = 2'b00,		//電機工作狀態 正轉
        			S2 = 2'b01,		//停止
        			S3 = 2'b10,		//反轉
        			S4 = 2'b11;		//停止 
         parameter	TIME_S1 = 6'd30,	//正轉計時30秒
        			TIME_S2 = 6'd10, 	//停止計時10秒
        			TIME_S3 = 6'd30;	//反轉計時30秒 reg [1:0] cur_state,next_state;	 
        divide #(					//產生1秒時鐘信號.WIDTH(24),.N(12000000)) u1(.clk(clk),.rst_n(rst),.clkout(clk1h)); always@(posedge clk1h or negedge rst)        //第一段
        	if(!rst)
        		cur_state <= S1;
            else 
        	    cur_state <= next_state; always@(cur_state or rst or timecont)        //第二段,狀態轉移
        	if(!rst)
        		begin
        			next_state = S1;
        		end
        	else
        		begin
        			case(cur_state)				     //判斷當前狀態
        				S1:begin
        					if(timecont == 1)        //計時結束跳轉到S2,否則保持S1
        						next_state = S2;
        					else
        						next_state = S1;
        					end
        				S2:begin
        					if(timecont == 1)		//計時結束跳轉到S3,否則保持S2
        						next_state = S3;
        					else
        						next_state = S2;
        					end
        				S3:begin
        					if(timecont == 1)        //計時結束跳轉到S4,否則保持S3
        						next_state = S4;
        					else
        						next_state = S3;
        					end
        				S4:begin
        					if(timecont == 1)        //計時結束跳轉到S1,否則保持S4
        						next_state = S1;
        					else
        						next_state = S4;
        					end
        				default:next_state = next_state;
        			endcase
        		end always@(posedge clk1h or negedge rst)			//第三段,當前狀態輸出
        	if(!rst)
        		begin
        			timecont <= TIME_S1;
        			dir <= 6'b000111;
        		end
        	else
        		begin
        			case(next_state)
        				S1:begin
        					dir <= 6'b000111;           //正轉狀態輸出
        					if(timecont == 1)			//計時控制		
        						timecont <= TIME_S1;    //計時結束賦新的值
        					else
        						timecont <= timecont - 1;//計時減1
        					end
        				S2:begin
        					dir <= 6'b000000;
        					if(timecont == 1)
        						timecont <= TIME_S2;
        					else
        						timecont <= timecont - 1;
        					end
        				S3:begin
        					dir <= 6'b111000;
        					if(timecont == 1)
        						timecont <= TIME_S3;
        					else
        						timecont <= timecont - 1;
        					end
        				S4:begin
        					dir <= 6'b111000;
        					if(timecont == 1)
        						timecont <= TIME_S2;
        					else
        						timecont <= timecont - 1;
        					end
        				default:begin
        							dir <= 6'b000111;
        							timecont <= TIME_S1;
        						end
        			endcase
        		endassign 	led = dir;		             //狀態輸出動作對應的led endmodule
        1. 打開,建立工程。
        2. 新建設計文件,并鍵入設計代碼。
        3. 根據邏輯綜合并分配管腳,在本實驗中引腳分配如下:clk —C1,rst_n — L14,led0~led3—N13, M12, P12, M11
        4. 構建并輸出編程文件,燒寫至的Flash之中。
        5. 觀察輸出結果。

        開發板上的四個led會按照10011100011000111001的順序正向循環30s后暫停10s,然后繼續從暫停處開始按照10010011011011001001的順序反向循環30s后暫停10s,再繼續從暫停處開始正向循環,以此往復。在任一時刻,按下rst所連接的按鍵開關,將rst置0,則循環會回到初始1001狀態開始正向循環。



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 尖扎县| 杨浦区| 饶河县| 宣汉县| 和田市| 康保县| 古丈县| 锡林浩特市| 宁晋县| 保定市| 庆云县| 梁平县| 濉溪县| 永济市| 南召县| 资中县| 繁峙县| 弋阳县| 大足县| 嘉禾县| 平昌县| 同德县| 宝兴县| 汕尾市| 来凤县| 扬州市| 双城市| 平遥县| 大连市| 威宁| 瑞丽市| 融水| 惠来县| 西乌珠穆沁旗| 宜兴市| 哈巴河县| 徐闻县| 吕梁市| 宁德市| 凌云县| 滦南县|