登录|立即注册|使用QQ帐号登录
论坛 > 51单片机
发帖|
看2205|回3|收藏
楼主 ID:1020716 只看他
2022-4-22 16:26
4相步进电机
精确控制转度
尽管用

代码:

  1. #include  "reg51.h"
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char

  5. sbit MA=P1^0;
  6. sbit MB=P1^1;
  7. sbit MC=P1^2;
  8. sbit MD=P1^3;

  9. void Delay1ms()     //@11.0592MHz
  10. {
  11.     unsigned char i, j;

  12.     _nop_();
  13.     _nop_();
  14.     _nop_();
  15.     i = 11;
  16.     j = 190;
  17.     do
  18.     {
  19.         while (--j);
  20.     } while (--i);
  21. }

  22. void delay(uint time)//延时time ms
  23. {
  24.     while(time--)
  25.     {Delay1ms();}
  26. }

  27. /*
  28. angle:角度,范围[0,360]
  29. drct:旋转方向,0:顺时针,1:逆时针
  30. speed:转速,范围[1,100]
  31. */
  32. void MotorRun(uint angle,uint drct,uint speed)
  33. {
  34.     uint step,nangle;
  35.     step=0;
  36.     nangle=512*angle/45;//将角度换算成拍数,计算结果自动取整
  37.     if(drct==0)
  38.     {
  39.         while(nangle--)
  40.         {
  41.             switch(step)//8拍方式驱动,每拍转(5.265/64)度
  42.             {
  43.                 case 1:MA=1;MB=1;MC=0;MD=0;break;
  44.                 case 2:MA=0;MB=1;MC=0;MD=0;break;
  45.                 case 3:MA=0;MB=1;MC=1;MD=0;break;
  46.                 case 4:MA=0;MB=0;MC=1;MD=0;break;
  47.                 case 5:MA=0;MB=0;MC=1;MD=1;break;
  48.                 case 0:MA=1;MB=0;MC=0;MD=0;break;
  49.                 case 6:MA=0;MB=0;MC=0;MD=1;break;
  50.                 case 7:MA=1;MB=0;MC=0;MD=1;break;
  51.             }
  52.             if(step==7)step=0;
  53.             else step++;

  54.             if(speed>100)speed=100;
  55.             delay(110-speed);//这里可以适当改动,延时时间短则转速快,但是时间太短会造成电机堵转(不转了)
  56.         }
  57.     }
  58.     else
  59.     {
  60.         while(nangle--)
  61.         {
  62.             switch(step)
  63.             {
  64.                 case 0:MA=1;MB=0;MC=0;MD=1;break;
  65.                 case 1:MA=0;MB=0;MC=0;MD=1;break;
  66.                 case 2:MA=0;MB=0;MC=1;MD=1;break;
  67.                 case 3:MA=0;MB=0;MC=1;MD=0;break;
  68.                 case 4:MA=0;MB=1;MC=1;MD=0;break;
  69.                 case 5:MA=0;MB=1;MC=0;MD=0;break;
  70.                 case 6:MA=1;MB=1;MC=0;MD=0;break;
  71.                 case 7:MA=1;MB=0;MC=0;MD=0;break;
  72.             }
  73.             if(step==7)step=0;
  74.             else step++;
  75.             if(speed>100)speed=100;
  76.             delay(110-speed);//这里可以适当改动,延时时间短则转速快,但是时间太短会造成电机堵转(不转了)
  77.         }
  78.     }
  79.     MA=0;MB=0;MC=0;MD=0;
  80. }

  81. void main()
  82. {
  83.     while(1)
  84.     {
  85.         MotorRun(90,0,100);
  86.         delay(500);
  87.     }
  88. }


沙发 ID:1019158 只看他
2022-4-25 21:50
大佬您好,您这个我可以用proteus里的四相六线电机仿真吗?这个转过的最小角度就是(5.265/64)度嘛?
板凳 ID:65369 只看他
2022-4-26 09:10
要用单片机自身的控制方式来控制,或者专用控制芯片细分才精准的, 这样程序直接控制,回转,但精度不高的

51黑电子论坛

Powered by Discuz! X3.1

首页|标准版|触屏版|电脑版