找回密码
 注册

QQ登录

只需一步,快速开始

搜索

STC12C5A60S2单片机+控制步进电机和舵机实现物料搬运程序

[复制链接]
coolfire 发表于 2021-4-17 01:33:44 | 显示全部楼层 |阅读模式
  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. }
复制代码


您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-12-22 12:04

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表