42motorTB6600FB120自動正反可用單片機源程序如下:- #include<reg52.h>
- //電機控制引腳
- sbit CLK = P1^0; //PUL-
- sbit ENA = P1^1; //ENA-
- sbit DIR = P1^2; //DIR-
-
- //按鍵控制端
- sbit speedup = P3^2; //調(diào)速+
- sbit speeddown = P3^0; //調(diào)速-
- sbit StopStart = P3^1; //停止與啟動
- unsigned int count=0;
- unsigned int Tspeed[5]={250,500,1000,2500,3000};
- //調(diào)速等級表,5個檔位。1細分, 200脈沖一圈。 一個脈沖是1.8度。
- //計算:
- //4000,8ms一個脈沖(高電平4MS,低電平4MS,共是8MS)。 200個脈沖就是:1.6秒, 即1.6秒步進電機走一圈。37.5圈/分
- //4000 起步會失步在1細分的情況下。
- //3000 6ms 1.2 50圈/分
- //2000, 4ms一個脈沖(高電平2MS,低電平2MS,共是4MS)。 200個脈沖就是:0.8秒, 即0.8秒步進電機走一圈。75圈/分
- //1000,就是0.4秒/圈, 150圈/分。
- //500 0.2秒/圈, 300圈/分
- //250 0.1秒/圈 600圈/分。 500US一個脈沖。1S就是2000個脈沖,IO輸出就是2MHZ.在STC89C52的范圍內(nèi)。
- //再細分下去,超出C52的范圍。
- //我這步進最佳最快有效是600轉(zhuǎn)/分。最快1000圈/分
- bit Run_Status=1; //默認是電機啟動狀態(tài)
- unsigned int SPEED=0; //脈沖頻率初始6ms
- unsigned int counttemp=0; //暫存停止前的COUNT計數(shù)
- void Init_time();
- void Key_scan();
- void delay(unsigned int hehe); //延時hehe毫秒
- void main()
- {
- CLK=0;
- ENA=1; //ENA-接的控制口,但一樣的,如果ENA=0,步進電機卡起
- DIR=1; //DIR-接的控制口。初始化電機 低電平有效,測試,DIR=1,是正轉(zhuǎn), DIR=0反轉(zhuǎn)。
- SPEED=Tspeed[4];
- P2=0X00;
- delay(2000); //延時2秒等待系統(tǒng)穩(wěn)定。
- P2=0XFF;
-
- Init_time(); //初始化定時器
-
- while(1)
- {
- Key_scan();
-
- }
- }
- void Init_time() //初始化定時器
- {
- TMOD |= 0x01;
- TH0=(65536-SPEED)/256; //給time0裝初值
- TL0=(65536-SPEED)%256;
- IE = 0x82;
- TR0=0; //開啟中斷產(chǎn)生脈沖信號
- EA=0;
- }
- void Enter_Timer0() interrupt 1 //進入定時器中斷
- {
- TH0=(65536-SPEED)/256;
- TL0=(65536-SPEED)%256;
- CLK=~CLK; //發(fā)送脈沖……
- count++;
- if(count<100)
- SPEED=3000; //如果調(diào)到2000失控 1細分
- if(count<200)
- SPEED=2000;
- else
- SPEED=3000;
- if(count==300) //計數(shù)2次為一個脈沖周期 所以180度為計數(shù)200.如果計數(shù)100只有90度
- {
-
- DIR=~DIR;
- count=0;
- CLK=0;
- TR0=0; //開啟中斷產(chǎn)生脈沖信號
- EA=0;
- delay(300);
- CLK=0;
- TR0=1;
- EA=1;
- }
- }
- void delay(unsigned int n) //delay幾個毫秒,入口參數(shù)為幾個毫秒
- //正反轉(zhuǎn)切換時速度太快了。延時保護電機
- {
- unsigned int i,y;
- for(i=n;i>0;i--)
- for(y=114;y>0;y--);
- }
- void Key_scan()
- {
- if(StopStart==0)
- {
- delay(10);
- if(StopStart==0)
- {
-
- Run_Status=~Run_Status;
- if(Run_Status)
- {
- count=counttemp;
- TR0=1; //開啟中斷產(chǎn)生脈沖信號
- EA=1;
-
- }
- else
- {
- counttemp=count;
- TR0=0; //關閉中斷停止脈沖信號
- EA=0;
- }
- } while(!StopStart);
- }
- }
- /**********************************
- static char i=0;
- static char j=4;
- if(speedup==0) //加速
- {
- delay(10);
- if(speedup==0)
- {
-
- j--;
- if(j<1)
- j=0;
- SPEED=Tspeed[j];
- }
- } while(!speedup);
- if(speeddown==0) //減速
- {
- delay(10);
- if(speeddown==0)
- {
-
- i++;
- if(i>4)
- i=4;
- SPEED=Tspeed[i];
- }
- } while(!speeddown);
- }
- *************************************/
復制代碼
|