原创 MCS-51学习小结之步进电机

2010-5-4 12:21 4683 12 13 分类: MCU/ 嵌入式

MCS-51学习小结之步进电机<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


步进电机是进行定位控制的工具之一,用起来非常方便,它每次接收到一组脉冲数字信号时,便旋转一个角度。可以正方向转,也可以反向转。它的转速和停止的位置只取决于输入脉冲信号的频率和脉冲数,而不受负载变化的影响。这一线性关系的存在,使得在速度、定位等控制领域用步进电机来控制变的非常的简单。


步进电机原理图如下图:


075bfd3f-1451-45bb-9e5f-39d1f1dd5f83.jpg


步进电机控制系统的组成如下图所示:


338a6b52-6a9a-4341-884f-be86af9a57fd.jpg


步进电机的控制需要解决三个问题:


(1)首先确定电机的旋转方向;


2)然后按顺序传送控制脉冲;


3)最后检测实际的步进数。


以前一直觉得步进电机应该比较简单,就是不愿意动手调试一下,刚好现在手头有一个步进电机,放着也是放着,于是乎把控制程序写了一下,左改改右改改,最后基本可以按照自己的意思转了,但是改了几次之后,第二天发现我的步进电机“罢工”了,它不转了!我怀疑是驱动芯片出了毛病,或者直接给烧了,90%确定不是程序的原因。我用的的电机如下图,


d7bf8411-f2d3-4df5-9909-9bc59c80ee08.jpg 0ba84b84-55d0-4e0c-bb70-8f63b3f5f018.jpg


它属于28BYJ48型四相八拍电机,工作电压为直流5~12V,当对步进电机施加一组连续不断的控制脉冲时,它可以连续不断地转动。每一个脉冲信号对应步进电机的某一相或两相绕组的通电状态改变一次,也就对应转子转过一定的角度。


其相序表为:


点击看大图


下面把我修改好的代码搬上来,虽然功能不是很完全(没有写计数和显示模块程序),但还是留个纪念,告诉自己曾经调试过步进电机,嘿嘿。


 


#include "reg52.h"       


#include "intrins.h"  



#define uchar unsigned char


#define uint  unsigned int



uchar code zhenzhuan[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //正转相序。  


uchar code fanzhuan[] ={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01}; //反转相序。   



sbit  K1   = P1^4;      


sbit  K2   = P1^5;       


sbit  K3   = P1^6;       


sbit  BEEP = P3^6;  


uchar num,i;                  


//************************************************


void delay(uint z) //大概1ms


{


    uint x,y;


    for(x=z;x>0;x--)


     for(y=110;y>0;y--);


}


//************************************************


void beep() //蜂鸣器提示。


{


    delay(1);


    BEEP=0;


    delay(100);                 


    BEEP="1";                   


 }


//************************************************


void foreward() //电动机正转。



    for(i=0;i<255;i++)


    {


        for(num=0;num<8;num++)       


        {


            if(K3==0)


            {


                break;


            }   


            P1 = zhenzhuan[num];


            delay(2);


        }


    }


}


//************************************************


void  rollback() //电动机反转。


{


    for(i=0;i<255;i++)


    {


        for(num=0;num<8;num++) 


        {


            if(K3==0)


            {


                break;


            }   


            P1 = fanzhuan[num];


            delay(2);


        }


    }


}       


//************************************************


int0() interrupt 0    //外中断0


{


    uchar i;


    for(i=0;i<1;i++)


    {


        beep();


        P1 = 0xff;


        break; //外中断触发使得电机停转,以此达到定位的目的。


    }


}


//************************************************


void main()   //主程序。



    IT0=1;    //外中断跳变沿方式触发中断。


    EX0=1;    //打开外部中断0


    EA="1";     //打开总中断。


    while(1)


    {  


        if(K1==0) //K1键按下则电机正转。


        {


            beep();


            foreward();


        }



        if(K2==0) //K2键按下则电机反转。


       


            beep();


            rollback();


        }


        else  


            P1 = 0xff;


    }


}


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户309384 2011-5-8 21:19

借来参考一下
相关推荐阅读
用户1528479 2011-04-12 21:50
设计第一个六层板所得到的一个深刻体会
        今天中午,由于确实有点困,于是乎仰躺在座椅上眯了半个小时的眼,睡眼朦胧中,好消息随即到来——我的第一个六层板从深圳寄到长沙了!而且元器件都已经由深圳那边的人焊接好了,拆开包装袋一看,简...
用户1528479 2011-03-25 15:28
DDR2 SDRAM×32布局、布线经验谈
最近忙于一块以CycloneIII为核心主控芯片的六层板设计,开发环境是Capture+Allegro+CAM350,从原理图修改到PCB的布局、布线这整个过程中我遇到了相当多的问题,值得庆幸的是...
用户1528479 2011-03-25 13:30
DDR2 SDRAM×32布局、布线经验谈
DDR2 SDRAM×32布局、布线经验谈最近忙于一块以CycloneIII为核心主控芯片的六层板设计,开发环境是Capture+Allegro+CAM350,从原理图修改到PCB的布局、布线这整个过...
用户1528479 2011-02-27 19:48
使用Cadence16.2过程中遇到的一些问题(附解惑方法)
使用Cadence16.2过程中遇到的一些问题(附解惑方法) 很久没有写博文了!确实有点过意不去。最近两个多月以来,由于公司的需要,我不得不学习Cadence16.2的使用方法——用它来画高速板子...
用户1528479 2011-02-27 19:46
使用Cadence16.2过程中遇到的一些问题(附解惑方法)
使用Cadence16.2过程中遇到的一些问题(附解惑方法)很久没有写博文了!确实有点过意不去(呵呵,这意味着自己最近懈怠了)。最近两个多月以来,由于公司的需要,我不得不学习Cadence16.2的使...
用户1528479 2011-02-12 09:15
数字旋转编码开关的原理及使用方法
在电子产品设计中,经常会用到旋转编码开关,比如数码电位器等,它的英文名翻译过来就是Rotary Encoder Switch。在写这个元件的驱动程序之前,我google、baidu了一些它的使用说明资...
EE直播间
更多
我要评论
1
12
关闭 站长推荐上一条 /3 下一条