国产免费AV|泡泡玛特欧洲总部将设在伦敦|中文天堂网www新版资源在线|一本久道综合在线中文|国精产品一二三产区的使用方法|香蕉鱼在线观看|www.27eee

ELEOK

標題: STC12C5A60S2單片機+控制步進電機和舵機實現物料搬運程序 [打印本頁]

作者: coolfire    時間: 2021-4-17 01:33
標題: STC12C5A60S2單片機+控制步進電機和舵機實現物料搬運程序
  1. #include <STC12C5A60S2.h>
  2. /*
  3.   使用元件:42兩向步進電機              1個
  4.                   TB6600盒式步進電機驅動器    1個
  5.                                                 SG90舵機                    2個
  6.                                                 限位開關                    1個
  7.             STC12C5A60S2最小系統        1個
  8.         42電機接線:無論從哪邊開始數,我們只接1 34 6這四個相位
  9.         TB6600接線:共陽極接法,PUL-》P1^0  ENA-》P1^1 DIR-》P1^2
  10.         SG90接線:爪子》P1^3   上下舵機》P1^4
  11.         限位開關:
  12. */
  13. /*調速等級表,5個檔位。1細分, 200脈沖一圈。         一個脈沖是1.8度。
  14. 計算:
  15. 4000,8ms一個脈沖(高電平4MS,低電平4MS,共是8MS)。 200個脈沖就是:1.6秒, 即1.6秒步進電機走一圈。37.5圈/分
  16. 4000 起步會失步在1細分的情況下。
  17. 3000        6ms                                                                                                                        1.2                                                          50圈/分
  18. 2000, 4ms一個脈沖(高電平2MS,低電平2MS,共是4MS)。 200個脈沖就是:0.8秒, 即0.8秒步進電機走一圈。75圈/分
  19. 1000,就是0.4秒/圈, 150圈/分。
  20. 500       0.2秒/圈,  300圈/分
  21. 250       0.1秒/圈   600圈/分。  500US一個脈沖。1S就是2000個脈沖,IO輸出就是2MHZ.在STC89C52的范圍內。
  22. 再細分下去,超出C52的范圍。

  23. 我這步進最佳最快有效是600轉/分。最快1000圈/分*/
  24. //電機控制引腳
  25. sbit CLK  = P1^0;          //PUL-
  26. sbit ENA  = P1^1;           //ENA-
  27. sbit DIR  = P1^2;          //DIR-
  28. //限位控制端
  29. sbit StopStart  = P1^5;           //限位開關
  30. sbit SG_PWM=P1^3;
  31. sbit SG_PWM1=P1^4;
  32. unsigned char USARTbuf[10];    //設置8位的unsigend char型寄存器用來暫存串口接收內容
  33. unsigned int counttemp=0;                                   //暫存停止前的COUNT計數
  34. unsigned int count=0,flag=0,flag1=0,flag2=0,flag3=0;
  35. unsigned int SPEED=0;
  36. bit Run_Status=1;                                                   //默認是電機啟動狀態
  37. unsigned int Tspeed[5]={250,500,1000,2500,3000};
  38. unsigned int setspeed=6,cespeed; // 2 4 6 10 12
  39. unsigned char count1=0;
  40. unsigned char PWM_count;//1--0度,2--45度,3--90度,4--135度,5--180度
  41. unsigned char PWM_count1;
  42. unsigned char a=0;

  43. void delay(unsigned int n);
  44. void bujin(int fanxiang,int bushu);
  45. void Timer_Init()
  46. {
  47.         TMOD&=0x0F;            //把TMOD高4位清0
  48.         TMOD=0X21;//T0定時方式1
  49.         TH1=0xFD;              //設置波特率為9600  22m為fa
  50.   TL1=0xFD;              //設置波特率為9600
  51.         TR1=1;
  52.         SCON=0x50;
  53.         TH0=(65536-250)/256; //2500=2.5ms
  54.         TL0=(65536-250)%256;
  55.         ET0=1;//打開定時器0的中斷
  56.         TR0=1;//打開定時器0
  57.         EA=1;//開總中斷
  58. }

  59. void Timer() interrupt 1//特別注意此處,0--外部中斷0,1--定時器中斷0,2--外部中斷1,3--定時器中斷1,4--串行口中斷1
  60. {
  61.         TR0=0;
  62.         TH0=(65536-250)/256; //250=0.25ms
  63.         TL0=(65536-250)%256;
  64.   count1++;
  65.         if(count1>=40)
  66.         {
  67.         count1=0;
  68.         }
  69.         if(count1<=PWM_count*2){SG_PWM=1;}
  70.         else{SG_PWM=0;}
  71.         if(count1<=PWM_count1*2){SG_PWM1=1;}
  72.         else{SG_PWM1=0;}
  73.         count++;
  74.         if(count==setspeed){CLK=~CLK;count=0;cespeed++;}                                          //發送脈沖……
  75.         
  76.         if(RI==1)               //如果接收標志位為1,說明有數據接收完畢
  77.         {                       
  78.                         USARTbuf[0]=SBUF;      //將發送區數據保存
  79.                         if(USARTbuf[0]=='r'&&flag1==0){ENA=1;delay(200);flag1=1;}
  80.                         if(USARTbuf[0]=='r'&&flag1==2){ENA=1;delay(200);flag1=3;}
  81.                         if(USARTbuf[0]=='B'){flag3=1;ENA=1;DIR=0;}  //ENA=1;DIR=0;delay(200);
  82.                         if(USARTbuf[0]=='e'&&flag2==0){flag2=1;}
  83.                         if(USARTbuf[0]==0x31&&flag2==1){setspeed=2;flag2=11;}
  84.                         if(USARTbuf[0]==0x32&&flag2==1){setspeed=4;flag2=12;}
  85.                         if(USARTbuf[0]==0x33&&flag2==1){setspeed=6;flag2=13;}
  86.                         if(USARTbuf[0]==0x34&&flag2==1){setspeed=10;flag2=14;}
  87.                         if(USARTbuf[0]==0x35&&flag2==1){setspeed=12;flag2=15;}
  88.                         RI=0;               //清除接收標志位
  89.         }
  90.         TR0=1;
  91. }

  92. void main()
  93. {
  94.   CLK=0;
  95.         ENA=0;                                   //ENA-接的控制口,但一樣的,如果ENA=0,步進電機卡起
  96.         DIR=0;                                  //DIR-接的控制口。初始化電機        低電平有效,測試,DIR=1,是正轉, DIR=0反轉。
  97.   Timer_Init();
  98.         PWM_count=3;
  99.         PWM_count1=3;
  100. while(1)
  101. {
  102.                         
  103.                         if(StopStart==0&&flag1==1)//A到B
  104.             {
  105.                                 flag1=0;
  106.                     delay(10);
  107.                                 if(StopStart==0)
  108.               {        
  109.                                         while(1)
  110.                                         {
  111.                                                 if(setspeed==2)bujin(1,100);
  112.                                                 else if(setspeed==4)bujin(1,50);
  113.                                                 else if(setspeed==6)bujin(1,50);
  114.                                                 else if(setspeed==10)bujin(1,100);
  115.                                                 else if(setspeed==12)bujin(1,100);
  116.                                                 if(flag3==1)break;          //到達指定A點行程時間 1000步 b13000步
  117.                                                 ENA=0;                         //步進電機停止
  118.                                                 PWM_count1=1;delay(300);if(flag3==1)break;              //到達A點下降
  119.                                                 PWM_count=1;delay(300);if(flag3==1)break;             //到達A點抓取
  120.                                                 PWM_count1=3;               //舵機2抬起
  121.                                                 ENA=1;
  122.                                                 if(setspeed==2)bujin(1,1080);
  123.                                                 else if(setspeed==4)bujin(1,1150);
  124.                                                 else if(setspeed==6)bujin(1,1200);
  125.                                                 else if(setspeed==10)bujin(1,1150);
  126.                                                 else if(setspeed==12)bujin(1,1150);
  127.                                                 ENA=0; if(flag3==1)break;            //到達B點
  128.                                                 PWM_count1=1;delay(300);if(flag3==1)break;PWM_count=3;delay(300);if(flag3==1)break;        
  129.                                                 ENA=1; DIR=~DIR;   //回原點
  130.                                                 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;}}
  131.                                                 break;       //結束行程
  132.                                         }
  133.                                 }
  134.                         }
  135.                         if(StopStart==0&&flag3==1)//B到A
  136.             {
  137.                                 flag3=0;
  138.                     ENA=0;
  139.                                 PWM_count=3;
  140.                                 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);
  141.                         }
  142.                         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);}
  143.                         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);}
  144.                         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);}
  145.                         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);}
  146.                         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);}
  147. }
  148. }
  149. void delay(unsigned int n)                           //delay幾個毫秒,入口參數為幾個毫秒                                                                          //正反轉切換時速度太快了。延時保護電機
  150. {
  151.         unsigned int i,y;
  152.         for(i=n;i>0;i--)
  153.         {
  154.                 for(y=1140;y>0;y--){if(flag3==1)break;}
  155.                 if(flag3==1)break;
  156.         }
  157. }
  158. void bujin(int fanxiang,int bushu)
  159. {
  160.   ENA=1;
  161.         DIR=fanxiang;
  162.         cespeed=0;
  163.         while(1)
  164.         {
  165.                 if(bushu==cespeed){break;}
  166.                 if(flag3==1)break;
  167.         }
  168.         ENA=0;
  169.         if(flag3==1)ENA=1;
  170. }
復制代碼







歡迎光臨 ELEOK (http://www.afoofa.cn/) Powered by Discuz! X5.0