打印

挖个坑--歩进电机深入控制----几时心爽几时填

[复制链接]
楼主: jrcsh
手机看帖
扫描二维码
随时随地手机跟帖
61
jrcsh|  楼主 | 2013-2-20 23:54 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
关于无刷冷起动定位的方法

  可以双向加电,比较出泻后的不同,定位出,哪个极考哪个线圈近些。

使用特权

评论回复
62
jrcsh|  楼主 | 2013-2-21 00:07 | 只看该作者


6:30

使用特权

评论回复
63
一个初学者| | 2013-2-21 09:31 | 只看该作者
留个脚印。多谢楼主了!

使用特权

评论回复
64
28182900| | 2013-2-21 09:49 | 只看该作者
顶顶更健康

使用特权

评论回复
65
仙人球W| | 2013-2-21 10:04 | 只看该作者
jrcsh 发表于 2012-3-31 23:56
提醒 有缘人:

步进驱动控制上,在软件上给信号也要进行锁环处理,

LZ何为锁环,,,能给出历程代码不  呵呵 (PS我是菜鸟)

使用特权

评论回复
66
jrcsh|  楼主 | 2013-2-25 09:09 | 只看该作者
仙人球W 发表于 2013-2-21 10:04
LZ何为锁环,,,能给出历程代码不  呵呵 (PS我是菜鸟)

   也就一个变量,

使用特权

评论回复
67
ayl439| | 2013-4-29 10:43 | 只看该作者
学习!

使用特权

评论回复
68
jrcsh|  楼主 | 2013-5-8 01:16 | 只看该作者

使用特权

评论回复
69
jjeemm77| | 2013-5-8 08:56 | 只看该作者
下载资料呀!…

使用特权

评论回复
70
zeal2012| | 2013-5-8 14:49 | 只看该作者
好东西,要学习

使用特权

评论回复
71
andyding| | 2013-5-8 16:40 | 只看该作者
有专门的PWM 控制的步进电机驱动芯片,20-30块,可以细分很多步的,无需再考虑节拍啦!

使用特权

评论回复
72
yghanwuji| | 2013-5-9 17:38 | 只看该作者
谢谢分享,学习了

使用特权

评论回复
73
jrcsh|  楼主 | 2013-8-19 22:32 | 只看该作者
本帖最后由 jrcsh 于 2013-8-26 02:37 编辑

示例代码 :  8拍(也叫 2拍半)   加速起动过程

(BJ系例(28BJ,35BJ......), 2相5线步进电机)

/******************************************************************
/*                                                                *
/* KT900单片机开发系统演示程序 - 步进电机控制程序                 *
/*                                                                *
/* 步进电机启动时,转速由慢到快逐步加速。                         *
/*                                                                *
/* 邮箱: 89s51@163.com                                           *
/* 网站: http://www.150000.com                                   *
/* 作者: 007                                                     *
/* 时间: 2006/05/18                                              *
/*                                                                *
/*【版权】COPYRIGHT(C)南方电子 www.150000.com ALL RIGHTS RESERVED *
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!      *
/*                                                                *
/******************************************************************/
   
#include <reg51.h>       //51芯片管脚定义头文件
#include <intrins.h>         //内部包含延时函数 _nop_();

#define uchar unsigned char
#define uint  unsigned int

uchar code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
//uchar code REV[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};
uchar rate ;        
/********************************************************/
/*                                                  
/* 延时
/* 11.0592MHz时钟,                                    
/*                                                      
/********************************************************/
void delay()
{                           
   uchar k,t;
   k = rate;
   t = 0x00;

   do{
       do{ _nop_();_nop_();_nop_();_nop_();
                 _nop_();_nop_();_nop_();_nop_();
             }while(--t);
               
     }while(--k);
}
/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void  motor_ffw()
{
   uchar i;

      for (i=0; i<8; i++)     //一个周期转30度
        {
          P1 = FFW;        //取数据
          delay();            //调节转速
        }
}

/********************************************************
*                                                      
*  主程序                                               
*                                                      
*********************************************************/

main()
{     
   rate = 0x10;
   while(1)                     
    {  
     motor_ffw();          //电机正转
           if(rate>2)
           rate--;      
    }
}

/********************************************************/                           

使用特权

评论回复
74
wuzx-61| | 2013-8-24 23:00 | 只看该作者
学习.

使用特权

评论回复
75
jrcsh|  楼主 | 2013-8-26 02:30 | 只看该作者
http://blog.163.com/anzhongxin888@126/blog/static/20942137200811238431580/

原贴出处


双极性四线步进电机驱动
2008-12-23 20:43:01|  分类: 模拟电子

我们常用的步进电机 分为单极性和双极性之分,今天 介绍 一下双极性四线步进电机驱动,这个步进电机我是从打印机中拆下来的,板子上用的驱动芯片是LB11847,带细分的驱动器。

      一般双极性四线步进电机线序是 A  B  A/  B/, 其中A 与A/是 一个线圈,B和B/是一个线圈,一般这种驱动需要的是H桥电路,这里就不必介绍H桥了。

     下面介绍一下H双极性四线步进电机驱动相序:

1.单相四拍通电驱动时序

    正转: A/  B  A  B/

    反转: B/  A  B  A/

2.双相通电四拍驱动时序

    正转:A/B   AB   AB/  A/B/

    反转:A/B/  AB/  AB   A/B

3.半步八拍驱动时序

    正转:A/  A/B  B  AB  A  AB/  B/  A/B/

    反转:A/B/  B/  AB/  A  AB  B  A/B  A/




下面给出我(原作者)的一个驱动程序:是对步进脚进行4细分,双线圈导通驱动。

/*
LB11847 步进电机驱动
*/
#include <pic.h>

//代表输出电流值
//分别代表
// 17.39% 26.08% 34.78% 43.48% 52.17% 60.87% 69.56% 73.91% 78.26% 82.61% 86.95% 91.30% 95.65% 100%
//对应端口
// IB4 IB3 IB2 IB1 IA4 IA3 IA2 IA1
// RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
const unsigned char TableA[] = {0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x0F,0x0F,0x0f,0x0f,0x0f,0x0f};// 电流输出值对应
const unsigned char TableB[] = {0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90,0xA0,0xB0,0xC0,0xD0,0xE0,0xF0,0xF0,0xF0,0xf0,0xf0,0xf0,0xf0};
// 正转反转时许设定
// 1.单相通电
// 正转时序
// A/ B A B/
// 反转时序
// B/ A B A/
// 2.两相通电
// 正转时序
// A/B AB AB/ A/B/
// 反转时序
// A/B/ AB/ AB A/B
// 3.半步方式
// 正转时序
// A/ A/B B AB A AB/ B/ A/B/
// 反转时序
// A/B/ B/ AB/ A AB B A/B A/
// 步进电机对应
// 从带蓝边开始 依次 A B A/ B/
// 操作时序
// PHASE    ENABLE   OUTAorB    OUTA/orB/
// H        L        H          L
// L        L        L          H
// -        H        OFF        OFF
const unsigned char PositiveTable[]={0x08,0x06,0x09,0x02};  // 正转时序
const unsigned char ReverseTable[]={0x02,0x09,0x06,0x08};   // 反响时序

const unsigned char PositiveTable1[]={0x04,0x05,0x01,0x00};  // 正转时序
const unsigned char ReverseTable1[]={0x00,0x01,0x05,0x04};   // 反响时序

const unsigned char PositiveTable2[] ={0x08,0x04,0x06,0x05,0x09,0x01,0x02,0x00};   // 8拍正转时序            
const unsigned char ReverseTable2[]={0x00,0x02,0x01,0x09,0x05,0x06,0x04,0x08};
#define Timer1_Int  0xFF80   // 定时器1初始化值

const unsigned char PositiveTable3[]={0x08,0x06,0x09,0x02};  // 正转时序

#define PHASEA      RC0      // 输出管脚使能
#define ENABLEA     RC1
#define PHASEB      RC2
#define ENABLEB     RC3

unsigned char Point_CurrentA;    // A相电流输出指针
unsigned char Point_CurrentB;    // B相电流输出指针

unsigned char Point_Running;     // 转动指针

unsigned char Delay_Counter;     // 延时计数器
unsigned int  Timer_Add;

unsigned char Add_Pluse;

volatile bit  A_Add;
volatile bit  A_Plus;
volatile bit  B_Add;
volatile bit  B_Plus;  
  
volatile bit Positive_Reverse_Flage; // 正反标志
volatile bit Positive_ReverseA;
volatile bit Positive_ReverseB;

//#define A_Add  1        // A相电流加操作
//#define A_Pluse 2       // A相电流减操作
//#define B_Add  3        // B相电流加操作
//#define B_Pluse 4       // B相电流减操作


void Pic_Int();

void delay(unsigned int asd)
{
  unsigned int i;
  for(i=0;i<asd;i++)
  {}
}   
//*****************************************
//中断函数
//*****************************************
void interrupt SDI()
{
  if(TMR1IF)     // 定时器中断
  {
    TMR1IF = 0;  
    if(Timer_Add<0xFF60)
    {
      //Timer_Add++;
    }
    TMR1H = (unsigned char)(Timer_Add>>4);     // 定时器计时初始化
    TMR1L = (unsigned char)(Timer_Add&0x00ff);
   
    Delay_Counter++;
    if(Delay_Counter>=1);
    {
      Delay_Counter = 0;

      PORTC = PositiveTable[Point_Running];    // 正转时序
      PORTB = (unsigned char)((TableA[Point_CurrentA])|(TableB[Point_CurrentB]));
      if(A_Add)
      {
        Point_CurrentA+=4;
      }

      if(A_Plus)
      {
        Point_CurrentA-=4;
      }

      if(B_Plus)
      {
        Point_CurrentB-=4;   
      }
      if(B_Add)
      {
        Point_CurrentB+=4;
      }
      //Point_Running++;
      if(A_Add)   
      {
        if(Point_CurrentA == 16)
        {
           A_Add = 0;
           A_Plus = 1;
          if(Positive_ReverseA)
          {Point_Running++;}
          Positive_ReverseA = 0;
        }   
      }     
      if(A_Plus)
      {
        if(Point_CurrentA == 0)
        {
          A_Add = 1;
          A_Plus = 0;
          if(Positive_ReverseA)
          {Point_Running++;}
          Positive_ReverseA = 0;
        }
      }
      if(B_Add)
      {
        if(Point_CurrentB==16)
        {
           B_Add = 0;
           B_Plus = 1;
          if(Positive_ReverseB)
          {Point_Running++;}
          Positive_ReverseB = 0;
        }
      }
      if(B_Plus)
      {
         if(Point_CurrentB==0)
         {
           B_Add = 1;
           B_Plus = 0;   
          if(Positive_ReverseB)
          {Point_Running++;}
           Positive_ReverseB = 0;         
         }
      }
      if(Positive_Reverse_Flage==0) // 正转
      {
        if(Positive_ReverseA==0)
         {
           Positive_ReverseB = 1;
         }
        if(Positive_ReverseB==0)
         {
           Positive_ReverseA = 1;
         }
      }
      

        if(Point_Running>4)
        {
          Point_Running = 0;
        }
    }      
  }
}
//*****************************************
//主函数
//*****************************************
void main()
{
  Pic_Int();   // 初始化
  //PHASEB = 1;
  //ENABLEB = 0;
  while(1)
  {

  }
}

//*****************************************
//初始化函数
//*****************************************
void Pic_Int()
{
  ADCON1 = 0x07;  // 关闭AD转换器
  INTCON= 0x00;   // 关闭中断
  TRISB = 0x00;   // RB口设置为输出
  PORTB = 0xff;   // 全部电流输出
  
  TRISC = 0xF0;   // 低四位设置为输出引脚
  ENABLEB = 1;
  ENABLEA = 1;

  T1CON = 0x00;   // 定时器1初始化
  TMR1IE = 1;
  Timer_Add = Timer1_Int;

  TMR1H = (unsigned char)(Timer_Add>>4);     // 定时器计时初始化
  TMR1L = (unsigned char)(Timer_Add&0x00ff);  
  GIE = 1;                                  // 中断开始
  PEIE = 1;
  TMR1ON= 1;                                // 定时器运行
  Point_CurrentA = 0;                       // 指针初始化
  Point_CurrentB = 0;
  Point_Running = 0;  
  Delay_Counter = 0;

  Positive_Reverse_Flage = 0;               // 正转标志
  Point_CurrentA = 16;                      // 正转电流A相处于最大
  Point_CurrentB = 0;                       // 正转电流B相处于最小

  Positive_ReverseA = 1;
  Positive_ReverseB = 0;
  A_Plus = 1;                               // 起始B进行加操作
  A_Add = 0;
  B_Add = 1;                                // B加操作
  B_Plus = 0;
}

使用特权

评论回复
76
jrcsh|  楼主 | 2013-8-27 00:42 | 只看该作者
本帖最后由 jrcsh 于 2013-8-27 00:43 编辑



刚好作个小东西,顺便把  3种拍法也演示一下差异。  


电源不太足够,  单拍和双拍的差异体现的不明显,  2拍半,就明显安静了下来,  但电流的表现就没得看了,电流被我限制,电压又不足够.

使用特权

评论回复
77
bsz84| | 2013-8-29 11:58 | 只看该作者
感谢楼主!

使用特权

评论回复
78
yqzz163| | 2013-8-29 12:24 | 只看该作者
学习一下啊。连载啦。

使用特权

评论回复
79
otheric| | 2013-9-18 17:08 | 只看该作者
好大的洞啊,

使用特权

评论回复
80
jrcsh|  楼主 | 2013-9-19 21:46 | 只看该作者
明月小厨 发表于 2013-1-3 21:06
1.步进电机闭环控制的方案不太多见;大多数都是开环控制;
2.用步进电机精准控制位移,用细分法;感觉理论上可 ...


1.步进电机闭环控制的方案不太多见;大多数都是开环控制;  

精密控制都是上编码器进行闭环控制器,无感的还没普及开来, 失步,丢步来至意外,的不受控制。

2.用步进电机精准控制位移,用细分法;感觉理论上可行,实际效果怎么样?很难说.

   ..........


3.五相十拍电机最讨厌,线很多,如果做个控制器要控制5相;远远没有二相或三相方便;

.五相10线 步进,非常好玩,花样多多, 在速度的扭力上能有更大的兼得。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则