步进电机的调速

继续继续。

步进电机转速控制

一、  任务

在SMSpeed.DSN的电路上实现:当KEY2按下时,电机停止转动,释放时继续转动。当KEY1按下时,电机以60转/min的转速正转,释放时以120转/min的转速反转。

二、  设计参考:

① 4相步进电机,每顺序切换一相(1步),电机旋转18°,电机转动1圈共需要20步。

② 用定时实现对电机转速的控制(当转速为60转/min时,步进时间间隔为50ms;当转速为120转/min时,步进时间间隔为25ms)。中断服务程序步骤如下:

If(KEY1按下)

{

     重置定时时间为50ms;

     正转切换到下一步;

}

Else

{

     重置定时时间为25ms

     反转切换到下一步;

}

③ 对于TX定时器,若其GATE=1且TRX=1时,则外部信号(INTX)可直接实现对TX定时器的运行控制(从而实现对电机转动与停止的控制)。

芯片2003不用管可以直接看IO口,长条那个数码管是用来计数的然后可以看出频率。

我的设计思路:

驱动步进电机:依次给电机的4根线低电平就可以动了,我用了简单的位操作,时间关系不多说。

按键设计:这里接在中断,我设计的可能比较复杂。

                按键1:我设置的是低电平触发,一直按着就一直进去跑中断的代码。出来后主函数还有个判断就执行另一功能。

               按键2:低电平触发,中断函数啥也不干,一直按着就相当于卡在中断里,就暂停了嘛。

因为涉及了几个中断服务所以设置一下优先级,不然按着暂停 电机还飞快的跑,将定时器的优先级设置成最低就行了。

#include  "reg51.h"

char count = 0;                      //计数标志位
char LED = 0;                        
unsigned char dir = 0;             //第几步的标志位
unsigned char sign_num = 50;       //每步时间的标志位
char num_Switch = 0;               //程序选择位
sbit key2 = P3^3;
sbit key1 = P3^2;

void delay50ms(void)   //?? 0us
{
    unsigned char a,b;
    for(b=165;b>0;b--)
        for(a=150;a>0;a--);
}

void TIMER_Init()
{
    TMOD = 0x10;                //定时器1,方式1
    TH1 = 0xFC;                 // 初始值1MS进入一次中断
    TL1 = 0x18;
    TR1= 1;
    ET1 = 1;
    
    IT0 = 0;                    //两个INT都设置成低电平出发
    EX0 = 1;
    IT1 = 0;
    EX1 = 1;
    EA = 1;
    
    PT1 = 0;                   //设置定时器位最低优先级
    PX0 = 1;                  //设置INT0为高优先级,这句可以不要吧嘿嘿
}

void zhengzhuan()                         //正转函数
{
 LED = ~(0x01<<dir);    P1 = LED;
}

void fanzhuan()                           //反转函数
{
 LED = ~(0x10>>dir);    P1 = LED;
}

void main()
{
TIMER_Init();
LED = 0xff;              //初始化LED值
while(1)
{
    if(key1==0) num_Switch = 1;                   
    switch(num_Switch)                         //选择运行的程序
    {
      case 0 : zhengzhuan();break;
      case 1 : fanzhuan();sign_num = 25;break;  
    }
}

}
void int0() interrupt 0    //按键1
{    
    while(key1==0)
    {
        zhengzhuan();
        dir++;
       if(dir>3)dir=0;
       delay50ms();         //延时来控制电机转动速度
    }
}    

void int1() interrupt 2   //按键2
{

}    

void PWM() interrupt 3    //定时器中断
{
    TH1 = 0xFC;
    TL1 = 0x18;
    count++;     
    if(dir>3)dir=0;       //每走4步一个轮回
    if(count == sign_num) //每走一步的时间
    {
        dir++;
        count = 0;
    }
}

OK写完了。







猜你喜欢

转载自blog.csdn.net/qq_31131773/article/details/80605522