找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7229|回复: 15
收起左侧

单片机如何控制步进电机停止

  [复制链接]
ID:265318 发表于 2018-1-16 12:08 | 显示全部楼层 |阅读模式
我个人猜想的是用TR0=0来暂停但是没用。。。求大佬看看
void main(void)
{ u16 j,i;
time();       

       
        j=0;
        for(i=0;i<64;i++)
          {P1=0x00;
           P1=FFW[j];
           j++;
           if(j>=8) j=0;
           delay(500);
           }
           TR0=0;
}       
这个是我实现步进电机动起来的部分

          
       
       


评分

参与人数 1黑币 +4 收起 理由
hahahahh + 4 很给力!

查看全部评分

回复

使用道具 举报

ID:164602 发表于 2018-1-16 13:32 | 显示全部楼层
不发脉冲就可以让步进电机不转动。
回复

使用道具 举报

ID:265318 发表于 2018-1-16 14:36 来自手机 | 显示全部楼层
HC6800-ES-V2.0 发表于 2018-1-16 13:32
不发脉冲就可以让步进电机不转动。

大佬,我的i只循环64次,也就是说64次脉冲后应该就停了啊>_<可是完全停不下来了啊
回复

使用道具 举报

ID:193818 发表于 2018-1-16 15:54 | 显示全部楼层
time()和你后面一大段代码有关系么?     TR0=0
回复

使用道具 举报

ID:276604 发表于 2018-1-16 15:55 | 显示全部楼层
感觉你是8位并口 操作 。
第一你得确定你的端口位。
第二你的FFW[j]数据逻辑对不对。这里你的循环就错了  if(j>=8) j=0;  多执行了一次。
回复

使用道具 举报

ID:193818 发表于 2018-1-16 15:55 | 显示全部楼层
TR0=0?你是打算关掉定时器?可是跟你控制步进电机的程序有关系么
回复

使用道具 举报

ID:164602 发表于 2018-1-16 16:35 | 显示全部楼层
zjjmw 发表于 2018-1-16 14:36
大佬,我的i只循环64次,也就是说64次脉冲后应该就停了啊>_

看我的:
  1. #include <reg52.h>

  2. #define Rotation P1//步进电机,只用低四位
  3. unsigned char code FFW1[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9};
  4. unsigned char code FFW2[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1};

  5. sbit k1=P3^1;                //以下四个为独立键盘
  6. sbit k2=P3^0;
  7. sbit k3=P3^2;
  8. sbit k4=P3^3;

  9. unsigned int Time;
  10. unsigned int jd;
  11. bit k=0,key1=0,key2=0;

  12. void Delay10ms(unsigned int c)
  13. {
  14.     unsigned char a,b;
  15.     for(c;c>0;c--)
  16.         for(b=38;b>0;b--)
  17.             for(a=130;a>0;a--);
  18. }

  19. void Delay(unsigned int i)
  20. {
  21.         while (--i);
  22. }

  23. void  Motor()//电机旋转子函数
  24. {
  25.         unsigned char i;
  26.         for(i=0;(i<8);i++)
  27.         {
  28.                 if (jd==0)        //jd为0则停转
  29.                 {
  30.                         Rotation=0xf0;
  31.                         break;
  32.                 }
  33.                 if (k==0)
  34.                 {
  35.                         Rotation=FFW2[i];//输出正转的相
  36.                 }               
  37.                 else
  38.                 {
  39.                         Rotation=FFW1[i];//输出反转的相
  40.                 }
  41.                 Delay(Time);//最小120,最快
  42.                 jd--;
  43.                                                         
  44.         }
  45. }

  46. void main()
  47. {        
  48.         unsigned char m;
  49.         m=0;
  50.         Time=255;
  51.         jd=20480;//可以转5圈
  52.         while(1)
  53.         {
  54.                
  55.                 if(k1==0)
  56.                 {
  57.                         Delay10ms(1);
  58.                         if(k1==0)
  59.                         {
  60.                                 if (key1==0)//按第奇数次,正转,偶数次反转
  61.                                 {
  62.                                         Time=105;
  63.                                         k=0;//正转
  64.                                         jd=20480;
  65.                                         key1=1;
  66.                                 }
  67.                                 else
  68.                                 {
  69.                                         Time=105;
  70.                                         k=1;//反转
  71.                                         jd=20480;
  72.                                         key1=0;
  73.                                 }

  74.                                 while((m<50)&&(k1==0))
  75.                             {
  76.                                     Delay10ms(1);
  77.                                     m++;
  78.                             }
  79.                             m=0;
  80.                         }
  81.                 }

  82.                 if(k2==0)
  83.                 {
  84.                         Delay10ms(1);
  85.                         if(k2==0)
  86.                         {
  87.                                 if (key2==0)//按奇数次转180度,偶数次90度
  88.                                 {
  89.                                         Time=255;
  90.                                         k=1;
  91.                                         jd=2048;
  92.                                         key2=1;
  93.                                 }
  94.                                 else
  95.                                 {
  96.                                         Time=205;
  97.                                         k=0;
  98.                                         jd=1024;
  99.                                         key2=0;
  100.                                 }

  101.                                 while((m<50)&&(k2==0))
  102.                             {
  103.                                     Delay10ms(1);
  104.                                     m++;
  105.                             }
  106.                             m=0;
  107.                         }
  108.                 }

  109.                 if(k3==0)
  110.                 {                                                         
  111.                         Delay10ms(1);
  112.                         if(k3==0)
  113.                         {
  114.                                 
  115.                                 Time=Time+100;//最大500
  116.                                 if (Time>505)
  117.                                 {
  118.                                         Time=505;
  119.                                 }
  120.                                 jd=20480;

  121.                                 while((m<50)&&(k3==0))
  122.                             {
  123.                                     Delay10ms(1);
  124.                                     m++;
  125.                             }
  126.                             m=0;
  127.                         }
  128.                 }

  129.                 if(k4==0)
  130.                 {
  131.                         Delay10ms(1);
  132.                         if(k4==0)
  133.                         {

  134.                                 Time=Time-100;//最小105
  135.                                 if (Time<105)
  136.                                 {
  137.                                         Time=105;
  138.                                 }
  139.                                 jd=20480;

  140.                                 while((m<50)&&(k4==0))
  141.                             {
  142.                                     Delay10ms(1);
  143.                                     m++;
  144.                             }
  145.                             m=0;
  146.                         }
  147.                 }
  148.                 Motor();
  149.         }
  150. }
复制代码

这是我多年前做步进电机试验时的程序,现在看起来很“小儿科”。不过,正反转动、加速减速都有。
适用电路:
1.jpg

2.jpg

回复

使用道具 举报

ID:111634 发表于 2018-1-16 21:18 | 显示全部楼层
要停还不简单?断电就是了!
回复

使用道具 举报

ID:84283 发表于 2018-1-16 21:45 | 显示全部楼层
TR0是51单片机定时器T0的开定时器位,有可能你的用到了中断了 你还是把所有的程序贴出来看看把
回复

使用道具 举报

ID:265318 发表于 2018-1-17 17:10 来自手机 | 显示全部楼层
漫步经心 发表于 2018-1-16 15:55
TR0=0?你是打算关掉定时器?可是跟你控制步进电机的程序有关系么

哈,这个跟定时器没关嘛>_<
回复

使用道具 举报

ID:275764 发表于 2018-1-17 17:24 | 显示全部楼层
通过pwm控制,不给pwm
回复

使用道具 举报

ID:277171 发表于 2018-1-17 21:53 | 显示全部楼层
没有方波信号输出时,步进电机不会转的
回复

使用道具 举报

ID:276587 发表于 2018-1-18 16:57 来自手机 | 显示全部楼层
学习大神资料
回复

使用道具 举报

ID:265318 发表于 2018-1-18 20:55 | 显示全部楼层
st_zaiyuzhong 发表于 2018-1-17 17:24
通过pwm控制,不给pwm

emmm我才知道pwm。。。是个啥,学习下
回复

使用道具 举报

ID:736290 发表于 2020-4-23 17:05 | 显示全部楼层
请问下是如何控制步进电机停止的呢
回复

使用道具 举报

ID:736367 发表于 2020-4-23 18:15 | 显示全部楼层
步进电机是靠脉冲控制的,如果你不给脉冲,自然就停下来了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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