微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 急急急~!关于数码管和步进电机如何同步的问题~!

急急急~!关于数码管和步进电机如何同步的问题~!

时间:10-02 整理:3721RD 点击:

我在做设计的时候发现一个问题,就是如果我把一个5线4相的步进电机接到P1口,数码管(二位)接到P0口,怎样才可以在步进电机转的同时,数码管在倒计时呢?PS:两个器件是直接接到IO口的,只是数码管接了一个锁存器~!~!~!~!急急急,,请大虾们解救一下~!谢谢

完全没问题的啊,用到定时器中断,不要都用延时函数。

可以说说过程吗?我初学单片机的,不太懂~!

步进电机一启动 触发定时器 开始计时并显示!

我用的是5线4相的步进电机哦~!相不是要轮流通电才可以旋转的啊?

无聊~!没有点实际行动~!~!~!~!~!~!~!~!~!

是的是要轮着来通电的!

小编,现在解决了吗?让咱也学习学习啊

就是呀~!同一时间控制两个器件,怎么弄,不懂哦~!

没有呢~!帮忙问问有什么解决的方法没有~!

行,晚点我问问我们这的大神

不是同时是分时 只不过时间比较快而已!

小编是否使用了,定时中断?

小编还没解决?我作为一个见习大神决定打救你。
你的数码管和步进电机不能同时工作是因为你两个都用到了延时函数。电机转动的时候。数码管就不能正常显示。
因此你可以用到定时器来解决这个问题。因为我手头没有完整的程序我只能给你讲个思路。具体的程序还得你自己写。
步进电机工作是不断

  1. void TimeInterrupt() interrupt 1         
  2. {
  3.         TH0 = 0xfe;    //重装初值
  4.         TL0 = 0x33;

  5.         if( CT++==speed)         //每进一次中断CT.直到CT和设定的初速度
  6.         {
  7.                 CT=0;                   //清零,重新计数
  8.                Motor()                  //调用电机驱动函数
  9.         }        
  10. }

复制代码

上面就是定时器中断处理函数。他是没到一定的时间就运行一次电机驱动函数。如果想实现调速,在主函数中改变speed的值就实现调速功能。

  1. void Motor()
  2. {
  3.     switch(MotorStep)
  4.     {
  5.             case 0:                                        // A                                    
  6.                 a = 0;                    //0xf1  
  7.                 b = 1;
  8.                 c = 1;
  9.                 d = 1;
  10.                 MotorStep = 1;
  11.                 break;

  12.             case 1:                 // AB        
  13.                 a = 0;                   //0xf3
  14.                 b = 0;
  15.                 c = 1;
  16.                 d = 1;
  17.                 MotorStep = 2;
  18.                 break;

  19.             case 2:           //B
  20.                 a = 1;
  21.                 b = 0;                  //0xf2
  22.                 c = 1;
  23.                 d = 1;
  24.                 MotorStep = 3;
  25.                 break;

  26.            case 3:                //BC
  27.                 a = 1;
  28.                 b = 0;                    //0xf6
  29.                 c = 0;
  30.                 d = 1;
  31.                 MotorStep = 4;
  32.                 break;

复制代码

上面就是步进电机的驱动函数。他每次都只运行一步。下一次调用这个函数时就运行下一步。循环运行八步实现驱动电机转动。
因为步进电机驱动是在中断里面实现的。因此不会影响主函数的运行。因此数码管就不会出现闪烁或显示不正常的现象。

如果可以,把程序发过来看一下,用定时中断时,在主程序中因为判断无法和中断同步,所以可能造成电机和数码管不同时

哇!太感谢你了,我回去试试哈,可以的话,我发个程序出来哈~!

我数码管是用了定时的,数码管的在段选的时候用了延时,在电机的旋转过程中主要也是用了延时,就像我们的见习大神说的如果电机的延时用定时器中断的话,我还要好好看看研究一下。本来我是想把我的程序放上去,好让大神们帮我找找毛病,但是我是用汇编语言写的,篇幅太长,所以就没有发上来,如果实现了的话,会发到论坛上分享。

数码管用定时器也是可以的。只要不是电机和数码管同时延时就行了。思路就是这样。我也没有完整的程序给你参考。汇编语言的程序可读性实在是太差了。以前我也是用汇编编程c不会。现在会c就不想用汇编了。C语言编程还是很简单的,会一些基本的东西编单片机完全没问题了。以后还是习惯用c吧。

好的~!谢谢你的指导~!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top