各位前輩好,不知哪位有步進電機控制方面的經驗.我現在在做一個關于步機電機的東東,用的是四相五線步進電機,四相八拍控制.
問題:
控制脈沖的占空比對發熱,轉距等有沒有影響,我看資料上都說占空比在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
回復