1. 程式人生 > >基於fpga的舵機控制(MG995)

基於fpga的舵機控制(MG995)

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檢視。這個思路我親自驗證過,可以用的噢。
所有模組RTL檢視
我給出了pwm控制模組,至於按鍵模組和數碼管模組需要大家自己去寫。因為我自己的板子數碼管可能跟你們的不一樣。如果有什麼地方不懂的,大家可以留言討論噢。。。。。。。