发成果,求更好的步进电机控制解决方法。欢迎围观,

2020-01-20 19:07发布


如果 你在做步进电机的控制,请你留下看一看,相信我走过的弯路能够对你有帮助,同时也希望你能够提出宝贵的意见

前段时间做了一个工程   
主要要求是   1、4路步进电机的定位 (两路同步)  2、  与上位机通讯(昆仑通态MODBUS) 3、 一些简单 动作控制
说说我的板子配置
CPU:c8051f340    48MHZ
数字量输入: 19路 24V 光耦隔离
数字量输出:8路三极管输出(可直接接外部继电器)
电机控制: 4路步进电机控制接口(4x高速脉冲(PLUS)、4x方向(Dir))
模拟量输出:1路0-10v 模拟量输出(pwm)
对外接口:支持modbus的串口 X1  USB X1

好了接下来看板子
未命名.jpg (56.84 KB, 下载次数: 0) 下载附件 曲线 2012-7-15 20:08 上传

(中断处理程序在下面,敬请高手指点!)

最后请高手赐教   
1、这样处理会不会有潜在的BUG (所指的是中断过长,频繁中断),有没有更低的CPU占用的控制办法?
2、在里面需不需要关闭中断?各个中断优先级要做何种处理?(系统中有多个中断  串口中断  一个系统滴答中断   一个PWM占空比调整中断)
3、根据处理能力计算,能否实现4轴同步运动(2000脉冲电机转一周,最高转速350RPM,最大定时器载入值为0xEFFA)?
4、如果要升级主控,选择何种CPU( stm32)?
5、有没有人愿意合作,把这个东西变成PLC,支持T形图编程?(我可负责CPU固件设计,可开源)

void Timer2_ISR (void) interrupt 5                    //该中断处理是否太过冗长复杂?
{
    TMR2CN &= ~1<<7;    //清中断标志 关定时器
    if(T2_runflag)               //中断有效标志(急停  回原点  完成定位用)
    {
    if(UDM)PLU3=!PLU3;    //电平翻转
    if(TABM)PLU1=!PLU1;
         if(l1==0)        TMR2RL=WaitTable[l3];     //查加速曲线表表
         if(steps1-nsteps1<t1) {if(l1<7) l1++;else {l1=0;if(l3<v1)l3++;}}      //如果是加速段--- 正向查表      每一级发7个脉冲
            if(nsteps1<t1) {if(l1<7) l1++;else {l1=0;if(l3>v0_1)l3--;}}            //如果是减速段--- 反向查表                           
   nsteps1--;                                                                                          //计步器
   if(nsteps1>0) TMR2CN |= 1<<2;           //开定时器
    if(nsteps1==0)   T2_runflag=0;             //中断有效标志(急停  回原点  完成定位用)
    if(UDM)PLU3=!PLU3;                     // 根据步进驱动器参数可知       高电平大于1.5US  则算是一个脉冲
    if(TABM)PLU1=!PLU1;                   //  则可以在处理之前翻转一次  处理最后翻转一次         
    }
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
22条回答
hmd420304805
2020-01-20 23:51
liyonglxx 发表于 2012-7-16 10:10
用PWM +DMA  更合理

是用STM32 吗?
我找过相关的文档
当中有一个用定时器的主从模式  一个发脉冲 一个进行溢出计数
但是加减速方面 该如何处理  DMA 要如何做操作
这样做还有一个缺点     每个步进需要2个定时器  而4个轴 就必须用到8个定时器

理论上可以做到 0%的Cpu占用  可是硬件资源上不允许   
麻烦请详细说明点拨一下

一周热门 更多>