- #include <STC12C5A60S2.h>
- /*
- 使用元件:42兩向步進電機 1個
- TB6600盒式步進電機驅動器 1個
- SG90舵機 2個
- 限位開關 1個
- STC12C5A60S2最小系統 1個
- 42電機接線:無論從哪邊開始數,我們只接1 34 6這四個相位
- TB6600接線:共陽極接法,PUL-》P1^0 ENA-》P1^1 DIR-》P1^2
- SG90接線:爪子》P1^3 上下舵機》P1^4
- 限位開關:
- */
- /*調速等級表,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的范圍內。
- 再細分下去,超出C52的范圍。
- 我這步進最佳最快有效是600轉/分。最快1000圈/分*/
- //電機控制引腳
- sbit CLK = P1^0; //PUL-
- sbit ENA = P1^1; //ENA-
- sbit DIR = P1^2; //DIR-
- //限位控制端
- sbit StopStart = P1^5; //限位開關
- sbit SG_PWM=P1^3;
- sbit SG_PWM1=P1^4;
- unsigned char USARTbuf[10]; //設置8位的unsigend char型寄存器用來暫存串口接收內容
- unsigned int counttemp=0; //暫存停止前的COUNT計數
- unsigned int count=0,flag=0,flag1=0,flag2=0,flag3=0;
- unsigned int SPEED=0;
- bit Run_Status=1; //默認是電機啟動狀態
- unsigned int Tspeed[5]={250,500,1000,2500,3000};
- unsigned int setspeed=6,cespeed; // 2 4 6 10 12
- unsigned char count1=0;
- unsigned char PWM_count;//1--0度,2--45度,3--90度,4--135度,5--180度
- unsigned char PWM_count1;
- unsigned char a=0;
- void delay(unsigned int n);
- void bujin(int fanxiang,int bushu);
- void Timer_Init()
- {
- TMOD&=0x0F; //把TMOD高4位清0
- TMOD=0X21;//T0定時方式1
- TH1=0xFD; //設置波特率為9600 22m為fa
- TL1=0xFD; //設置波特率為9600
- TR1=1;
- SCON=0x50;
- TH0=(65536-250)/256; //2500=2.5ms
- TL0=(65536-250)%256;
- ET0=1;//打開定時器0的中斷
- TR0=1;//打開定時器0
- EA=1;//開總中斷
- }
- void Timer() interrupt 1//特別注意此處,0--外部中斷0,1--定時器中斷0,2--外部中斷1,3--定時器中斷1,4--串行口中斷1
- {
- TR0=0;
- TH0=(65536-250)/256; //250=0.25ms
- TL0=(65536-250)%256;
- count1++;
- if(count1>=40)
- {
- count1=0;
- }
- if(count1<=PWM_count*2){SG_PWM=1;}
- else{SG_PWM=0;}
- if(count1<=PWM_count1*2){SG_PWM1=1;}
- else{SG_PWM1=0;}
- count++;
- if(count==setspeed){CLK=~CLK;count=0;cespeed++;} //發送脈沖……
-
- if(RI==1) //如果接收標志位為1,說明有數據接收完畢
- {
- USARTbuf[0]=SBUF; //將發送區數據保存
- if(USARTbuf[0]=='r'&&flag1==0){ENA=1;delay(200);flag1=1;}
- if(USARTbuf[0]=='r'&&flag1==2){ENA=1;delay(200);flag1=3;}
- if(USARTbuf[0]=='B'){flag3=1;ENA=1;DIR=0;} //ENA=1;DIR=0;delay(200);
- if(USARTbuf[0]=='e'&&flag2==0){flag2=1;}
- if(USARTbuf[0]==0x31&&flag2==1){setspeed=2;flag2=11;}
- if(USARTbuf[0]==0x32&&flag2==1){setspeed=4;flag2=12;}
- if(USARTbuf[0]==0x33&&flag2==1){setspeed=6;flag2=13;}
- if(USARTbuf[0]==0x34&&flag2==1){setspeed=10;flag2=14;}
- if(USARTbuf[0]==0x35&&flag2==1){setspeed=12;flag2=15;}
- RI=0; //清除接收標志位
- }
- TR0=1;
- }
- void main()
- {
- CLK=0;
- ENA=0; //ENA-接的控制口,但一樣的,如果ENA=0,步進電機卡起
- DIR=0; //DIR-接的控制口。初始化電機 低電平有效,測試,DIR=1,是正轉, DIR=0反轉。
- Timer_Init();
- PWM_count=3;
- PWM_count1=3;
- while(1)
- {
-
- if(StopStart==0&&flag1==1)//A到B
- {
- flag1=0;
- delay(10);
- if(StopStart==0)
- {
- while(1)
- {
- if(setspeed==2)bujin(1,100);
- else if(setspeed==4)bujin(1,50);
- else if(setspeed==6)bujin(1,50);
- else if(setspeed==10)bujin(1,100);
- else if(setspeed==12)bujin(1,100);
- if(flag3==1)break; //到達指定A點行程時間 1000步 b13000步
- ENA=0; //步進電機停止
- PWM_count1=1;delay(300);if(flag3==1)break; //到達A點下降
- PWM_count=1;delay(300);if(flag3==1)break; //到達A點抓取
- PWM_count1=3; //舵機2抬起
- ENA=1;
- if(setspeed==2)bujin(1,1080);
- else if(setspeed==4)bujin(1,1150);
- else if(setspeed==6)bujin(1,1200);
- else if(setspeed==10)bujin(1,1150);
- else if(setspeed==12)bujin(1,1150);
- ENA=0; if(flag3==1)break; //到達B點
- PWM_count1=1;delay(300);if(flag3==1)break;PWM_count=3;delay(300);if(flag3==1)break;
- ENA=1; DIR=~DIR; //回原點
- while(1){if(StopStart==0){ENA=0;TI=0;SBUF='B';while(!TI);TI=0;SBUF='a';while(!TI);TI=0;SBUF='c';while(!TI);TI=0;SBUF='k';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);break;}}
- break; //結束行程
- }
- }
- }
- if(StopStart==0&&flag3==1)//B到A
- {
- flag3=0;
- ENA=0;
- PWM_count=3;
- TI=0;SBUF='B';while(!TI);TI=0;SBUF='a';while(!TI);TI=0;SBUF='c';while(!TI);TI=0;SBUF='k';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF=':';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);
- }
- if(flag2==11){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='1';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
- else if(flag2==12){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='2';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
- else if(flag2==13){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='3';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
- else if(flag2==14){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='4';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
- else if(flag2==15){flag2=0;TI=0;SBUF='S';while(!TI);TI=0;SBUF='e';while(!TI);TI=0;SBUF='t';while(!TI);TI=0;SBUF=' ';while(!TI);TI=0;SBUF='S';while(!TI);TI=0;SBUF='P';while(!TI);TI=0;SBUF='5';while(!TI);TI=0;SBUF='O';while(!TI);TI=0;SBUF='K';while(!TI);}
- }
- }
- void delay(unsigned int n) //delay幾個毫秒,入口參數為幾個毫秒 //正反轉切換時速度太快了。延時保護電機
- {
- unsigned int i,y;
- for(i=n;i>0;i--)
- {
- for(y=1140;y>0;y--){if(flag3==1)break;}
- if(flag3==1)break;
- }
- }
- void bujin(int fanxiang,int bushu)
- {
- ENA=1;
- DIR=fanxiang;
- cespeed=0;
- while(1)
- {
- if(bushu==cespeed){break;}
- if(flag3==1)break;
- }
- ENA=0;
- if(flag3==1)ENA=1;
- }
復制代碼
【必讀】版權免責聲明
1、本主題所有言論和內容純屬會員個人意見,與本論壇立場無關。2、本站對所發內容真實性、客觀性、可用性不做任何保證也不負任何責任,網友之間僅出于學習目的進行交流。3、對提供的數字內容不擁有任何權利,其版權歸原著者擁有。請勿將該數字內容進行商業交易、轉載等行為,該內容只為學習所提供,使用后發生的一切問題與本站無關。 4、本網站不保證本站提供的下載資源的準確性、安全性和完整性;同時本網站也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的損失或傷害。 5、本網站所有軟件和資料均為網友推薦收集整理而來,僅供學習用途使用,請務必下載后兩小時內刪除,禁止商用。6、如有侵犯你版權的,請及時聯系我們(電子郵箱1370723259@qq.com)指出,本站將立即改正。
|
|