xiaomage_2000 发表于 2010-6-25 09:57:06

想用51单片机发脉冲采用位置控制方式,同时控制3台伺服驱动的定位~大家能有什么好方法

如题,想用一片51发脉冲采用位置控制方式,同时控制3台伺服驱动的定位~速度也不能太慢~发100KHZ的脉冲可以吗?

xiaomage_2000 发表于 2010-6-25 10:12:52

先说下我的思路,就是用定时器,先比较需定位的位置数据,确定电机正反转(方向电平的高低),确定后,计算各轴的定位数据比如X需要1200个脉冲,Y300个,Z200个。分别设个LONG变量,然后定时器按要求速度定好定时初值,在中断里,对各轴的脉冲引脚反转,变量同时减1比较是否到0,到0后,做个标记就不对这个轴的脉冲变化

nian2yu3 发表于 2010-6-25 10:20:57

不能同时比较3个轴吧

xiaomage_2000 发表于 2010-6-25 10:26:13

我是想比如三个变量分别为X,Y,Z
中断中X--然后判断是否为0;Y--,判断是否为0 ;Z--判断是否为0
这样,在同时对他们所对应的PULS引脚取反

master5888 发表于 2010-6-25 10:34:54

原则上是可以的,不过CPU中断开销不小啊
100K速率不低,如果要求不高,可以把电子齿轮比设大点,降低频率

xiaomage_2000 发表于 2010-6-25 10:40:28

恩,主要开始打算设到100K考虑速度尽量和PLC输出的差不多呵呵,12MHZ晶振,100K,定时器在方式1下,10个时钟中断一次~不过分别比较这些数据应该很费时间,不过100K可能实现不了,低点可能差不多,不知4楼】 master5888 大侠有没什么好的方法吗?

xiaomage_2000 发表于 2010-6-25 10:44:29

我这个定时器如果是100K的话,就算内部那些程序不占指令周期,我单纯反转P口IO的话,是不是才相当于输出的50K脉冲啊?
各位大侠还有没有更好的办法?

master5888 发表于 2010-6-25 10:46:21

呵呵,按你的说法根本跑不动啊。
要么换高速点的MCU,要么降低输出频率

xiaomage_2000 发表于 2010-6-25 10:49:54

哦~高速用S T C行不?考虑那个编程比较简单,其他的比如AVR我没用过啊。而且我打算输入和输出全为光耦隔离。不过脉冲输出打算用26LS31,抗干扰应该没问题吧?

xiaomage_2000 发表于 2010-6-25 10:53:00

STC的有高速脉冲输出而且速度比较快看老姚的例程能到125K,但我没法给他加进计数程序,而且我这个还要回参考点,所以要有多个速度~所以考虑用定时器来产生脉冲了

master5888 发表于 2010-6-25 11:03:56

STC 12M跑100K输出(应该是定时器200K中断)也很玄的,即时用汇编写中断处理,你算下要占多少周期?
提高时钟,同时降低输出频率,是较可行的方法

xiaomage_2000 发表于 2010-6-25 11:07:28

可以提高时钟啊,现在还在规划中,不知提到24M差不多了吧,在把定时器周期也改为1T?
而且不到100K 也可以,比如80~90K?

xiaomage_2000 发表于 2010-6-25 11:13:11

用汇编每一路也要比较4次,一个CJNE指令就3个COLK,3*3*4=36个,在加上“-1”指令就差不多每路又4个,还有取反,和中断返回,估计一个中断程序要50~60个时钟周期吧

xiaomage_2000 发表于 2010-6-25 11:17:18

我记得有次有人问51同时控制2路步进电机进行插补行吗,有人回答6路都行,不知人家怎么做到的。
而且我这个只是定位,还不用插补,而且单纯靠脉冲输出去控制伺服按理说应该更简单啊,而且我的Z轴可以另外控制,在中断可以先定位完X,Y,在单独去控制Z~这样应该能快点了吧?

tangwei039 发表于 2010-6-25 11:19:24

回复【6楼】xiaomage_2000
-----------------------------------------------------------------------

回复【11楼】xiaomage_2000
可以提高时钟啊,现在还在规划中,不知提到24m差不多了吧,在把定时器周期也改为1t?
而且不到100k 也可以,比如80~90k?
-----------------------------------------------------------------------

你可以在定里反转IO口就行,

SETB P1_0
NOP
NOP
NOP
NOP
NOP
NOP
NOP
CLR P1_0
就可达到100KH

tangwei039 发表于 2010-6-25 11:22:44

我做过,跟你差不多,我是步进电进,但频率没有高,就上那样做的。一直在用。最好用把频率降下了,要不用PWM,硬件最好。

xiaomage_2000 发表于 2010-6-25 11:23:48

这个办法也想过,可是比如我还有回原点的速度比如150HZ的频率在开定时器?而且要变速的起码要有3~4个速度可选,那样的话比如60K,30KZ这样的频率就有些麻烦~

tangwei039 发表于 2010-6-25 11:32:35

回复【16楼】xiaomage_2000
这个办法也想过,可是比如我还有回原点的速度比如150hz的频率在开定时器?而且要变速的起码要有3~4个速度可选,那样的话比如60k,30kz这样的频率就有些麻烦~
-----------------------------------------------------------------------

设置一个标志,unsigned char speed_choose,
             if(speed_choose = 0x01)
               {
                   thH0 =;
                   thL0 =;         60KH
                }
             if(speed_choose = 0x02)
               {
                   thH0 =;
                   thL0 =;          30KH
                }


设置标志进入不同的速度

xiaomage_2000 发表于 2010-6-25 11:36:27

回复【17楼】tangwei039
-----------------------------------------------------------------------

你太强了,我明白了~我先试试,看来实现16个速度也没问题啊~
稳定性应该可以吧?

bbs2009 发表于 2010-6-25 11:37:06

xiaomage_2000 发表于 2010-6-25 11:39:13

对了,我的定时器用方式1问题不大吧?方式2倒是速度快内部程序不占他的频率,不过一个是最低速怕不好实现,还有就是怕中断程序大于了中断时间~

xiaomage_2000 发表于 2010-6-25 11:41:42

回复【19楼】bbs2009
一点建议:
24m 的 stc</a> 80-90k也很玄。 你还要计算各轴的定位数据。 如果是 16bit 的话,也是要费时间的。
如果 是 32bit 的话 就别提了。
从这点考虑最好别用8位机。


-----------------------------------------------------------------------

谢谢您的提议,我想用2个MCU ,一个只负责比较数据,另一个来计算,然后把计算好的数据通过SPI之类的通讯传给他。

tangwei039 发表于 2010-6-25 11:41:50

回复【18楼】xiaomage_2000
-----------------------------------------------------------------------

最好写个速度选择函数,在主程序里少扫描,隔几一些时间去少扫描下,这样,就可以随时选择了。

xiaomage_2000 发表于 2010-6-25 11:44:58

回复【22楼】tangwei039
回复【18楼】xiaomage_2000
-----------------------------------------------------------------------
最好写个速度选择函数,在主程序里少扫描,隔几一些时间去少扫描下,这样,就可以随时选择了。
-----------------------------------------------------------------------

谢谢!反正我的主程序里除了初始化也没什么东西,那就直接用来负责检测速度函数吧~不过机床运动前应该是已经把速度选好了,运动中就不改变了,要不时快,时慢的也对设备不好~呵呵

heky 发表于 2010-6-25 11:45:12

看得真累,是不是只会51单片机?

51+cpld也可以轻松做到
arm也是轻松做到

heky 发表于 2010-6-25 11:46:18

都用到伺服控制器了,索性上一个plc主机+4轴控制模块,这样可靠性好。

xiaomage_2000 发表于 2010-6-25 11:48:39

回复【24楼】heky
看得真累,是不是只会51单片机?
51+cpld也可以轻松做到
arm也是轻松做到

-----------------------------------------------------------------------

是的,目前就会51~呵呵

回复【25楼】heky
都用到伺服控制器了,索性上一个plc主机+4轴控制模块,这样可靠性好。
-----------------------------------------------------------------------

现在的确是这么用的,用的是三菱A系列,已经不出了,而且成本太高
所以我想试试51能控的了吗呵呵

tangwei039 发表于 2010-6-25 11:50:39

回复【23楼】xiaomage_2000
-----------------------------------------------------------------------

我做过和你同样差不多的项目。不知道你用什么方法定位,我是每次开机过让它复位到一位置,然后去选择槽位。我是用汇编写的。总其控制2个步进电机,2个伺服

bbs2009 发表于 2010-6-25 11:51:29

xiaomage_2000 发表于 2010-6-25 12:00:04

回复【27楼】tangwei039
-----------------------------------------------------------------------
看来真的差不多~我就是使用的伺服的位置控制,伺服是松下A4,或安川。开机的确要回原点,不过伺服有编码器输出,可以直接用上他的Z相信号加原点开关来控制回原点。



回复【28楼】bbs2009
-----------------------------------------------------------------------

谢谢28楼的指点,51是自学的之前只会用汇编,C是刚刚学的(入门还不到2周),所以更别提用ARM了呵呵,我是学电气的所以当时上学没学过单片机完全是个人爱好才学的呵呵~PLC到是接触的不少~
不过我会用51后就一直想用51来控制我们公司的机器,所以想试试~
有机会我肯定要转ARM的以后要多多向您学习~

liujing0146 发表于 2010-6-25 16:03:07

我用STC控制4个步进电机,速度只到6.6KHZ,步进电机2细分400脉冲一转,也就是1000RPM。4个电机中有2个速度可以设定到1000RPM。

用1T的型号,22.1184M晶振,我计算了每一条指令的时间,理论上可以跑1500RPM,不过1000RPM电机差不多到极限了,试了多种加速曲线,多种起步速度,1100RPM始终不稳定。

在中断里面控制加减速,贴上中断供参考

/*T1定时值装载*/
void ct1_rewrite()
{
        TH1=(WaitTable/256);    //重置初值
        TL1=(WaitTable%256);
}

/*===================T1中断服务程序,y轴定时输出脉冲=============*/
void timer1Int(void) interrupt 3
{
if( Y_CLK_NOW == 0 )//如果Y轴脉冲没有输出
{
    Y_CLK=1;            //Y轴脉冲输出
    Y_CLK_NOW = 1;
    TH1=0x0ff;       //脉冲宽度初值
    TL1=0xa3;
}
else   //T轴脉冲正在输出
{
    ct1_rewrite();      //重置初值
    Y_CLK=0;            //y轴脉冲下降沿
    Y_CLK_NOW = 0;
    if(Y_CW_CCW_MARK==CW) //判断正反转
      Y_nonce++;          //绝对位置
    else
      Y_nonce--;
    if(up_down_y==UP)      //加速或匀速
    {
      if(now_rate_y)      //加速运行
      {
      now_speed_y++;   //实时速度加一级
      now_rate_y--;      //剩余变速等级减1
      }
      else               //匀速运行
      {
      if(now_mov_y)   //减去加减速脉冲后的匀速脉冲
          now_mov_y--;    //剩余脉冲减1
      else            //匀速结束
          if(manu_y==0)   //manu=0为非手动状态,转减速
            up_down_y=DOWN;   //转减速
      }
    }
    else                  //减速
    {
      if(now_speed_y)    //减速中
      now_speed_y--;   //实时速度减一级
      else               //减速结束
      stop_y=STOP;
      ET1 = 0;         // 关闭T1中断
      TR1 = 0;         // 停止T1
    }
}
}

linearfly 发表于 2010-6-25 21:19:36

回复【楼主位】xiaomage_2000
-----------------------------------------------------------------------

不知道你那个stc的mcu里面有没有可编程计数器,支持高速输出的,可以实现pwm、方波等输出方式。如果有的话,可以考虑这种方式输出,不需要进入中断;同时,采用捕获比较器计数输出的脉冲数,达到目标数产生中断,然后停止高速输出,从而实现输出指定脉冲数。
我知道C8051F340里面有这样的资源,不过我没有这样试过,等有空了,尝试一下。

xiaomage_2000 发表于 2010-6-26 08:59:19

回复【30楼】liujing0146
-----------------------------------------------------------------------

多谢您的指点,我学习了~我是用的STC12C60S2 QFP44封装那个呵呵

回复【31楼】linearfly
-----------------------------------------------------------------------

您的方法真的很新鲜,我看他的资料好像有CPP可以输出PWM个高速脉冲,不过他PWM的确是不需要进中断,但高速脉冲输出需要,郁闷啊
采用捕获比较输出脉冲,这个我要看看,他的捕获好像是上升沿和下降沿捕获,比较还不清楚~研究下呵呵
多谢您的指点!
再次感谢各位帮助我的朋友!!

amazing030 发表于 2010-6-26 12:32:20

必须得mark!
30楼 liujing0146  能否上传稍完整一点的程序,多谢了

liujing0146 发表于 2010-6-26 19:06:01

回复33楼
WaitTable[]速度表用步进、伺服电机加速曲线计算器得出,下载地址:晓奇工作室单片机专栏9
http://www.xiao-qi.com/mcu/

再贴一个驱动函数

/*====================Y轴驱动aim:目标位置 rate:运行速度===========================*/
void Y_drive(uintaim, uchar   rate)
{
uintmov;            //总步数
uint rate_least;    //最低速度
if(aim==Y_nonce)    //如果目标位置与当前位置相同
    return ;
if(aim>Y_nonce)    //如果目标位置大于当前位置
{
    mov=(aim-Y_nonce); //前进总脉冲
    Y_CW_CCW=CW;       //Y轴正转
    Y_CW_CCW_MARK=CW;//标记一下,以便在中断中作当前脉冲加1
}
else                //如果目标位置小于当前位置
{
    mov=(Y_nonce-aim);//后退总脉冲
    Y_CW_CCW=CCW;       //T轴反转
    Y_CW_CCW_MARK=CCW;
}
rate_least=(mov/2-1);//计算最低速度,需要移动的步数全部用于加速与减速时的速度
if(rate_least<=rate)
{
    now_rate_y=rate_least;//剩余加速等级=最低速度
    now_mov_y=0;            //不设匀速脉冲数
}
else
{
    now_rate_y=rate;         //剩余加速等级=设定速度
    now_mov_y=(mov-(rate*2+2));//计算匀速脉冲
}
up_down_y=UP;          //升速运行
ct1_rewrite();         //T1初值装载
stop_y=MOV;            //Y轴运转标志
ET1 = 1;               // 允许T1中断
TR1 = 1;               // 启动T1
}

头文件中
#define UP      0      //加速
#define DOWN    1      //减速

#define CW      0      //顺时针
#define CCW   1      //逆时针

sbit T_CLK=P4^6;
sbit T_CW_CCW=P4^1;
sbit A_CLK=P0^6;
sbit A_CW_CCW=P0^7;
sbit Z_CLK=P0^4;
sbit Z_CW_CCW=P0^5;
sbit Y_CLK=P4^5;
sbit Y_CW_CCW=P4^4;

amazing030 发表于 2010-6-28 08:53:20

回复【34楼】liujing0146
-----------------------------------------------------------------------

多谢了

xiaomage_2000 发表于 2010-6-28 09:28:04

我也要多谢了~!!
没想到我们这这么多用51实现伺服定位的朋友,我做起来更有信心了!

ahuang227 发表于 2010-6-28 09:40:02

不用想了,实现不了的.

xiaomage_2000 发表于 2010-6-28 10:08:10

回复【37楼】ahuang227
-----------------------------------------------------------------------

好大一盆冷水,请楼上朋友细说下原因好吗?

amazing030 发表于 2010-6-28 10:56:53

昨天刚收到一块A3967驱动小板,写了一段测试程序,按键控制加速速,反转,使能。

#include <reg52.h>
#include "step_dat.h"

#define uchar unsigned char
#define uintunsigned int

#define NOKEY                        0x00                        // 无按键
#define SPEED_UP                0xFE                        // 速度加
#define SPEED_DOWN                0xFD                        // 速度减
#define EN_MOTOR                0xFB                        // 电机使能
#define MOTOR_REWORSE        0xF7                        // 电机反转

sbit Motor_CLK = P0^0;                                        // 电机脉冲发生端口
sbit Motor_DIR = P0^1;                                        // 电机方向端口

volatile uintdata SubID;                                // 速度表(定时器初值表)查表指针
volatile uintdata Speed;                                // 当前速度值(定时器初值)

//------------- 延时 ----------------//
void Delay(uchar cnt)
{
        uchar i, j;

        for(i = 0; i < cnt; i++)
        {
                for(j = 0; j < 200; j++);
        }
}

//------------- 初始化定时器 -----------------//
void Init_Timer(void)
{
        EA = 0;
        TMOD = 0x21;
        TH0 = (uchar)(Step_dat >> 8);
        TL0 = (uchar)(Step_dat & 0xFF);
               
        ET0 = 1;
        TR0 = 1;
        EA= 1;
}

//------------ 获取键值 --------------//
uchar Get_Key(void)
{
        uchar val;

        if(P3 != 0xFF)
        {
                Delay(100);
                if(P3 != 0xFF);
                {
                        val = P3;
                        while(P3 != 0xFF);
                        return val;
                }
        }
        P3 = 0xFF;
        return NOKEY;
}

//------------- 按键处理 调度函数 ------------//
void Key_Action(void)
{
        static uinttmp;
        uchar k_dat;

        k_dat = Get_Key();
        switch(k_dat)
        {
                case SPEED_UP:
                        SubID += 50;                        // 加速时查表指针SubID一次加50,对应不同速度档       
                        if(SubID > 1000)
                                SubID = 999;
                        break;
                case SPEED_DOWN:
                        SubID -= 50;                        // 减速时查表指针SubID一次减50,对应不同速度档       
                        if(SubID > 1000)
                                SubID = 0;
                        break;       
                case EN_MOTOR:                               
                        if(ET0)                                        // 若当前运转则停止,通过禁止定时器中断来停止脉冲,电机停止
                        {
                                tmp = SubID;                // 获取当前速度,以在使能电机后恢复
                                SubID = 0;
                                while(Speed);                // 直到电机停止 才关闭定时器               
                                ET0 = 0;
                        }
                        else                                        // 若当前停止则运转,定时器使能,产生脉冲
                        {
                                SubID = tmp;                // 速度恢复
                                ET0 = 1;                        // 定时器使能,电机运转
                        }
                        break;
                case MOTOR_REWORSE:                        // 电机反转,带加减速控制
                        tmp = SubID;                        // 记录当前速度
                        SubID = 0;
                        while(Speed);                        //        直到电机停止 才反转电机方向
                        Motor_DIR = ~Motor_DIR;
                        SubID = tmp;                        // 速度恢复
                        break;
                default:
                        break;
        }
}

void main(void)
{
        SubID = 0;
        Speed = 0;
        Motor_DIR = 1;
        Motor_CLK = 1;

        Init_Timer();
        while(1)
        {
                Key_Action();
                Delay(250);
                Delay(250);
        }
}

void ISR_TIME0(void)        interrupt 1
{
        ET0 = 0;

        if (Speed < SubID)                    // 速度加
                  Speed++;
        else if(Speed > SubID)                // 速度减
        {
                  if (Speed)
                  Speed--;
        }
        TH0 = (uchar)(Step_dat >> 8);                // 重装定时器初值
        TL0 = (uchar)(Step_dat & 0xFF);

        Motor_CLK = ~Motor_CLK;                                                // 产生脉冲 加注释时才发现Speed其实是要除2比较的
        ET0 = 1;
}

加注释时发现两个问题,因之前只是随便写了个代码看转不转。一个是Speed比较时要除2,这样才有一个完整的脉冲。一个是
                case MOTOR_REWORSE:                        // 电机反转,带加减速控制
                        tmp = SubID;                        // 记录当前速度
                        SubID = 0;
                        while(Speed);                        //        直到电机停止 才反转电机方向
                        Motor_DIR = ~Motor_DIR;
                        SubID = tmp;                        // 速度恢复
                        break;
while(Speed);这里如果当前电机停止ET0 = 0,而Speed != 0(如按了加减速),就会死在这里。改也简单,使能定时器就可以了

amazing030 发表于 2010-6-28 10:58:50

速度值表,这个有点大。。。。


#ifndef _STEP_DAT_H
#define _STEP_DAT_H

unsigned int code Step_dat[]=
{
        41748,41946,42143,42339,42534,42728,42921,43113,43304,43494,43683,43871,44058,44244,44429,44613,44796,44978,45159,45339,
        45518,45696,45873,46049,46224,46398,46571,46743,46914,47084,47253,47421,47588,47754,47919,48083,48246,48408,48569,48729,
        48888,49046,49203,49359,49514,49668,49821,49973,50124,50274,50423,50571,50718,50864,51009,51153,51296,51438,51579,51719,
        51858,51996,52133,52269,52404,52538,52671,52803,52934,53064,53193,53321,53448,53574,53699,53823,53946,54068,54189,54309,
        54428,54546,54663,54779,54894,55008,55121,55233,55344,55454,55563,55671,55778,55884,55989,56093,56196,56298,56399,56499,
        56598,56696,56793,56889,56984,57078,57171,57263,57354,57444,57533,57621,57708,57794,57879,57963,58046,58128,58209,58289,
        58368,58446,58523,58599,58674,58748,58821,58893,58964,59034,59103,59171,59238,59304,59369,59433,59496,59558,59619,59679,
        59738,59796,59853,59909,59964,60018,60071,60123,60174,60224,60273,60321,60368,60414,60459,60503,60546,60588,60629,60669,
        60708,60746,60783,60819,60854,60888,60921,60953,60984,61014,61043,61071,61098,61124,61149,61173,61196,61218,61239,61259,
        61278,61296,61313,61329,61344,61358,61371,61383,61394,61404,61413,61421,61428,61434,61439,61443,61446,61448,61449,61449,
        61475,61499,61524,61549,61574,61599,61624,61649,61674,61699,61724,61747,61771,61795,61819,61843,61867,61891,61915,61939,
        61963,61985,62008,62031,62054,62077,62100,62123,62146,62169,62192,62213,62235,62257,62279,62301,62323,62345,62367,62389,
        62411,62431,62452,62473,62494,62515,62536,62557,62578,62599,62620,62639,62659,62679,62699,62719,62739,62759,62779,62799,
        62819,62837,62856,62875,62894,62913,62932,62951,62970,62989,63008,63025,63043,63061,63079,63097,63115,63133,63151,63169,
        63187,63203,63220,63237,63254,63271,63288,63305,63322,63339,63356,63371,63387,63403,63419,63435,63451,63467,63483,63499,
        63515,63529,63544,63559,63574,63589,63604,63619,63634,63649,63664,63677,63691,63705,63719,63733,63747,63761,63775,63789,
        63803,63815,63828,63841,63854,63867,63880,63893,63906,63919,63932,63943,63955,63967,63979,63991,64003,64015,64027,64039,
        64051,64061,64072,64083,64094,64105,64116,64127,64138,64149,64160,64169,64179,64189,64199,64209,64219,64229,64239,64249,
        64259,64267,64276,64285,64294,64303,64312,64321,64330,64339,64348,64355,64363,64371,64379,64387,64395,64403,64411,64419,
        64427,64433,64440,64447,64454,64461,64468,64475,64482,64489,64496,64501,64507,64513,64519,64525,64531,64537,64543,64549,
        64555,64559,64564,64569,64574,64579,64584,64589,64594,64599,64604,64607,64611,64615,64619,64623,64627,64631,64635,64639,
        64643,64645,64648,64651,64654,64657,64660,64663,64666,64669,64672,64673,64675,64677,64679,64681,64683,64685,64687,64689,
        64691,64691,64692,64693,64694,64695,64696,64697,64698,64699,64700,64699,64699,64699,64699,64699,64699,64699,64699,64699,
        64770,64775,64780,64785,64790,64794,64799,64804,64808,64812,64817,64821,64825,64829,64834,64838,64842,64846,64849,64853,
        64857,64861,64864,64868,64871,64875,64878,64882,64885,64888,64892,64895,64898,64901,64904,64907,64910,64913,64916,64919,
        64922,64925,64928,64931,64933,64936,64939,64941,64944,64946,64949,64951,64954,64956,64959,64961,64964,64966,64968,64971,
        64973,64975,64977,64979,64982,64984,64986,64988,64990,64992,64994,64996,64998,65000,65002,65004,65006,65008,65009,65011,
        65013,65015,65017,65018,65020,65022,65024,65025,65027,65029,65030,65032,65034,65035,65037,65038,65040,65041,65043,65044,
        65046,65047,65049,65050,65052,65053,65055,65056,65057,65059,65060,65062,65063,65064,65065,65067,65068,65069,65071,65072,
        65073,65074,65076,65077,65078,65079,65080,65082,65083,65084,65085,65086,65087,65088,65090,65091,65092,65093,65094,65095,
        65096,65097,65098,65099,65100,65101,65102,65103,65104,65105,65106,65107,65108,65109,65110,65111,65112,65113,65114,65115,
        65115,65116,65117,65118,65119,65120,65121,65122,65122,65123,65124,65125,65126,65127,65127,65128,65129,65130,65131,65131,
        65132,65133,65134,65134,65135,65136,65137,65137,65138,65139,65140,65140,65141,65142,65142,65143,65144,65144,65145,65146,
        65147,65147,65148,65149,65149,65150,65151,65151,65152,65152,65153,65154,65154,65155,65156,65156,65157,65157,65158,65159,
        65159,65160,65160,65161,65161,65162,65163,65163,65164,65164,65165,65165,65166,65167,65167,65168,65168,65169,65169,65170,
        65170,65171,65171,65172,65172,65173,65173,65174,65174,65175,65175,65176,65176,65177,65177,65178,65178,65179,65179,65180,
        65180,65180,65181,65181,65182,65182,65183,65183,65184,65184,65185,65185,65185,65186,65186,65187,65187,65187,65188,65188,
        65189,65189,65190,65190,65190,65191,65191,65192,65192,65192,65193,65193,65193,65194,65194,65195,65195,65195,65196,65196,
        65196,65197,65197,65198,65198,65198,65199,65199,65199,65200,65200,65200,65201,65201,65201,65202,65202,65202,65203,65203,
        65203,65204,65204,65204,65205,65205,65205,65206,65206,65206,65207,65207,65207,65208,65208,65208,65209,65209,65209,65209,
        65210,65210,65210,65211,65211,65211,65211,65212,65212,65212,65213,65213,65213,65213,65214,65214,65214,65215,65215,65215,
        65215,65216,65216,65216,65216,65217,65217,65217,65217,65218,65218,65218,65218,65219,65219,65219,65219,65220,65220,65220,
        65220,65221,65221,65221,65221,65222,65222,65222,65222,65223,65223,65223,65223,65224,65224,65224,65224,65224,65225,65225,
        65225,65225,65226,65226,65226,65226,65226,65227,65227,65227,65227,65227,65228,65228,65228,65228,65228,65229,65229,65229,
        65229,65229,65230,65230,65230,65230,65230,65231,65231,65231,65231,65231,65232,65232,65232,65232,65232,65233,65233,65233,
        65233,65233,65233,65234,65234,65234,65234,65234,65235,65235,65235,65235,65235,65235,65236,65236,65236,65236,65236,65236,
        65237,65237,65237,65237,65237,65237,65238,65238,65238,65238,65238,65238,65239,65239,65239,65239,65239,65239,65240,65240,
        65240,65240,65240,65240,65240,65241,65241,65241,65241,65241,65241,65241,65242,65242,65242,65242,65242,65242,65242,65243,
        65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,
        65263,65264,65265,65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65277,65278,65279,65279,65279,65280
};

#endif

xiaomage_2000 发表于 2010-6-28 11:10:46

支持~我还没有规划好呢,所以还没有制板子实验~如果弄好了一定要吧源码发上来答谢各位!

qd118118 发表于 2010-6-28 18:42:27

MARK

wwxx001 发表于 2010-6-29 10:37:54

如果在带上加减速,只控制一个电机,程序结构设计的好点,速度还能跟得上,三个电机,这么快的频率,用单片机实现不太可能。

xiaomage_2000 发表于 2010-6-29 13:42:56

哦~那我一个芯片单独控制一个轴的话怎么样?如果3个轴不是同时运动,比如我要先运行XY,定位完在单独控制Z轴用一个芯片可以吗?麻烦楼上的各位朋友指点下~

amazing030 发表于 2010-6-29 15:17:30

一个芯片就行了,做3轴驱动应该也没问题

我用的51芯片,48M晶振,也能两轴驱动,用的是LCD里高粱米直线的方法。而且步进电机驱动还很麻烦,不是发脉冲,而是一次控制走一步,细分都是自己做。要是用3967之类的更简单,驱动速度也更快
3个的话试试立体空间画直线的算法

zjj2010 发表于 2010-6-29 23:52:41

记号

xiaomage_2000 发表于 2010-6-30 09:50:08

回复【45楼】amazing030
-----------------------------------------------------------------------

多谢您的答复~我其实主要还是2个轴的驱动,另外一个是在这两个轴定位完成后在去运动

wwxx001 发表于 2010-7-1 09:31:37

回复【45楼】amazing030
一个芯片就行了,做3轴驱动应该也没问题
我用的51芯片,48m晶振,也能两轴驱动,用的是lcd里高粱米直线的方法。而且步进电机驱动还很麻烦,不是发脉冲,而是一次控制走一步,细分都是自己做。要是用3967之类的更简单,驱动速度也更快
3个的话试试立体空间画直线的算法
-----------------------------------------------------------------------

   主要还是要看输出脉冲的频率,对步进电机,输出频率比较低,应该没有问题。而对于高频脉冲控制,肯定会有局限。

xiaomage_2000 发表于 2010-7-1 09:35:52

恩,明白了~我会搞好的~
不过感觉KEIL 软件编辑出来的程序好像都够繁琐的,也许我刚学会C还不会用吧,还没我自己写的汇编简洁,所以打算还是用汇编操作了~

fhm12351 发表于 2010-10-13 17:06:03

我也真正弄这个。。。顶起哈!!!!

liangwh311 发表于 2010-10-13 20:56:12

单用一个单片机有点勉强,加个CPLD实现起来比较简单点.

wangguanfu 发表于 2010-10-13 22:16:54

换个好点点MCU吧,10来RMB的STM32,做起来实在方便的多

xiaomage_2000 发表于 2010-10-15 09:28:50

回复【52楼】wangguanfu
换个好点点mcu吧,10来rmb的stm32,做起来实在方便的多
-----------------------------------------------------------------------

呵呵,是啊~现在开始学STM32了,买的正点原子的开发板~~

ct_dev 发表于 2010-10-15 11:09:59

回复【53楼】xiaomage_2000
回复【52楼】wangguanfu
换个好点点mcu吧,10来rmb的stm32,做起来实在方便的多
-----------------------------------------------------------------------
呵呵,是啊~现在开始学stm32了,买的正点原子的开发板~~
-----------------------------------------------------------------------

有单片机经验了买核心板就可以了,这样更方便动手,也更实用.

NJ8888 发表于 2010-10-15 12:15:01

带机械的,机械成本比MCU贵多了,应当换CORTEX

xiaomage_2000 发表于 2010-10-15 16:13:10

没听过CORTEX 啊~惭愧,51是纯属个人爱好,开始学着玩的,后来想用51做点东西发现,复杂的地方有些吃力,这不就打算学点更高级点的芯片呵呵

licheng0620 发表于 2011-1-17 15:11:33

xiaomage_2000
--------------------------------
请问下位置控制方式下,脉冲宽度有要求吗?为什么我的伺服电机转不起来

xiaomage_2000 发表于 2011-1-17 15:21:57

这个贴过去好久了呵呵,脉冲宽度不同的伺服可能规定不同,我看了下松下的伺服如果是光耦输入最大200Kpps而差分输入是500Kpps。你控制方式选择位置控制后,还应该有相应的参数设置吧?另外伺服ON信号给了没有,有没有外部限位,参数设置的外部限位有效吗?另外还有一点像松下这种有2路输入信号的,还有个参数进行选择。而且你的接线对了吗?你最好把问题讲明白。

licheng0620 发表于 2011-1-17 21:40:36

xiaomage_2000
---------------------
谢谢你的回复
现在情况是一旦给伺服电机驱动器脉冲信号,电机就狂转大概10秒左右,然后停止了,提示过载报警;
控制方式:位置控制;
使伺服使能(SON) ON,RUN指示灯点亮;
脉冲输入方式:指令脉冲+符号方式;
输入的脉冲频率大概只有1~2kHz,(我怀疑是不是太低了,本应转的慢才对啊)没有外部限位,其他参数都查过了没错;
本人QQ:120454226 欢迎指教
http://cache.amobbs.com/bbs_upload782111/files_35/ourdev_611715GNY0PP.jpg
(原文件名:未命名.jpg)

xiaomage_2000 发表于 2011-1-20 11:43:16

你首先要吧伺服电机从你设备上先拿下来,然后在试,另外我感觉你这个有点像伺服电机接错线了,一定要确认好UVW三相不能错!!!伺服电机如果反转是靠参数,或你的脉冲信号符号来调的,不是调相序的这点一定注意!!!
另外要看看电子齿轮分频比。先调到1:1

28571840 发表于 2011-9-15 16:02:44

楼主你好!你的单片机是怎么与伺服放大器进行接线的啊?能教我一下吧!

yanghai-M 发表于 2011-9-15 23:28:59

使用单片机控制三轴关键是加减速算法会占用大量的MCU的负担,而且很难做好,建议用专用芯片来做
http://cache.amobbs.com/bbs_upload782111/files_45/ourdev_676750MFXOI1.jpg
(原文件名:截图01.jpg)

点击此处下载 ourdev_676751HW1BS6.pdf(文件大小:2.76M) (原文件名:3轴控制芯片SD,SPI 输出 .pdf)
点击此处下载 ourdev_676752EA4EEG.pdf(文件大小:781K) (原文件名:TMCM-342_manual.pdf)

MCU678 发表于 2011-9-16 02:30:30

MARK

yuyanlzh 发表于 2011-9-16 08:29:23

请问LZ,伺服额定转速3000,改变电子齿轮可以变成1500吗?

nicksean 发表于 2011-9-16 09:27:43

mark

28571840 发表于 2011-9-23 15:18:27

有谁知道单片机与伺服放大器怎么接线啊?感激不尽

xiaomage_2000 发表于 2011-9-23 15:34:34

回复【65楼】yuyanlzh
请问lz,伺服额定转速3000,改变电子齿轮可以变成1500吗?
-----------------------------------------------------------------------
这个首先要看你的控制方式,如果是位置(脉冲)控制的话,改变电子齿轮可以改,伺服电机的转速,不过实际控制伺服电机的速度并不是你频繁的去修改电子齿轮,而是你调节脉冲的频率,如果电子齿轮一定的情况下,脉冲的个数正比于电机的角度,脉冲的频率正比于电机的速度。也就是说你发的脉冲频率越高,转速就越快。

回复【67楼】28571840老实人
有谁知道单片机与伺服放大器怎么接线啊?感激不尽
-----------------------------------------------------------------------
中间加个高速光耦隔离下就可以了。

xiaomage_2000 发表于 2011-9-23 15:35:49

回复【67楼】28571840老实人
有谁知道单片机与伺服放大器怎么接线啊?感激不尽
-----------------------------------------------------------------------
59楼那个图就可以啊

wwqq 发表于 2011-10-24 14:13:01

楼主做好了吗?传个源码拜读下吧,
如果不方便就qq吧

xiaomage_2000 发表于 2011-10-28 13:25:36

没有在搞这块,最近光忙工作上的事了。。
另外在学STM32,感觉用STM32的话应该没什么问题了

dinglei618 发表于 2011-10-31 14:21:34

鼓励鼓励,顶一个。运动控制这一块,起码要32位机比较正宗一些,一定要低成本,当然可以用51,毕竟使用场合可能不同,不过就

不要强调速度了,稳定性能好一点,客户就会认可。

combug 发表于 2012-3-25 20:56:59

mark 8位机太勉强了,尤其还是高速脉冲

ylei12 发表于 2012-5-2 19:46:20

最近正想研究,马克了

schlang 发表于 2012-6-7 13:57:20

啊,如何学多轴控制啊?

lm4766 发表于 2012-8-17 23:59:49

记号学习

hegang123 发表于 2012-8-18 00:25:00

yngufeng 发表于 2012-8-18 01:35:06

百度或者谷歌这两个关键词:最小偏差法插补、梯形加减速 大把现成的资料参考
51做不到100K的速度,算不过来。STM32可以实现。

lwg998 发表于 2012-8-19 10:09:06

楼上的兄弟,能共享一下你那个#include "step_dat.h" 想学习一下

licheng0620 发表于 2012-8-28 12:44:02

我的问题解决了。
单片机发出的方波接到信号处理IC(控制伺服专用的,型号忘了),转换成差分信号,再接伺服电机信号输入端就OK了
页: [1]
查看完整版本: 想用51单片机发脉冲采用位置控制方式,同时控制3台伺服驱动的定位~大家能有什么好方法