• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

请教:关于单片机控制步进电机..

各位前辈好,不知哪位有步进电机控制方面的经验.我现在在做一个关于步机电机的东东,用的是四相五线步进电机,四相八拍控制.
问题:
   控制脉冲的占空比对发热,转距等有没有影响,我看资料上都说占空比在0.3-0.4,但网上的程序都是直接换相的,例如A-AB-B-BC-C-CD-D-DA,依次加高电平使其导通,不到换相的时候就一直加着高电平,这样做行不行,请大虾们指点一二,小生不胜受恩感激!
  另外还有好多地方不懂,一时都理不清,各位有经验的请帮忙提点建议,谢谢!
全部回复(5)
正序查看
倒序查看
ytuan
LV.3
2
2006-11-05 15:03
500) {this.resized=true; this.width=500; this.alt='这是一张缩略图,点击可放大。\n按住CTRL,滚动鼠标滚轮可自由缩放';this.style.cursor='hand'}" onclick="if(!this.resized) {return true;} else {window.open('http://u.dianyuan.com/bbs/u/47/1162713425.jpg');}" onmousewheel="return imgzoom(this);">
0
回复
ytuan
LV.3
3
2006-11-05 15:25
/*
----BY Victor.S----
--原理图:步进电机控制显示.sch----四相混合式步进电机,五线引出;
-----------
P0口接数码管显示输出;
P2.0-P2.3四位数码管位选;

-----控制电路--L298N驱动-----
P1.0步进电机控制端A;
P1.1步进电机控制端B;
P1.2步进电机控制端C;
P1.3步进电机控制端D;
----------------------
---指示LED---低电平点亮---
P1.4 红色
P1.5 蓝色
P1.6 绿色
-----------
P3.0-P3.3 按键输入S1-S4,P2.7开关控制
----------
*/
#include
#define M_ON P2_7    //开关控制
#define A P1_0
#define B P1_1
#define C P1_2
#define D P1_3
#define LED_RED P1_4   //指示灯
#define LED_BLUE P1_5
#define LED_GREEN P1_6
#define L4 P2_0   //数码管使能
#define L3 P2_1
#define L2 P2_2
#define L1 P2_3
#define relay P1_7   //动作继电器,控制刀片
#define uchar unsigned char
#define uint unsigned int
static uint count;
static uchar step_index;
static uint length_num;
static uint cutted_num;
const uchar spcount=20;   //脉冲频率控制-;转速控制 1S/(50*20*400us)=2.5圈每S
uint l_num=0,c_num=0;
uchar dis_data[12]={   //布线后确定
                    0x00,0x00,0x00,0x00, //0,1,2,3
0x00,0x00,0x00,0x00, //4,5,6,7
0x00,0x00,0x00,0x00 //8,9,E,全灭
};
bit run_flag=0; //停机标置位,为1时开机
void run(void)
{if(run_flag==0)
     {A=0;
      B=0;
      C=0;
      D=0;
      return;
      }

  switch(step_index)
  { case 0:
           A=1;
   B=0;
   C=0;
   D=0;
   break;
case 1:
       A=1;
   B=1;
   C=0;
   D=0;
   break;
case 2:
       A=0;
   B=1;
   C=0;
   D=0;
   break;
   case 3:
           A=0;
   B=1;
   C=1;
   D=0;
   break;
case 4:
       A=0;
   B=0;
   C=1;
   D=0;
   break;
case 5:
       A=0;
   B=0;
   C=1;
   D=1;
   break;
     case 6:
           A=0;
   B=0;
   C=0;
   D=1;
   break;
case 7:
       A=1;
   B=0;
   C=0;
   D=1;
    }
step_index++;
l_num++;
if(step_index>7)
step_index=0;
  }
void inita(void)
{
P1=0xf0;
P0=0x00;
P2=0x00;
P3=0xff;
EA=1;
EX0=1;
ET0=1;
TMOD=0x02;
TH0=0xff;
TL0=0xce;
TR0=1;
}
void disp(uint m)
{ uchar i,d0,d1,d2;
  P0=0x00;
  P2=0xf0;
  if(m<10)
   {L1=1;
    P0=dis_data[m];
for(i=100;i>0;i--);
return;
   }
  else if(m<100)
    {d0=m%10;
d1=m/10;
L2=1;
P0=dis_data[d1];
for(i=100;i>0;i--);
L2=0;
L1=1;
P0=dis_data[d0];
for(i=100;i>0;i--);
return;
}
  else if(m<1000)
{d0=m%10;
  d2=m/100;
  d1=(m-d2*100)/10;
  L3=1;
  P0=dis_data[d2];
  for(i=100;i>0;i--);
      L3=0;
  L2=1;
  P0=dis_data[d1];
  for(i=100;i>0;i--);
  L2=0;
  L1=1;
  P0=dis_data[d0];
     for(i=100;i>0;i--);
  return;
  }


}

void set(uchar set_bit,uchar bit_num,uint set_num)
{if(set_bit==1){set_num=set_num+bit_num;}
if(set_bit==2){set_num=set_num+10*bit_num;}
if(set_bit==3){set_num=set_num+100*bit_num;}
if(set_bit==4){set_num=set_num+1000*bit_num;}

}
void set_disp(uchar undis_bit,uint dis_num) //设置位闪动显示
{ uchar i,d0=0,d1=0,d2=0,d3=0;
  P0=0x00;
  P2=0xf0;
  if(dis_num<10)d0=dis_num;
  else if(dis_num<100){d0=dis_num%10;d1=dis_num/10;}
  else if(dis_num<1000){d0=dis_num%10;d1=(dis_num%100)/10;d2=dis_num/100;}
  else if(dis_num<10000){d0=dis_num%10;d1=(dis_num%100)/10;d2=(dis_num%1000)/100;d3=dis_num/1000;}
  else {d0=10;d1=10;d2=10;d3=10;}
  if(undis_bit==1)d0=11;
  else if(undis_bit==2)d1=11;
  else if(undis_bit==3)d2=11;
  else if(undis_bit==4)d3=11;
  L1=1;
  P0=dis_data[d0];
  for(i=100;i>0;i--);
  L1=0;
  L2=1;
  P0=dis_data[d1];
  for(i=100;i>0;i--);
  L2=0;
  L3=1;
  P0=dis_data[d2];
  for(i=100;i>0;i--);
  L3=0;
  L4=1;
  P0=dis_data[d3];
  for(i=100;i>0;i--);  
}
void int0(void) interrupt 0 using 1
{uchar key=0;
uint i;
uchar num;
bit set_flag=0;
LED_GREEN=0;
while(key<5)
   {if(P3_3==0){key++;}
    if(P3_0==0){num++;}
if(P3_1==0){num--;}
if(P3_4==0){set_flag=~set_flag;}
    if(set_flag==0)
     {LED_RED=0;
set(key,num,length_num);
set_disp(key,length_num);
     for(i=5000;i>0;i--);
     disp(length_num);
LED_RED=1;
}
else  
    {LED_BLUE=0;
set(key,num,cutted_num);
set_disp(key,cutted_num);
for(i=5000;i>0;i--);
disp(cutted_num);
LED_BLUE=1;
}
   }

  LED_GREEN=1;
}

void INT_T0(void) interrupt 1 using 2
{ count++;
     if(count>=spcount){run();count=0;}
if(l_num==length_num){relay=1;c_num++;l_num=0;}
if(c_num==cutted_num){run_flag=0;c_num=0;}
}

void main(void)
{
inita();
while(1)
{uint i;
  if(!M_ON)
     {for(i=5000;i>0;i--);
  if(!M_ON){run_flag=~run_flag;}
  }  
  disp(c_num);
  }
}
0
回复
chaihtao
LV.3
4
2007-04-18 16:39
@ytuan
/*----BYVictor.S------原理图:步进电机控制显示.sch----四相混合式步进电机,五线引出;-----------P0口接数码管显示输出;P2.0-P2.3四位数码管位选;-----控制电路--L298N驱动-----P1.0步进电机控制端A;P1.1步进电机控制端B;P1.2步进电机控制端C;P1.3步进电机控制端D;-------------------------指示LED---低电平点亮---P1.4红色P1.5蓝色P1.6绿色-----------P3.0-P3.3按键输入S1-S4,P2.7开关控制----------*/#include#defineM_ONP2_7  //开关控制#defineAP1_0#defineBP1_1#defineCP1_2#defineDP1_3#defineLED_REDP1_4  //指示灯#defineLED_BLUEP1_5#defineLED_GREENP1_6#defineL4P2_0  //数码管使能#defineL3P2_1#defineL2P2_2#defineL1P2_3#definerelayP1_7  //动作继电器,控制刀片#defineucharunsignedchar#defineuintunsignedintstaticuintcount;staticucharstep_index;staticuintlength_num;staticuintcutted_num;constucharspcount=20;  //脉冲频率控制-;转速控制1S/(50*20*400us)=2.5圈每Suintl_num=0,c_num=0;uchardis_data[12]={  //布线后确定                    0x00,0x00,0x00,0x00,//0,1,2,30x00,0x00,0x00,0x00,//4,5,6,70x00,0x00,0x00,0x00//8,9,E,全灭};bitrun_flag=0;//停机标置位,为1时开机voidrun(void){if(run_flag==0)    {A=0;      B=0;      C=0;      D=0;      return;      }  switch(step_index)  {case0:          A=1;  B=0;  C=0;  D=0;  break;case1:      A=1;  B=1;  C=0;  D=0;  break;case2:      A=0;  B=1;  C=0;  D=0;  break;  case3:          A=0;  B=1;  C=1;  D=0;  break;case4:      A=0;  B=0;  C=1;  D=0;  break;case5:      A=0;  B=0;  C=1;  D=1;  break;    case6:          A=0;  B=0;  C=0;  D=1;  break;case7:      A=1;  B=0;  C=0;  D=1;    }step_index++;l_num++;if(step_index>7)step_index=0;  }voidinita(void){P1=0xf0;P0=0x00;P2=0x00;P3=0xff;EA=1;EX0=1;ET0=1;TMOD=0x02;TH0=0xff;TL0=0xce;TR0=1;}voiddisp(uintm){uchari,d0,d1,d2;  P0=0x00;  P2=0xf0;  if(m0;i--);return;  }  elseif(m0;i--);L2=0;L1=1;P0=dis_data[d0];for(i=100;i>0;i--);return;}  elseif(m0;i--);      L3=0;  L2=1;  P0=dis_data[d1];  for(i=100;i>0;i--);  L2=0;  L1=1;  P0=dis_data[d0];    for(i=100;i>0;i--);  return;  }}voidset(ucharset_bit,ucharbit_num,uintset_num){if(set_bit==1){set_num=set_num+bit_num;}if(set_bit==2){set_num=set_num+10*bit_num;}if(set_bit==3){set_num=set_num+100*bit_num;}if(set_bit==4){set_num=set_num+1000*bit_num;}}voidset_disp(ucharundis_bit,uintdis_num)//设置位闪动显示{uchari,d0=0,d1=0,d2=0,d3=0;  P0=0x00;  P2=0xf0;  if(dis_num0;i--);  }voidint0(void)interrupt0using1{ucharkey=0;uinti;ucharnum;bitset_flag=0;LED_GREEN=0;while(key0;i--);    disp(length_num);LED_RED=1;}else      {LED_BLUE=0;set(key,num,cutted_num);set_disp(key,cutted_num);for(i=5000;i>0;i--);disp(cutted_num);LED_BLUE=1;}  }  LED_GREEN=1;}voidINT_T0(void)interrupt1using2{count++;    if(count>=spcount){run();count=0;}if(l_num==length_num){relay=1;c_num++;l_num=0;}if(c_num==cutted_num){run_flag=0;c_num=0;}}voidmain(void){inita();while(1){uinti;  if(!M_ON)    {for(i=5000;i>0;i--);  if(!M_ON){run_flag=~run_flag;}  }    disp(c_num);  }}
你好 我也用了l298n作驱动,发热很大,请问你怎么解决的?你这个电路l298n发热量大么?
0
回复
lmj0925
LV.4
5
2007-04-19 10:32
@chaihtao
你好我也用了l298n作驱动,发热很大,请问你怎么解决的?你这个电路l298n发热量大么?
你好,请问你是在什么公司做的?能给联系方式吗?QQ:546699528
LM09250925@163.COM
0
回复
lewess
LV.2
6
2007-04-22 01:40
做好记号,下次还来学习学习
0
回复