微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 步进电机一个角度来回摆动是怎么回事?

步进电机一个角度来回摆动是怎么回事?

时间:10-02 整理:3721RD 点击:
今天买了一套步进电机开发仪,设计了一套四键控制步进电机启动正反转加减速的程序,结果电机老是在一个角度来回摆动,不知道是不是我程序的问题,程序如下:
/*----------------------------------------------------
        名称:两相步进电机控制程序
        单片机:stc12c2052
        晶振:12M
        按键:四个按键分别接P3的0,1,2,3端口
        输出:P1的0,1,2,3端口,4拍方式运转
        内容:用四个按键控制步进电机启停,正反转和速度加减
        注意:当碰到电机振动而不转动时,可把中断时间调长些或
                        改变速度调节变量的初始值降低速度
------------------------------------------------------*/
#include<reg52.h>                //头文件
#define KeyPort P3        //定义P3为键盘端口
sbit A1=P1^0;        //定义A线圈正端口
sbit A2=P1^1;        //定义A线圈负端口
sbit B1=P1^2;        //定义B线圈正端口
sbit B2=P1^3;        //定义B线圈负端口
#define Coil_A1   {A1=0;A2=1;B1=1;B2=1;}  //A线圈通正向电压
#define Coil_B1   {A1=1;A2=1;B1=0;B2=1;}        //B线圈通正向电压
#define Coil_A2   {A1=1;A2=0;B1=1;B2=1;}  //A线圈通反向电压
#define Coil_B2   {A1=1;A2=1;B1=1;B2=0;}        //B线圈通反向电压
#define Coil_OFF  {A1=1;A2=1;B1=1;B2=1;}  //全部断电
unsigned char Speed=1;        //速度调节变量
unsigned int b=5000;        //中断初值变量
bit Flag1;        //启停标志位
bit Flag2;        //正反转标志位
void DelayMs (unsigned int a)        //大致1ms延时
{
        unsigned int i;                        //无符号整型局部变量
        while(a--!=0)                       
        {
                for(i=0;i<600;i++);       
        }
}
unsigned char KeyScan(void)//按键扫描函数,返回扫描键值
{
        unsigned char Keyvalue;        //无符号字符型变量
        if(KeyPort!=0xff)                        //判断P3口是否有按键按下
        {
                DelayMs(10);                        //按键去抖
                if(KeyPort!=0xff)                //再次判断
                {
                        Keyvalue=KeyPort;                //赋值
                        while(KeyPort!=0xff);//等待按键松开
                        switch(Keyvalue)                //读取按键,提取返回值
                        {
                                case 0xfe:return 1;break;        //第一个键按下,返回1
                                case 0xfd:return 2;break;        //第二个键按下,返回2
                                case 0xfb:return 3;break;        //第三个键按下,返回3
                                case 0xf7:return 4;break;        //第四个键按下,返回4
                                default:return 0;break;                //条件不符合,返回0
                        }
                }       
        }
        return 0;        //没按键按下返回0       
}
void Init_Timer0(void)        //初始化定时器0
{
        TMOD=0x01;                                //定时器0,使用模式1,16位定时器
        TH0=(65536-b)/256;        //给定初值
        TL0=(65536-b)%256;
        EA=1;                //打开总中断
        ET0=1;        //打开定时器中断
        TR0=1;        //开定时器
}
void main()        //主函数
{
        unsigned int num;        //无符号整型变量
        Init_Timer0();                //初始化定时器0
        Coil_OFF                                //全部断电
        while(1)                                //大循环
        {
                num=KeyScan();        //循环调用按键扫描
                if(num==1)                //启停按键
                        Flag1=!Flag1;        //取反
                else        if(num==2)        //正反转按键
                                        Flag2=!Flag2;                //取反
                                else if(num==3)                //减速按键
                                          {
                                                          if(Speed<10)        //判断速度调节变量的值
                                                        {
                                                                Speed++;                //变量自加1,数值越大速度越慢
                                                                b+=100;                //每次速度等级加1中断时间加,一是为了低速调节时速度等级更明显,       
                                                        }                                        //二是增加了速度调节范围
                                          }
                                          else if(num==4)                //加速按键
                                                     {
                                                       if(Speed>1)//判断速度调节变量的值
                                                                 {
                                                                    Speed--;        //变量自减1
                                                                         b-=100;        //每次速度等级减1中断时间减
                                                                 }
                                                     }                                               
        }
}
void Timer0_isr(void) interrupt 1        //定时器中断子程序
{
        static unsigned char times,i;                //静态局部变量
        TH0=(65536-b)/256;        //重新赋值
        TL0=(65536-b)%256;
        if(Flag1==0)                        //停转标志
                Coil_OFF                                //全部断电
        else if(Flag1==1)                //启动标志
                        {
                                if(times>Speed)        //防止调节加速按键时Speed<times
                                        times=0;                        //中断次数置0,重计中断次数
                                else if(times==Speed)        //中断次数与速度变量相等
                                                {
                                                        times=0;                        //中断次数置0,重计中断次数
                                                        if(Flag2==1)        //正转标志
                                                        {
                                                                switch(i)
                                                                {
                                                                        case 0:Coil_A1;i++;break;        //通电次序:+A,+B,-A,-B
                                                                        case 1:Coil_B1;i++;break;
                                                                        case 2:Coil_A2;i++;break;
                                                                        case 3:Coil_B2;i=0;break;
                                                                        default:break;
                                                                }                       
                                                        }
                                                        else if(Flag2==0)                //反转
                                                                        {
                                                                                switch(i)
                                                                                {
                                                                                        case 0:Coil_B1;i=3;break;
                                                                                        case 1:Coil_A2;i--;break;
                                                                                        case 2:Coil_B2;i--;break;
                                                                                        case 3:Coil_A1;i--;break;
                                                                                        default:break;
                                                                                }                       
                                                                        }                                                       
                                                }
                                                else times++;        //每次中断加1
                        }
}

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

网站地图

Top