搜索
bottom↓
回复: 12

ULN2803控制步进电机疑问?

[复制链接]

出0入0汤圆

发表于 2010-10-22 18:33:34 | 显示全部楼层 |阅读模式
今天看见有人用MCU的硬2路PWM+2803控制6线4相步进电机,接法是把4相接成2相,竟然可以走出45°出来,这样也能细分么?要是可以的话拍数该如何走,望指教!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2010-10-22 22:24:31 | 显示全部楼层
6线4相电机也和2相步进电机的接法相同。
至于拍数您可以直接选择现成的驱动芯片。
你如果想控制多个电机的话给您个建议 TMC428+TMC246来实现
点击此处下载 ourdev_591996D9P20J.rar(文件大小:677K) (原文件名:TMC428 Technical Information.rar)
点击此处下载 ourdev_591997F006OT.rar(文件大小:610K) (原文件名:TMC246 technical information.rar)

(原文件名:3.gif)

出0入0汤圆

发表于 2010-10-22 22:33:08 | 显示全部楼层
看这个

点击此处下载 ourdev_592002S8ZI88.pdf(文件大小:113K) (原文件名:M-508U原理图V1.3.pdf)
点击此处下载 ourdev_592003VRHHXO.rar(文件大小:26K) (原文件名:43__MPC82G516芯片硬PWM细分控制步进电机.rar)

  www.mcswe.com
  2009.05

  2路PWM 驱动单极性步进电机 演示程序   82G516专用,其它的请自消化!

  目的让大家了解细分后步进电机运行的效果(特别是低速时)
  
  用两路PWM接ULN2803来驱动单极性6线/5线的步进电机,另两路通过一反相连接

  如要求不太高的,一般可以满足,只是在PWM的每个像限的初始时,
  会一快一慢(极底速时才能发觉),这是电流不均匀所产生的 .

  这只是一个简单的示例,让大家了解PWM的巧妙用法,实际工程中是要加入一些相关的算法的,如加、减速;调速、定位、扭矩等等。
  请自行消化!此方面不提供技术支持的。

  用的是带硬8位PWM的MCU(可以是MPC82G516、MPC82E54、STC12C5410等)
  用前先初始化,PWM频率为46.71KHz左右,24M晶体)

  此演示程序硬件配置:M-508U开发板的J1需外接入9V 电源,单片用MPC82G516, 晶振12M(24M也可以,速度不同)
  运行现像: J35接的 X电机转到90度后再反转
             J34接的 Y电机一直转
                         J33接的 X电机转一周后,再反转
                         此处用细分驱动步进电机,51200个脉冲为一周
*/


#include <MPC82G516.h>        //头文件

#define  uchar unsigned char  //宏定议,方便书写
#define  uint  unsigned int   //宏定议,方便书写



//[82G516 MCU]
#define pwm6  CCAP0H   //82G516内部PWM 寄存器
#define pwm5  CCAP1H
#define pwm4  CCAP2H
#define pwm3  CCAP3H
#define pwm2  CCAP4H
#define pwm1  CCAP5H

uchar   MAXSP,cnt;
uchar   x_task, y_task, z_task;                  //电机工作装态
uint    x_step, y_step, z_step;           //步数
bit     x_dir, y_dir, z_dir, s;                  //方向标记

//MPC82G516 内部硬PWM初始化,使之有效!
//---------------------------------------------
void  Init_pwm(void)
{
    CMOD     =        0x02;                                //
        CCAPM0        =        0x42;                                //Configure PCA Module0 to PWM
        CCAPM1        =        0x42;                                //Configure PCA Module1 to PWM
        CCAPM2        =        0x42;                                //Configure PCA Module2 to PWM
        CCAPM3        =        0x42;                                //Configure PCA Module3 to PWM
        CCAPM4        =        0x42;                                //Configure PCA Module4 to PWM(Only for MPC82G516)
        CCAPM5        =        0x42;                                //Configure PCA Module5 to PWM(Only for MPC82G516)
    CR       =  1;                  //start PCA Timer  
}
//----------------------------------------------
void Init_time(void)
{
  TMOD = 0x11;       // 11  T1 & T0 16位定时   
  TR0=1;
  ET0=1;             //T0中断开      
//  TR1=1;  
//  ET1=1;
  EA=1;              //开总中断
}

//-----------------------------------------------
void main(void)
{
   x_step=0;
   Init_pwm();    //硬PWM初始化
   Init_time();   //定时器初始化
   s=1;


        while(1)
        {
        MAXSP=10;   //最大速度[可改为可调, 此处为3个电机同时调速,也可改为单独调速;  但时此种控多用改变细分来进行调速!]

        }
}

//-------------定时0--------------------
void Time0_isr (void) interrupt 1
{
   TH0 = 0xff; //
   TL0 = 0xe0;
      

  if(s)
         {
      if(++cnt>=MAXSP)
      {
       cnt=0;
        //如要改变方向,x_task++改为x_task--即可;此改为:if(x_task==0xff)x_task=3;  //注:此程序本人用来测试电机用的,力度也很大,一般场合也够用!

       if(x_dir)
       {
        if(x_task>3) x_task=0;
            switch(x_task)
         {
            case 0: if(++pwm1==255){x_task++;}    pwm2=0;   break; //像限1区
            case 1: if(++pwm2==255){x_task++;}    pwm1=255; break; //....2
            case 2: if(--pwm1==0)  {x_task++;}    pwm2=255; break; //....3
            case 3: if(--pwm2==0)  {x_task++;}    pwm1=0;   break; //....4
            default:   x_task=0; break;
         }
       }
                 else
                 {
        if(x_task==0xff)x_task=3;
                  switch(x_task)
        {
          case 0: if(++pwm2==255){x_task++;}    pwm1=0;   break; //像限1区
          case 1: if(++pwm1==255){x_task++;}    pwm2=255; break; //....2
          case 2: if(--pwm2==0)  {x_task++;}    pwm1=255; break; //....3
          case 3: if(--pwm1==0)  {x_task++;}    pwm2=0;   break; //....4
          default:   x_task=0; break;
        }
           }

       if(++x_step==51200) {x_dir=!x_dir; x_step=0;}  //X电机转到一周后,再反转        (51200个脉冲为一周, 1.8度的39BYG系步进电机)

                //  -------------------------------------------------------------------Y 步进电机一直转
        if(y_task>3) y_task=0;         
            switch(y_task)
         {
            case 0: if(++pwm3==255){y_task++;}    pwm4=0;   break; //像限1区
            case 1: if(++pwm4==255){y_task++;}    pwm3=255; break; //....2
            case 2: if(--pwm3==0)  {y_task++;}    pwm4=255; break; //....3
            case 3: if(--pwm4==0)  {y_task++;}    pwm3=0;   break; //....4
            default:   y_task=0; break;
         }

                // ------------------------------------------------------------------- Z 步进电机 转90度再反转回去
           if(z_dir)
       {
        if(z_task>3) z_task=0;
             switch(z_task)
          {
            case 0: if(++pwm5==255){z_task++;}    pwm6=0;   break; //像限1区
            case 1: if(++pwm6==255){z_task++;}    pwm5=255; break; //....2
            case 2: if(--pwm5==0)  {z_task++;}    pwm6=255; break; //....3
            case 3: if(--pwm6==0)  {z_task++;}    pwm5=0;   break; //....4
            default:   z_task=0; break;
          }
       }
           else
          {
        if(z_task==0xff) z_task=3;
                  switch(z_task)
        {
          case 0: if(++pwm6==255){z_task++;}    pwm5=0;   break; //像限1区
          case 1: if(++pwm5==255){z_task++;}    pwm6=255; break; //....2
          case 2: if(--pwm6==0)  {z_task++;}    pwm5=255; break; //....3
          case 3: if(--pwm5==0)  {z_task++;}    pwm6=0;   break; //....4
          default:   z_task=0; break;
        }
          }

          if(++z_step==12800) {z_dir=!z_dir; z_step=0;}
     }
     }
}

出0入0汤圆

 楼主| 发表于 2010-10-22 23:08:06 | 显示全部楼层
谢谢 AASUN 楼梯
我看看先

出0入0汤圆

 楼主| 发表于 2010-10-22 23:13:13 | 显示全部楼层
楼上大哥  我也是这样弄 可是不可以生成微步 走一步下来还是7.2°

出0入0汤圆

发表于 2010-10-22 23:20:15 | 显示全部楼层
你试下把Z轴的步进电机 z_step=12800这句改为3200或800,你就看到正反转的解度变小了

出0入0汤圆

 楼主| 发表于 2010-10-22 23:44:17 | 显示全部楼层
晕哦,我一直范了一个大错误,计数放在循环里面了,弄成循环8次才计数一次,明天试试实际效果,有劳了 AASUN 楼梯

出0入0汤圆

 楼主| 发表于 2010-10-23 18:11:49 | 显示全部楼层
if(z_task==0xff) z_task=3; 这句是啥意思,z_task最多是3,怎么来了一个0xff

出0入0汤圆

发表于 2010-10-23 18:23:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-11-18 18:41:07 | 显示全部楼层
记号

出0入0汤圆

发表于 2014-3-25 12:31:26 | 显示全部楼层
           mark

出0入0汤圆

发表于 2014-10-9 11:42:36 | 显示全部楼层
         MARK

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 01:17

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

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