用FPGA实现单片机外扩步进(伺服)马达控制模块
以前用STM32开发马达驱动程序,总感觉心有余力不足,CPU负担太重,特别是用PWM中断方式发脉冲的过程,几十K频率的PWM软件中断,如果同时有几路脉冲,CPU就应付不过来了。最近开始研究STM32+FPGA的解决方案,选了一个60元左右的FPGA,可以做并行10轴马达控制,资源预留充分,已经开发好一轴的Verilog HDL代码,在这里晒晒,希望同行交流。module puls_10 (
clk,psa
) ;
input clk;
output reg psa;
reg cnt,c1ms ;
reg freq_tp ,freq_max,atime,atimes,apus,adf;
wire t;
reg 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
收藏了,正在做类似的东东 楼主,NB方向好正确 这个要支持的 我靠 了,楼主,咱俩多沟通吧,我也正在搭建STM32+FPGA的方案 有成品了吗,我做数控,正需要,发联系方式和资料
634008834@qq.com 确实是对FPGA相对单片机优势的很好实例 好!!!!!这样走下去吧 FPGA看起来很难,其实比STM32简单多了,啥都不要记。 方向很正确 不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了。 brumby 发表于 2013-5-5 23:06
不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了。 ...
如果做插补呢?平面圆弧,空间直线大概需要多少le?6000够不够? 有同感,几十K的PWM是很吃力,后来我做成了几个单片机配合完成,一个伺服配一个单片机,只产生PWM,另外一个主控用通信方式控制其它几个MCU "不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了 "
5路PWM 800K 中断全开,STM32 CPU还有精力做其他事情才怪。
fpga同时做encode处理就更好 没有用小数分频,频率精度不够高,有点遗憾 有一种xmos方案,xmos芯片实际上就是一个FPGA,不过xmos公司做了关于电机控制的IP核,直接拖过去就可以实现多路电机控制。这种开发方式很简单,不用懂VHDL语言,也很灵活。在令一端可以挂一个单片机做协调控制。 brumby 发表于 2013-5-5 23:06 static/image/common/back.gif
不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了。 ...
你试过? 不要误人子弟.... 有同感,单片机控制一个电机还行
很好的思路 成品的伺服电机也是这个方案 我个人觉stm32把要发的脉冲数量、加速距离、减速距离、匀速距离等都计算好以参数形式传给FPGA,而FPGA就负责产生和发送脉冲。 biscuit2 发表于 2013-5-23 12:56
"不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了 "
5路PWM 800K ...
用DMA+定时器发脉冲不知道可不可以{:smile:} 我这边做了一个STM32出6路计数脉冲,速度还没测,手头没有高速的计数器频率计之类的,回头想办法借一个.目前看来,起码50K是没有问题的,目标是做到100K,一般步进驱动也就这样到头了. arm + fpga俗称万金油组合,
你想要的什么功能都可以做出来{:lol:} 不错收藏了!!! 题主可以试试用STM32F334,HRTIM时钟高达4.6G,功能极其强大 学习了! 本帖最后由 zzsczz 于 2016-4-10 21:35 编辑
louwenyan 发表于 2014-9-10 23:16
我个人觉stm32把要发的脉冲数量、加速距离、减速距离、匀速距离等都计算好以参数形式传给FPGA,而FPGA就负 ...
编码器反馈 怎哪个做?
编码器 失步校正 和 零点 校正如何处理?
间隙消除算法 哪里执行?
执行机构 运动特性补偿 如何处理?
#######################################
可以 设定几个等级的 运动控制器 :
1 开环 脉冲 简单泵、风机用
2 位置闭环 物流系统用
3 轮廓控制 机床用
hamwang1 发表于 2014-9-10 22:26
成品的伺服电机也是这个方案
哪家的方案?
页:
[1]