各位前辈好,不知哪位有步进电机控制方面的经验.我现在在做一个关于步机电机的东东,用的是四相五线步进电机,四相八拍控制.
问题:
控制脉冲的占空比对发热,转距等有没有影响,我看资料上都说占空比在0.3-0.4,但网上的程序都是直接换相的,例如A-AB-B-BC-C-CD-D-DA,依次加高电平使其导通,不到换相的时候就一直加着高电平,这样做行不行,请大虾们指点一二,小生不胜受恩感激!
另外还有好多地方不懂,一时都理不清,各位有经验的请帮忙提点建议,谢谢!
请教:关于单片机控制步进电机..
全部回复(5)
正序查看
倒序查看
现在还没有回复呢,说说你的想法
/*
----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);
}
}
----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
回复
提示
@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
回复
提示