找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3884|回復(fù): 0
收起左側(cè)

51四個按鍵控制42/57步進(jìn)電機(jī)啟停正反,但速度一直加不上去

[復(fù)制鏈接]
ID:245224 發(fā)表于 2018-4-14 14:02 | 顯示全部樓層 |閱讀模式
80黑幣
代碼在下面,是我參考的網(wǎng)上代碼改寫的,但是步進(jìn)電機(jī)的速度一直很慢,提不上去,求大神能改下,讓步進(jìn)電機(jī)運(yùn)動快點(diǎn),驅(qū)動器采用的是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;                //正轉(zhuǎn)運(yùn)行按鍵
  6. sbit STOP = P2^5;        //停止運(yùn)行按鍵
  7. sbit CCW = P2^6;        //反轉(zhuǎn)運(yùn)行按鍵
  8. sbit ADJ = P2^7;        //調(diào)速運(yùn)行按鍵

  9. bit Run_Status;                //運(yùn)行狀態(tài)位標(biāo)志,
  10.                                         //=0表示電機(jī)在停止?fàn)顟B(tài),可以按鍵正轉(zhuǎn)、反轉(zhuǎn)均可
  11.                                         //=1表示電機(jī)在運(yùn)行狀態(tài),不支持正反轉(zhuǎn)按鍵,只有先停止。防止強(qiáng)行換向帶來的電流過大。

  12. unsigned char Run_Dir,t;        //電機(jī)運(yùn)行方向
  13. unsigned char timer1;

  14. #define        F_DIR        0                //正轉(zhuǎn)
  15. #define        R_DIR        1                //反轉(zhuǎn)

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

  17. void Delayms(unsigned int xms)         //延時函數(shù)
  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)          //電機(jī)正轉(zhuǎn)
  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)         //電機(jī)反轉(zhuǎn)
  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)                                //任何時候按停止鍵,電機(jī)停止運(yùn)行
  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;        //電機(jī)正在停止的狀態(tài)標(biāo)志
  64.                         }
  65.                 }
  66.             else if(!CW && !Run_Status && (flag1&0xf0)==0x00)        //按正轉(zhuǎn)鍵同時電機(jī)不是正在運(yùn)行時,電機(jī)正轉(zhuǎn)運(yùn)行
  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;        //電機(jī)運(yùn)行方向正轉(zhuǎn)                                
  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)        //按反轉(zhuǎn)鍵同時電機(jī)不是正在運(yùn)行時,電機(jī)反轉(zhuǎn)運(yùn)行
  97.                 {
  98.                         Delayms(1);                //延時去抖動
  99.                         if(!CCW && !Run_Status)                        
  100.                         {        
  101.                                                                 if(t<1)
  102.                                                         {
  103.                                                        
  104.                                 Reversal();
  105.                                                         }
  106.                                 Run_Dir=R_DIR;        //電機(jī)運(yùn)行方向反轉(zhuǎn)
  107.                                 flagstop=0;
  108.                                                                 flag1 = 1;
  109.                                 Run_Status=1;        //電機(jī)正在運(yùn)行的狀態(tài)標(biāo)志

  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表示電機(jī)在停止?fàn)顟B(tài),可以按鍵正轉(zhuǎn)、反轉(zhuǎn)均可
  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++; //計(jì)數(shù)+1
  181. }
復(fù)制代碼
我想的是先低速啟動,然后再加速運(yùn)行,如果能夠直接快速啟動也行。


回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表