搜索
bottom↓
回复: 29

用FPGA实现单片机外扩步进(伺服)马达控制模块

[复制链接]

出0入0汤圆

发表于 2012-8-22 11:22:43 | 显示全部楼层 |阅读模式
      以前用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周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出110入0汤圆

发表于 2012-8-22 12:16:47 | 显示全部楼层
收藏了,正在做类似的东东

出0入0汤圆

发表于 2012-8-22 13:21:30 | 显示全部楼层
楼主,NB方向好正确

出0入0汤圆

发表于 2012-8-22 14:22:21 | 显示全部楼层
这个要支持的

出0入0汤圆

发表于 2012-8-25 10:51:03 | 显示全部楼层
我靠 了,楼主,咱俩多沟通吧,我也正在搭建STM32+FPGA的方案

出0入0汤圆

发表于 2012-9-2 20:22:27 | 显示全部楼层
有成品了吗,我做数控,正需要,发联系方式和资料
634008834@qq.com

出0入0汤圆

发表于 2012-9-2 20:28:16 | 显示全部楼层
确实是对FPGA相对单片机优势的很好实例

出0入0汤圆

发表于 2012-9-3 07:56:57 | 显示全部楼层
好!!!!!这样走下去吧

出0入0汤圆

 楼主| 发表于 2012-9-3 15:36:47 | 显示全部楼层
FPGA看起来很难,其实比STM32简单多了,啥都不要记。

出0入0汤圆

发表于 2013-5-5 21:35:46 来自手机 | 显示全部楼层
方向很正确

出0入0汤圆

发表于 2013-5-5 23:06:15 | 显示全部楼层
不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了。

出0入0汤圆

发表于 2013-5-6 17:53:45 来自手机 | 显示全部楼层
brumby 发表于 2013-5-5 23:06
不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了。 ...

如果做插补呢?平面圆弧,空间直线大概需要多少le?6000够不够?

出20入186汤圆

发表于 2013-5-6 18:59:00 | 显示全部楼层
有同感,几十K的PWM是很吃力,后来我做成了几个单片机配合完成,一个伺服配一个单片机,只产生PWM,另外一个主控用通信方式控制其它几个MCU

出0入0汤圆

 楼主| 发表于 2013-5-23 12:56:53 | 显示全部楼层
"不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了 "

5路PWM 800K 中断全开,STM32 CPU还有精力做其他事情才怪。

出0入0汤圆

发表于 2013-5-23 22:34:29 来自手机 | 显示全部楼层
fpga同时做encode处理就更好

出0入0汤圆

发表于 2013-5-24 02:27:09 来自手机 | 显示全部楼层
没有用小数分频,频率精度不够高,有点遗憾

出0入0汤圆

发表于 2013-8-2 15:35:21 | 显示全部楼层
有一种xmos方案,xmos芯片实际上就是一个FPGA,不过xmos公司做了关于电机控制的IP核,直接拖过去就可以实现多路电机控制。这种开发方式很简单,不用懂VHDL语言,也很灵活。在令一端可以挂一个单片机做协调控制。

出0入0汤圆

发表于 2013-8-4 13:08:28 | 显示全部楼层
brumby 发表于 2013-5-5 23:06
不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了。 ...

你试过? 不要误人子弟....     

出0入0汤圆

发表于 2013-8-10 23:01:41 | 显示全部楼层
有同感,单片机控制一个电机还行

出0入0汤圆

发表于 2014-4-29 16:22:21 | 显示全部楼层
很好的思路

出0入0汤圆

发表于 2014-9-10 22:26:38 来自手机 | 显示全部楼层
成品的伺服电机也是这个方案

出0入0汤圆

发表于 2014-9-10 23:16:28 来自手机 | 显示全部楼层
我个人觉stm32把要发的脉冲数量、加速距离、减速距离、匀速距离等都计算好以参数形式传给FPGA,而FPGA就负责产生和发送脉冲。

出0入0汤圆

发表于 2016-1-12 11:19:38 | 显示全部楼层
biscuit2 发表于 2013-5-23 12:56
"不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了 "

5路PWM 800K ...

用DMA+定时器发脉冲不知道可不可以

出0入0汤圆

发表于 2016-1-12 12:17:35 | 显示全部楼层
我这边做了一个STM32出6路计数脉冲,速度还没测,手头没有高速的计数器频率计之类的,回头想办法借一个.目前看来,起码50K是没有问题的,目标是做到100K,一般步进驱动也就这样到头了.

出0入0汤圆

发表于 2016-1-12 12:32:40 | 显示全部楼层
arm + fpga  俗称万金油组合,
你想要的什么功能都可以做出来

出0入0汤圆

发表于 2016-3-8 16:20:31 | 显示全部楼层
不错  收藏了!!!

出0入0汤圆

发表于 2016-3-17 18:47:06 | 显示全部楼层
题主可以试试用STM32F334,HRTIM时钟高达4.6G,功能极其强大

出0入0汤圆

发表于 2016-4-10 19:20:09 | 显示全部楼层
学习了!

出95入8汤圆

发表于 2016-4-10 21:29:04 | 显示全部楼层
本帖最后由 zzsczz 于 2016-4-10 21:35 编辑
louwenyan 发表于 2014-9-10 23:16
我个人觉stm32把要发的脉冲数量、加速距离、减速距离、匀速距离等都计算好以参数形式传给FPGA,而FPGA就负 ...


编码器反馈 怎哪个做?

编码器 失步校正 和 零点 校正如何处理?

间隙消除算法 哪里执行?

执行机构 运动特性补偿 如何处理?



#######################################

可以 设定几个等级的 运动控制器 :

1 开环 脉冲   简单泵、风机用

2 位置闭环    物流系统用

3 轮廓控制    机床用

出100入85汤圆

发表于 2016-12-30 19:21:37 来自手机 | 显示全部楼层
hamwang1 发表于 2014-9-10 22:26
成品的伺服电机也是这个方案

哪家的方案?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 07:55

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表