找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求指导 四相步进电机,如何在原来的基础上加上步数控制的设计思路和方法?

[复制链接]
跳转到指定楼层
楼主
ID:925099 发表于 2021-5-28 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求大神指导 已经能够实现方式选择,正反转,简单的加减速,步数显示,但仍需对步数控制的设计,例如默认初始步数为10,则通过按键可以加减步数,然后步进电机运行指定步数后停下。由于篇幅限制,仿真及程序在附件中

  1. #include<reg51.h>
  2. #include<stdio.h>
  3. void delay1(void);
  4. void delay2(void);
  5. void display(int);
  6. int bs=0;
  7. int cishu;
  8. main()
  9. {
  10.         char a,b,c,d,j,*q,
  11.         done1[8]=
  12.         {0x01,0x02,0x04,0x00,0x01,0x04,0x02,0x00},
  13.   done2[8]=
  14.   {0x03,0x06,0x05,0x00,0x03,0x05,0x06,0x00},
  15.   done3[14]=
  16.   {0x01,0x03,0x02,0x06,0x04,0x05,0x00,0x01,0x05,0x04,0x06,0x02,0x03,0x00};
  17.         P3=0x20;
  18.         delay1();
  19.         L:a=P3;
  20.                 while(!(a&0x08))
  21.                 {
  22.                         P3=0x20;
  23.                         a=P3;
  24.                         delay1();
  25.                 }
  26.                 if(a&0x01)
  27.                         q=done1;
  28.                 if(a&0x02)
  29.                         q=done2;
  30.                 if(a&0x04)
  31.                         q=done3;
  32.                 if(a&0x20)
  33.                         cishu=5;
  34.                 else cishu=50;
  35.                 if(a&0x10)
  36.                 {
  37.                         P3=0x40;
  38.                         b=0;
  39.                 }
  40.                 else
  41.                 {
  42.                         P3=0x80;
  43.                         if(a&0x04)
  44.                                 b=7;
  45.                         else b=4;
  46.     }
  47.                 d=b;
  48.                 while(1)
  49.                 {
  50.                         c=*(q+b);
  51.                         if(c==0)
  52.                                 b=d;
  53.                         else
  54.                         {
  55.                                 P1=c;
  56.                                 b++;
  57.                                 bs++;
  58.                                 display(bs);
  59.                                 j=a;
  60.                                 a=P3;
  61.                                 if(a!=j)
  62.                                 {
  63.                                         if(!(a&0x08))
  64.                                                 bs=0;
  65.                                         goto L;
  66.                                 }
  67.                         }
  68.                 }
  69.         }
  70.         void delay1()
  71.         {
  72.                 int i,j;
  73.                 for(i=0;i<200;i++)
  74.                 for(j=0;j<300;j++);
  75.         }
  76.         void display(int n)
  77.         {
  78.                 unsigned char tab[10]=
  79.                 {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67};
  80.                 unsigned char i,k,t,num[4];
  81.                         num[0]=n%10;
  82.                         num[1]=(n/10)%10;
  83.                         num[2]=(n/100)%10;
  84.                         num[3]=(n/1000)%10;
  85.                         for(t=0;t<cishu;t++)
  86.                         {
  87.                                 k=0x08;
  88.                                 for(i=0;i<4;i++)
  89.                                 {
  90.                                         P2=k;
  91.                                         P0=~(tab[num[i]]);
  92.                                         k=k>>1;
  93.                                         delay2();
  94.                                 }
  95.                         }
  96.                 }
  97.         void delay2()
  98.                 {
  99.                         int i,j;
  100.                         for(i=0;i<10;i++)
  101.                         for(j=0;j<60;j++);
  102.                 }
复制代码

单片机综合作业.rar (66.55 KB, 下载次数: 6)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:844772 发表于 2021-5-28 17:23 | 只看该作者
while(1)
                {
                        c=*(q+b);
                        if(c==0)
                                b=d;
                        else
                        {
                                P1=c;
                                b++;
                                bs++;
                                display(bs);
                                j=a;
                                a=P3;
                                if(a!=j)
                                {
                                        if(!(a&0x08))
                                                bs=0;
                                        goto L;
                                }
                        }
                }
你的while循环几次,就转几步的,你现在情况是有按键就停转,假如变量roteNum 保存转几步,你加一句在  if(a!=j)的前面就行了 : if(roteNum--)  goto L;   (前面怎么给roteNum 赋值我就不管了,还有我不赞成你程序的写法)
回复

使用道具 举报

板凳
ID:883698 发表于 2021-5-28 18:36 | 只看该作者
有一个步进电机控制软件,主要功能是:
1、可以分别控制3个步进电机运转
2、每个步进电机,转动一圈是 2048 步
3、三个步进可以任意输入不同步数运行
4、步进电机运行时,可以实时读取当前电机位置

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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