|
以前用STM32开发马达驱动程序,总感觉心有余力不足,CPU负担太重,特别是用PWM中断方式发脉冲的过程,几十K频率的PWM软件中断,如果同时有几路脉冲,CPU就应付不过来了。最近开始研究STM32+FPGA的解决方案,选了一个60元左右的FPGA,可以做并行10轴马达控制,资源预留充分,已经开发好一轴的Verilog HDL代码,在这里晒晒,希望同行交流。
module puls_10 (
clk,psa
) ;
input clk;
output reg psa;
reg [31:0] cnt,c1ms ;
reg [31:0] freq_tp ,freq_max,atime,atimes,apus,adf;
wire [31:0] t;
reg [31:0] pus_cnt,pus_total;
always @ ( posedge clk ) begin
if ( c1ms == 52428 )//1ms clk
begin
c1ms <= 0 ;
if(adf==1)
atimes<=atimes+1'b1;
if(adf==3)
if(atimes>0)
begin
atimes<=atimes-1'b1;
freq_tp<= (atimes/atime)*freq_max;
end;
if(adf==1)
if(atimes<=atime)
begin
freq_tp<= (atimes/atime)*freq_max;
if(freq_tp>=freq_max)
begin
freq_tp<=freq_max;
adf<=2;
apus<=pus_total-pus_cnt;
end;
end
else
begin
freq_tp<=freq_max;
adf<=2;
apus<=pus_total-pus_cnt;
end;
if(pus_cnt<=apus)
if(adf==2)
adf<=3;
end
else
c1ms <= c1ms + 1'b1 ;
end
assign t = 52428800 / freq_tp;
always @ ( posedge clk ) begin
if ( cnt == ( t - 1 ) )
cnt <= 0 ;
else
cnt <= cnt + 1'b1 ;
end
always @ ( posedge clk ) begin
if(pus_cnt>0)
if ( cnt >= t/2 )
psa= 1'b1 ;
else
psa= 1'b0;
end
always @ ( posedge psa ) begin
if(pus_cnt>0)
pus_cnt<=pus_cnt-1;
end
endmodule
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|