找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1905|回复: 2
打印 上一主题 下一主题
收起左侧

步进电机精确控制转度 单片机程序

[复制链接]
跳转到指定楼层
楼主
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. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1019158 发表于 2022-4-25 21:50 | 只看该作者
大佬您好,您这个我可以用proteus里的四相六线电机仿真吗?这个转过的最小角度就是(5.265/64)度嘛?
回复

使用道具 举报

板凳
ID:65369 发表于 2022-4-26 09:10 | 只看该作者
要用单片机自身的控制方式来控制,或者专用控制芯片细分才精准的, 这样程序直接控制,回转,但精度不高的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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