找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3218|回复: 0
收起左侧

51四个按键控制42/57步进电机启停正反,但速度一直加不上去

[复制链接]
ID:245224 发表于 2018-4-14 14:02 | 显示全部楼层 |阅读模式
80黑币
代码在下面,是我参考的网上代码改写的,但是步进电机的速度一直很慢,提不上去,求大神能改下,让步进电机运动快点,驱动器采用的是tb6600,脉冲加方向控制。
代码:

  1. #include <reg52.h>
  2. sbit Clk = P2^0;
  3. sbit En = P2^1;        
  4. sbit Dir = P2^2;

  5. sbit CW = P2^4;                //正转运行按键
  6. sbit STOP = P2^5;        //停止运行按键
  7. sbit CCW = P2^6;        //反转运行按键
  8. sbit ADJ = P2^7;        //调速运行按键

  9. bit Run_Status;                //运行状态位标志,
  10.                                         //=0表示电机在停止状态,可以按键正转、反转均可
  11.                                         //=1表示电机在运行状态,不支持正反转按键,只有先停止。防止强行换向带来的电流过大。

  12. unsigned char Run_Dir,t;        //电机运行方向
  13. unsigned char timer1;

  14. #define        F_DIR        0                //正转
  15. #define        R_DIR        1                //反转

  16. unsigned int clock;         //周期变量

  17. void Delayms(unsigned int xms)         //延时函数
  18. {
  19.         unsigned int i,j;
  20.         for(i=xms;i>0;i--)
  21.             for(j=9;j>0;j--);
  22. }


  23. void Forward(void)          //电机正转
  24. {
  25.         TH0=(65536-clock)/256;          //初值大小由clock值决定
  26.         TL0=(65536-clock)%256;          //clock增大,speed减小;clock减小,speed增大         
  27.         Dir=0;
  28.         En=1;
  29.         TR0=1;           //开定时器1中断
  30. }

  31. void system_Ini()
  32. {
  33.     TMOD|= 0x11;
  34.     TH1 = 0xfe; //11.0592MHz 0.5ms定时
  35.     TL1 = 0x33;
  36.     TR1 = 1; //启动T1定时
  37.     EA=1;
  38.         ET1=1; //开T0,T1中断,开总中断
  39. }                                 

  40. void Reversal(void)         //电机反转
  41. {
  42.         TH0=(65536-clock)/256;         
  43.         TL0=(65536-clock)%256;         
  44.         Dir=1;
  45.         En=1;            
  46.         TR0=1;
  47. }

  48. char flag1 =0x00;
  49. bit flagstop=0;
  50. void Keyscan()
  51. {
  52.         if(STOP==0 && flagstop==0)                                //任何时候按停止键,电机停止运行
  53.                 {        
  54.                         Delayms(1);                //延时去抖动
  55.                         if(STOP==0)                        
  56.                         {               
  57.                                 TR0=0;
  58.                                 Clk=0;
  59.                                                                 TR1=0;
  60.                                 En=0;
  61.                                 flag1=0;
  62.                             flagstop=1;
  63.                                 Run_Status=0;        //电机正在停止的状态标志
  64.                         }
  65.                 }
  66.             else if(!CW && !Run_Status && (flag1&0xf0)==0x00)        //按正转键同时电机不是正在运行时,电机正转运行
  67.                 {
  68.                         Delayms(1);                //按下延时去抖动
  69.                         if(!CW && !Run_Status)                        
  70.                         {        
  71.                            { flag1 =0x10;
  72.                                 Run_Status=1;
  73.                                                                 if(t<1)
  74.                                                         {
  75.                                                        
  76.                              Forward();
  77.                                                         }
  78.                             Run_Dir = F_DIR;        //电机运行方向正转                                
  79.                             flagstop=0;
  80.                                                            if(timer1>100)
  81.                                                         {
  82.                                                             timer1=0; //输出占空比0.7的PWM脉冲
  83.                                                                 }
  84.                                                         if(timer1<30)
  85.                                                                 {
  86.                                                                     Clk=0;
  87.                                                                 }
  88.                                                         else
  89.                                                                 {
  90.                                                                     Clk=1;
  91.                                                                         }
  92.                                                         }
  93.                                                        
  94.                         }
  95.                 }
  96.               else if(!CCW && !Run_Status && (flag1&0x0f)==0)        //按反转键同时电机不是正在运行时,电机反转运行
  97.                 {
  98.                         Delayms(1);                //延时去抖动
  99.                         if(!CCW && !Run_Status)                        
  100.                         {        
  101.                                                                 if(t<1)
  102.                                                         {
  103.                                                        
  104.                                 Reversal();
  105.                                                         }
  106.                                 Run_Dir=R_DIR;        //电机运行方向反转
  107.                                 flagstop=0;
  108.                                                                 flag1 = 1;
  109.                                 Run_Status=1;        //电机正在运行的状态标志

  110.                                                                 if(timer1>100)
  111.                                                         {
  112.                                                             timer1=0; //输出占空比0.7的PWM脉冲
  113.                                                                 }
  114.                                                         if(timer1<50)
  115.                                                                 {
  116.                                                                     Clk=0;
  117.                                                                 }
  118.                                                         else
  119.                                                                 {
  120.                                                                     Clk=1;
  121.                                                                         }
  122.                                                         }
  123.                         }
  124.                
  125.                    if(!ADJ)
  126.                 {
  127.                         Delayms(1);                //延时去抖动
  128.                         if(!ADJ)
  129.                         {        
  130.                                 if(clock>201)        clock-=200;        
  131.                                 else                        clock=1000;
  132.                                 Run_Status=1;
  133.                                 TR0=1;
  134.                          }
  135.                 }
  136. }
  137. void Init(void)
  138. {
  139.         Run_Status=0;        //=0表示电机在停止状态,可以按键正转、反转均可
  140.         Clk = 0;
  141.         En = 0;
  142.         TH0=(65536-clock)/256;
  143.         TL0=(65536-clock)%256;
  144.         TMOD=0X01;
  145.         EA=1;
  146.         ET0=1;
  147.         TR0 =0;
  148. }


  149. void main(void)
  150. {
  151.                 t=0;
  152.                 timer1=0;
  153.         Init();
  154.                 system_Ini();
  155.         clock=500;
  156.         P1=0xff;
  157.         P3 =0XFF;
  158.         while(1)
  159.           {
  160.           Keyscan();        
  161.     }
  162. }


  163. void Timer0_ISR(void) interrupt 1
  164. {
  165.         TH0=(65536-clock)/256;
  166.         TL0=(65536-clock)%256;
  167.         Clk = ~Clk;     
  168.                 t++;   
  169. }
  170. /*************************************
  171. [ t1 (0.5ms)中断] 中断中做 PWM 输出
  172. ------------1000/(0.02ms*250)=200Hz
  173. *************************************/
  174. void T1zd(void) interrupt 3 //3 为定时器1的中断号 1 定时器0的中断号 0 外部中断1 2 外部中断2 4 串口中断
  175. {
  176. //        TH1 = 0xfe; //11.0592MHz 0.5ms定时
  177. //        TL1 = 0x33;
  178.     TH0=(65536-200)/256;
  179.     TL0=(65536-200)%256;
  180.     timer1++; //计数+1
  181. }
复制代码
我想的是先低速启动,然后再加速运行,如果能够直接快速启动也行。


回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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