biscuit2 发表于 2012-8-22 11:22:43

用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


Flyback 发表于 2012-8-22 12:16:47

收藏了,正在做类似的东东

yamqqqq 发表于 2012-8-22 13:21:30

楼主,NB方向好正确

lg88 发表于 2012-8-22 14:22:21

这个要支持的

xiangzhi28 发表于 2012-8-25 10:51:03

我靠 了,楼主,咱俩多沟通吧,我也正在搭建STM32+FPGA的方案

GAOBBBGAO840527 发表于 2012-9-2 20:22:27

有成品了吗,我做数控,正需要,发联系方式和资料
634008834@qq.com

NJ8888 发表于 2012-9-2 20:28:16

确实是对FPGA相对单片机优势的很好实例

ppopp 发表于 2012-9-3 07:56:57

好!!!!!这样走下去吧

biscuit2 发表于 2012-9-3 15:36:47

FPGA看起来很难,其实比STM32简单多了,啥都不要记。

hmd420304805 发表于 2013-5-5 21:35:46

方向很正确

brumby 发表于 2013-5-5 23:06:15

不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了。

hmd420304805 发表于 2013-5-6 17:53:45

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

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

yuyu87 发表于 2013-5-6 18:59:00

有同感,几十K的PWM是很吃力,后来我做成了几个单片机配合完成,一个伺服配一个单片机,只产生PWM,另外一个主控用通信方式控制其它几个MCU

biscuit2 发表于 2013-5-23 12:56:53

"不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了 "

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

zhongyiming 发表于 2013-5-23 22:34:29

fpga同时做encode处理就更好

mitchell 发表于 2013-5-24 02:27:09

没有用小数分频,频率精度不够高,有点遗憾

jwqacqy 发表于 2013-8-2 15:35:21

有一种xmos方案,xmos芯片实际上就是一个FPGA,不过xmos公司做了关于电机控制的IP核,直接拖过去就可以实现多路电机控制。这种开发方式很简单,不用懂VHDL语言,也很灵活。在令一端可以挂一个单片机做协调控制。

mcuyongchao 发表于 2013-8-4 13:08:28

brumby 发表于 2013-5-5 23:06 static/image/common/back.gif
不做插补的话,STM32完全可以实现5-8路800K以上定位控制的脉冲输出,用FPGA有点大才小用了。 ...

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

hongguan 发表于 2013-8-10 23:01:41

有同感,单片机控制一个电机还行

nishuizhou 发表于 2014-4-29 16:22:21

很好的思路

hamwang1 发表于 2014-9-10 22:26:38

成品的伺服电机也是这个方案

louwenyan 发表于 2014-9-10 23:16:28

我个人觉stm32把要发的脉冲数量、加速距离、减速距离、匀速距离等都计算好以参数形式传给FPGA,而FPGA就负责产生和发送脉冲。

wangdanzhoudan 发表于 2016-1-12 11:19:38

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

5路PWM 800K ...

用DMA+定时器发脉冲不知道可不可以{:smile:}

error_dan 发表于 2016-1-12 12:17:35

我这边做了一个STM32出6路计数脉冲,速度还没测,手头没有高速的计数器频率计之类的,回头想办法借一个.目前看来,起码50K是没有问题的,目标是做到100K,一般步进驱动也就这样到头了.

snail_dongbin 发表于 2016-1-12 12:32:40

arm + fpga俗称万金油组合,
你想要的什么功能都可以做出来{:lol:}

clwang851217 发表于 2016-3-8 16:20:31

不错收藏了!!!

liuem123 发表于 2016-3-17 18:47:06

题主可以试试用STM32F334,HRTIM时钟高达4.6G,功能极其强大

tjx0512 发表于 2016-4-10 19:20:09

学习了!

zzsczz 发表于 2016-4-10 21:29:04

本帖最后由 zzsczz 于 2016-4-10 21:35 编辑

louwenyan 发表于 2014-9-10 23:16
我个人觉stm32把要发的脉冲数量、加速距离、减速距离、匀速距离等都计算好以参数形式传给FPGA,而FPGA就负 ...

编码器反馈 怎哪个做?

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

间隙消除算法 哪里执行?

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



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

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

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

2 位置闭环    物流系统用

3 轮廓控制    机床用

whatcanitbe 发表于 2016-12-30 19:21:37

hamwang1 发表于 2014-9-10 22:26
成品的伺服电机也是这个方案

哪家的方案?
页: [1]
查看完整版本: 用FPGA实现单片机外扩步进(伺服)马达控制模块