找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2162|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+L298驅(qū)動(dòng)步進(jìn)電機(jī)運(yùn)轉(zhuǎn)不穩(wěn)定

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:516452 發(fā)表于 2019-5-14 09:15 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
50黑幣
我的步進(jìn)電機(jī)正轉(zhuǎn)穩(wěn)定反轉(zhuǎn)不穩(wěn)定,老師 說是頻率不對(duì),輸出的波形可能有偏差,讓我改程序,可是我不知道要怎么改程序才能輸出正確的波形,我是用51單片機(jī)和 L298驅(qū)動(dòng)模塊控制兩相步進(jìn)電機(jī),求大神指點(diǎn)

單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int

  4. sbit RS=P2^0;
  5. sbit RW=P2^1;
  6. sbit E=P2^2;

  7. sbit key1=P3^2;
  8. //sbit key2=P3^3;
  9. //sbit key3=P3^4;

  10. #define RIGHT_RUN 1      //正轉(zhuǎn)值
  11. #define LEFT_RUN 0       //反轉(zhuǎn)值

  12. static unsigned int count;
  13. static unsigned int endcount;
  14. uchar flag;
  15. //八拍驅(qū)動(dòng)方式正轉(zhuǎn)表 A-B---> B- --> B-A --> A --> AB --> B
  16. // --> BA- --> A- --> A-B-
  17. ucharupstep8_table[]={0x05,0x01,0x09,0x08,0x0A,0x02,0x06,0x04};


  18. char SpeedChar[]="SPEED(n/min):";
  19. char StateChar[]="RUN SET:";
  20. char STATE_CW[]=" FAN ";
  21. char STATE_CCW[]="ZHENG";
  22. char SPEED[3]="999";
  23. uchar RunState=LEFT_RUN;  //運(yùn)行狀態(tài)標(biāo)志位
  24. //******************************
  25. //     步進(jìn)電機(jī)停止函數(shù)
  26. //作用:停止
  27. //******************************
  28. void MotorStop(void)
  29. {
  30.     P1= 0x00;
  31. }


  32. //******************************
  33. //     外部中斷0初始化函數(shù)
  34. //作用:初始化外部中斷
  35. //******************************
  36. void Interrupt0_Init()
  37. {
  38.     EA= 1;
  39.     TMOD= 0x11;
  40.     ET0= 1;

  41. //  TH0=0xFF;
  42. //  TL0=0x28;
  43.     TH0=(65536-500)/256;
  44.     TL0=(65536-500)%256;

  45.     TR0=1;
  46. }
  47. //******************************
  48. //
  49. //延時(shí)i ms
  50. //******************************
  51. void delay(uint ims)
  52. {
  53.     endcount=ims;
  54.     count=0;
  55.     do{}while(count<endcount);
  56. }

  57. //******************************
  58. //     步進(jìn)電機(jī)驅(qū)動(dòng)函數(shù)
  59. //作用:通過變量var控制電動(dòng)機(jī)的轉(zhuǎn)速高低,通過變量state判斷電動(dòng)機(jī)的正反轉(zhuǎn)
  60. //         state:0 正轉(zhuǎn),state: 1 反轉(zhuǎn)
  61. //使用8拍能夠?qū)崿F(xiàn)比較平滑的轉(zhuǎn)動(dòng),使用4拍時(shí)電機(jī)震動(dòng)比較大。
  62. //******************************
  63. void MotorSpeedOrDirection(uint var, ucharstate)
  64. {
  65.     uchari=0;
  66.     if(!state)
  67.     {
  68.        for(i=0;i<8; i++)
  69.        {
  70.            P0=upstep8_table[ i];
  71.            delay(var);
  72.        }
  73.     }
  74.     else
  75.     {
  76.        for(i=7;i>0; --i)
  77.        {
  78.            P0=upstep8_table[ i];
  79.            delay(var);
  80.        }
  81.     }
  82. }
  83. //******************************
  84. //     中斷處理函數(shù)
  85. //作用:定時(shí)器0的中斷處理
  86. //******************************
  87. void timeint(void) interrupt 1
  88. {
  89. //  TH0=0xFF;
  90. //  TL0=0x28;   //216----234us
  91. //  定時(shí)器定時(shí)1ms
  92.     TH0=(65536-500)/256;
  93.     TL0=(65536-500)%256;
  94.     count++;
  95. }
  96. //液晶
  97. void clock(unsigned int Delay)   //1ms延時(shí)程序
  98. {  
  99.     unsignedint i;
  100.   for(;Delay>0;Delay--)
  101.    for(i=0;i<124;i++);     
  102. }
  103. void wcm(unsigned char com)//寫命令
  104. {
  105.     RS=0;
  106.     E=0;
  107.     P1=com;
  108.     clock(5);
  109.     E=1;
  110.     clock(5);
  111.     E=0;
  112. }
  113. void wd(unsigned char date)//寫數(shù)據(jù)
  114. {
  115.     RS=1;
  116.     E=0;
  117.     P1=date;
  118.     clock(5);
  119.     E=1;
  120.     clock(5);
  121.     E=0;
  122. }
  123. void shuzu(unsigned char *c)
  124. {
  125.     while((*c)!='\0')
  126.     {
  127.       wd(*c);
  128.       c++;
  129.     }
  130. }
  131. void ShowState()    //顯示狀態(tài)與速度
  132. {
  133.    if(RunState==RIGHT_RUN)
  134.        {
  135.               wcm(0x80+0x40+9);
  136.               wd('Z');
  137.        }
  138.    else
  139.        {
  140.               wcm(0x80+0x40+9);
  141.               wd('F');
  142.        }
  143. }
  144. void inti_lcd()//初始化
  145. {
  146.     RW=0;
  147.     wcm(0x38);
  148.     wcm(0x0c);
  149.     wcm(0x06);
  150.     wcm(0x01);
  151. }
  152. void main()
  153. {
  154.     unsignedint sum=0;
  155.     P1= 0x00;
  156.     count= 0;
  157.     Interrupt0_Init();
  158.     inti_lcd();      
  159.     wcm(0x80);
  160.        shuzu(SpeedChar);
  161.        wcm(0x80+13);
  162.        shuzu(SPEED);
  163.       wcm(0x80+0x40);
  164.        shuzu(StateChar);
  165.     while(1)
  166.     {
  167.            if(key1==0)
  168.            {
  169.                delay(5);
  170.               if(key1==0)//確認(rèn)功能鍵被按下
  171.               {  
  172.                   flag++;//功能鍵按下次數(shù)記錄
  173.                   while(!key1);//釋放確認(rèn)
  174.                   if(flag==3)
  175.                      flag=0;
  176.               }
  177.            }
  178.               if(flag==0)
  179.            {
  180.                MotorStop();
  181.            }         
  182.               if(flag==1)
  183.            {
  184.               RunState=RIGHT_RUN;  
  185.               MotorSpeedOrDirection(1,0);
  186.            }            
  187.            if(flag==2)
  188.            {
  189.               RunState=LEFT_RUN;
  190.               MotorSpeedOrDirection(1,1);
  191.            }   
  192.            //ShowState();
  193.     }
  194. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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