基於fpga的舵機控制(MG995)
阿新 • • 發佈:2018-12-20
1、MG995舵機原理
a、這是一款由脈衝控制的舵機,週期為20ms,高脈衝部分所佔多少就決定了舵機轉動多少度。
b、高脈衝部分與角度關係
0.5ms-------------------0°
1ms---------------------45°
1.5ms-------------------90°
2ms----------------------135°
2.5ms-------------------180°
2、設計需求
通過按鍵控制舵機的轉動角度,並且有數碼管可判斷當前轉動角度。
程式碼部分
module pwm_cont( clk, rst_n, da_in, pwm_out ); input clk; input rst_n; input [3:0] da_in; output reg pwm_out; parameter s=1000_000,//20ms-----T s0=125_000,//2.5ms----180 s1=100_000,//2ms-----135 s2=75_000,//1.5ms----90 s3=50_000,//1ms-----45 s4=25_000;//0.5ms---0 reg [31:0] cnt_r; reg [31:0] cnt; reg [3:0] da_in_r;
[email protected](posedge clk or negedge rst_n)begin if(!rst_n) da_in_r <= 4'd0; else da_in_r <= da_in; end [email protected](*)begin if(!rst_n) cnt_r <= 31'd0; else begin case(da_in_r) 4'd0: cnt_r <= s0; 4'd1: cnt_r <= s1; 4'd2: cnt_r <= s2; 4'd3: cnt_r <= s3; 4'd4: cnt_r <= s4; default: cnt_r <= s0; endcase end end[email protected](posedge clk or negedge rst_n)begin if(!rst_n) cnt <= 31'd0; else if(cnt >= s) cnt <= 31'd0; else cnt <= cnt + 1'b1; end [email protected](posedge clk or negedge rst_n)begin if(!rst_n) pwm_out <= 1'b0; else if(cnt <= cnt_r) pwm_out <= 1'b1; else pwm_out <= 1'b0; end endmodule
以下的是我工程的RTL檢視。這個思路我親自驗證過,可以用的噢。
我給出了pwm控制模組,至於按鍵模組和數碼管模組需要大家自己去寫。因為我自己的板子數碼管可能跟你們的不一樣。如果有什麼地方不懂的,大家可以留言討論噢。。。。。。。