基于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;
always@(posedge clk or negedge rst_n)begin
	if(!rst_n)
		da_in_r <= 4'd0;
	else
		da_in_r <= da_in;
end

always@(*)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

always@(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

always@(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控制模块,至于按键模块和数码管模块需要大家自己去写。因为我自己的板子数码管可能跟你们的不一样。如果有什么地方不懂的,大家可以留言讨论噢。。。。。。。

猜你喜欢

转载自blog.csdn.net/qq_38428056/article/details/84961761