步进电机 订阅
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电动机又称脉冲电动机。 [1] 展开全文
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。因此,步进电动机又称脉冲电动机。 [1]
信息
外文名
stepping motor
别    称
脉冲电动机 [1]
工作原理
按电磁学原理,将电能转为机械能
中文名
步进电机
属    性
感应电机的一种
步进电机简介
步进电机又称为脉冲电机,基于最基本的电磁铁原理,它是一种可以自由回转的电磁铁,其动作原理是依靠气隙磁导的变化来产生电磁转矩。其原始模型是起源于1830年至1860年间。1870年前后开始以控制为目的的尝试,应用于氢弧灯的电极输送机构中。这被认为是最初的步进电机。二十世纪初,在电话自动交换机中广泛使用了步进电机。由于西方资本主义列强争夺殖民地,步进电机在缺乏交流电源的船舶和飞机等独立系统中得到了广泛的使用。二十世纪五十年代后期晶体管的发明也逐渐应用在步进电机上,对于数字化的控制变得更为容易。到了八十年代后,由于廉价的微型计算机以多功能的姿态出现,步进电机的控制方式更加灵活多样。 [2]  步进电机相对于其它控制用途电机的最大区别是,它接收数字控制信号(电脉冲信号)并转化成与之相对应的角位移或直线位移,它本身就是一个完成数字模式转化的执行元件。而且它可开环位置控制,输入一个脉冲信号就得到一个规定的位置增量,这样的所谓增量位置控制系统与传统的直流控制系统相比,其成本明显减低,几乎不必进行系统调整。步进电机的角位移量与输入的脉冲个数严格成正比,而且在时间上与脉冲同步。因而只要控制脉冲的数量、频率和电机绕组的相序,即可获得所需的转角、速度和方向。 [2]  我国的步进电机在二十世纪七十年代初开始起步,七十年代中期至八十年代中期为成品发展阶段,新品种和高性能电机不断开发,目前,随着科学技术的发展,特别是永磁材料、半导体技术、计算机技术的发展,使步进电机在众多领域得到了广泛应用。 [2]  作为一种控制用的特种电机,步进电机无法直接接到直流或交流电源上工作,必须使用专用的驱动电源(步进电机驱动器)。在微电子技术,特别计算机技术发展以前,控制器(脉冲信号发生器)完全由硬件实现,控制系统采用单独的元件或者集成电路组成控制回路,不仅调试安装复杂,要消耗大量元器件,而且一旦定型之后,要改变控制方案就一定要重新设计电路。这就使得需要针对不同的电机开发不同的驱动器,开发难度和开发成本都很高,控制难度较大,限制了步进电机的推广。 [2]  由于步进电机是一个把电脉冲转换成离散的机械运动的装置,具有很好的数据控制特性,因此,计算机成为步进电机的理想驱动源,随着微电子和计算机技术的发展,软硬件结合的控制方式成为了主流,即通过程序产生控制脉冲,驱动硬件电路。单片机通过软件来控制步进电机,更好地挖掘出了电机的潜力。因此,用单片机控制步进电机已经成为了一种必然的趋势,也符合数字化的时代趋。 [2] 
收起全文
精华内容
参与话题
问答
  • 步进电机

    千次阅读 2018-08-06 11:07:36
    步进电机 两相步进电机 两相步进电机一共有两个线圈,A线圈,B线圈,如图1 图1 步距角的计算方法:转子齿数(转子极对数)Nr,定子相数P Θ=180/Nr*P。 图1:Θ=180/1*2=90。 控制线圈的通断,即可以控制...

    步进电机

    两相步进电机
    两相步进电机一共有两个线圈,A线圈,B线圈,如图1

    图1
    步距角的计算方法:转子齿数(转子极对数)Nr,定子相数P
    Θ=180/Nr*P。
    图1:Θ=180/1*2=90。
    控制线圈的通断,即可以控制线圈的转动,转动的时序为
    输入 1 2 3 4 5 6 7 8 9
    +A 1 1 0 0 1 1 0 0 1
    -A 0 0 1 1 0 0 1 1 0
    +B 0 1 1 0 0 1 1 0 0
    -B 1 0 0 1 1 0 0 1 1
    表1
    单纯从一个线圈来说的话,+A,-A.
    输入 1 2 3 4 5 6 7 8 9
    +A 1 1 0 0 1 1 0 0 1
    -A 0 0 1 1 0 0 1 1 0
    表2
    假设1.2为一拍,那么一拍是如何进行细分呢?
    步进电机是电流控制的电机,细分是对一拍的电流细分,把简单的0.1逻辑变为平滑的电流变化,细分程度越高,电流的变化越接近与正弦波,如下图3。

    图2

    所谓的细分有2细分,4细分,8细分,16细分等。
    细分目的:是使每一步的步距更小,能进行更加精确的控制。另外步进电机进行细分控制时,步进电机的转动会更加平缓,避免突然的高低电平带来的机械震动,影响设备的精度。
    电流细分的具体方法:在固定拍的位置时,改变输入电流的大小,输入的电流改变方法我会在下文提起。
    当A,B都运行时,下图为四细分,之所以称为四细分是在运行时高电流分为四个等阶,同时四个为一个重复,W相同,转速相同,转动角度相同,A超前B九十度,我们可以设A线圈上的电流大小为x轴的坐标值,B线圈上的电流大小为Y轴的坐标值,电流值IA=Imax*cos(wt),IB=Imax*sin(wt)。
    激磁磁通变化:φa=φcosθ, φb=sinθ. 无限长载流直导线外:
    ,电流和B成正比,Φ=BS,φ与B成正比,所以I与φ成正比。
    力矩Ta=ia*(dφ/dt),Tb=ib*(dφ/dt),T=Ta+Tb,
    T2=Iφ[-coswtsin(wt-δ)+sinwtcos(wt-δ)]
    =Iφsinδ。随着δ的变化力矩也随之变化,逐渐增大,90度是最大。

    四分驱动磁场矢量图 四分驱动电流大小
    细分越多电流波形越趋近正弦波,由阶梯变得光滑的弧度,步进电机输出的力矩也越平稳,速度波动变小。
    在具体驱动步进电机时,需要接在驱动电路上,驱动的电路的主体时一个H桥驱动电路,如图3。

    图3
    控制Q1,Q4接信号,Q2,Q3不接信号,输入PWM波形,驱动电机转动(图中用20欧姆电阻代替),电机此时认为正向转动。Q2,Q3接PWM信号,Q1,Q4不接信号,电机为反向转动。如图4

    图4
    但是要注意mos管的使用
    理论来说门极导通的电压为3V。实际门级电压不足,应该为(vcc+3)v,门级电压的大小为Vgs=Vg+Vd,c才能导通所要求的电路。门极电压要高一些。
    如果门极电压不足,会导致H桥输出电压很低,另外还会出现电压毛刺。
    电机驱动芯片,采用的是电机驱动芯片L6207PD

    图5
    ENA的作用是开关A桥所有的mos管,低电平关断。过电流检测和过载保护连接在一个或门上,只要芯片温度过高或者电流检测出现警报,则或门就会触发,导通与其相连的mos管,使输入的ENA上的信号,直接进入地,从而使A桥关断。A桥工作的使能端。
    IN1A的作用是逻辑输入0,1。目的是一侧桥的开关。
    SENSEA检测的电流与VREFA进行比较,电压过大,mos关闭,使输出电流近等于恒定值。
    在IN1A的关断与闭合中,OUT的电压脉冲宽度发生变化,并且电流的大小维持一个恒定值,从而实现电流大小的调制。
    实际应用就是,ENA是步进电机的输入电流大小调节,作用于细分。IN1A的作用就是步进电机的拍,在固定拍,进行电流大小调节,也就是ENA的PWM调制。IN1A变动时,步进电机开始正向或者反向转动。
    因此我们进行输入的为四个端口,固定的PWM输入,和周期变化的拍正转,反转,停。

    (下一步的猜测,控制器运行时,先把正转,反转,停的IO置位,在输如PWM,停止的时候也是,达到所需的位置时,或者说到了计算的PWM时,先停PWM。但是和成品的步进电机驱动有些差别)
    (可以在程序内修改,一细分的小步等于一段PWM,这样操作在另一个程序调用即可,缺点就是占用内部资源)

    五相步进电机
    五相步进电机的接法有三种D型,Y型,和第三个。

    图2.1
    我们所采用的五相十拍步进电机步距为180/(5*50*10)=0.072
    如果我们采取细分步距会更小。
    之所以称为五相十拍电机,是因为十次五个线圈变换,会周期的正反转。
    转动时序为下图2.2,为正转时序,如果需要反转时,反过来时序运转就可以了。
    五相步进电机的多少细分应与两项相同。

    这个是三个电机驱动芯片,共6个H桥,我们取五个作为五项步进电机的驱动,五个ctrl iso用作时序控制,五个ENX作为电流(输入)大小控制。

    此外光耦有两种接法,外加电源并联电阻,和直接连接。我猜测可能是ctrl端的IO不能提供驱动光耦的电流,但是EN_X端能开漏输出,提供足够的电流驱动光耦。

    作用是防止驱动出来的瞬时电压超过24V,保护步进电机。

    这个是步进电机连接驱动的插口。

    展开全文
  • 步进电机步进电机驱动器使用说明

    万次阅读 多人点赞 2017-12-31 18:18:36
    上一篇博文简介了一下步进电机控制程序的配置和思路。这一篇就介绍步进电机驱动器的简介以及使用方法。 这里我们以TB6600步进电机驱动器为例,进行介绍。其他型号的驱动器也大同小异。如图是我们使用的步进电机驱动...

    上一篇博文简介了一下步进电机控制程序的配置和思路。这一篇就介绍步进电机驱动器的简介以及使用方法。

    这里我们以TB6600步进电机驱动器为例,进行介绍。其他型号的驱动器也大同小异。如图是我们使用的步进电机驱动器

    一.输入输出端说明

    1.信号输入端

    PUL+:脉冲信号输入正。
    PUL-:脉冲信号输入负。
    DIR+:电机正、反转控制正。
    DIR-:电机正、反转控制负。
    EN+:电机脱机控制正。
    EN-:电机脱机控制负。


    2.电机线连接段

    A+:连接电机绕组A+相。
    A-:连接电机绕组A-相。
    B+:连接电机绕组B+相。
    B-:连接电机绕组B-相。
     


    3.电源电压连接

    VCC:电源正端“+”
    GND:电源负端“-”  (需要注意的是电机驱动器上DC电源还是AC,DC只能接入直流电源,而AC的话既交流又可以直流电源)


    4.输入端接线说明

    输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信 号DIR+ ,DIR-③脱机信号EN+,EN-。
    输入信号接口有两种接法,用户可根据 需要采用共阳极接法或共阴极接法。 

    共阳极接法:分别将PUL+,DIR+,EN+连接到控制系统的电源上, 如果此电源是+5V 则可直接接入,
    如果此电源大于+5V,则须外部另加限流 电阻R,保证给驱动器内部光藕提供8—15mA 的驱动电流。
    脉冲输入信号通 过CP-接入,方向信号通过DIR-接入,使能信号通过EN-接入。如下图 



    共阴极接法:分别将 PUL-,DIR-,EN-连接到控制系统的地端; 脉冲输入信号通过PUL+接入,方向信号通过DIR+接入,
    使能信号通过EN+接 入。若需限流电阻,限流电阻R 的接法取值与共阳极接法相同。如下图: 


    这里需要注意的是:在一般情况下EN端可不接,EN有效时电机转子处于自由状态(脱机状态),这时 可以手
    动转动电机转轴,做适合您的调节。手动调节完成后,再将 EN 设为 无效状态,以继续自动控制
     。




    二、系统接线方法

    驱动器与控制器、电机、电源的接线,以共阳接法为例,如下图所示: 




    三、拨码开关的设定细分以及电流

    1.细分数设定

    细分数是以驱动板上的拨码开关选择设定的,用户可根据驱动器外盒上 的细分选择表的数据设定(最好在断电情况下设定)。细分后步进
    电机步距 角按下列方法计算:步距角=电机固有步距角/细分数。如:一台固有步距角 为1.8°的步进电机在4细分下步距角为1.8°/4=0.45°
    驱动板上拨码开关1、2、3、分别对应S1、S2、S3. (这里需要注意的是并不是设置细分数越大越好,400细分的意思就是:400个脉冲电机转动1圈)



    2.电流大小设定

    驱动板上拨码开关4、5、6分别对应S4、S5、S6. 

    (这里需要注意的是并不是设置电流越大越好,根据电机的功率取合适值即可)





    四、脱机信号(EN)

    打开脱机功能后,电机转子处于自由不锁定状态,可以轻松转动,此时 输入脉冲信号不响应,
    关闭此信号后电机接受脉冲信号正常运转。
    注:一般在实际应用中可不接。 



    五、常见的问题解答

    1、问:初次使用该步进驱动器,如何能尽快上手?

     答:正确接好电源和电机后,只接脉冲信号PUL(先将频率设置为1K以内),细分设置为16,方向和脱机悬空,
    此时加电后电机默认正转。运行无误后再 依次测试加速(提高频率)、方向、细分和脱机等功能。

    2、问:控制信号高于5V,一定要加串联电阻吗?

     答:是的,否则有可能烧毁驱动器控制接口的电路。

    3、问:接线后电源指示灯亮,但电机不转,是什么原因?

     答:如果接线正确,但仍然不转,说明控制部分驱动能力不够,这种情况多出现在
    用单片机的io口直接控制方式。请确保控制接口有5mA的驱动能力

    4、问:如何判断步进电机四条线的定义?
     答:将电机的任意两条线接在一起,此时用手拧电机转子有阻力,则这两条线是同一相,
    可接在驱动器A+、A-;另外两条线短接仍然有阻力,则将 这两条线接在B+和B-

    5、问:电机的正反转情况与应实际达到的相反? 
    答:只需要把电机其中一相的两根线互换接入即可 


    六、自己本人在实践中遇到的问题以及解决

    只是根据实验尝试而得,并不一定正确

    1.电机旋转电流吱吱声音过大  PWM频率过低 改变方法提高频率或者减少细分数
    2.驱动器自动断电时 设置电流过大,应该降低设置电流 
    3.电流设置会影响转速
    4.电机过烫,设置的电流过大,应该降低设置电流
    5.ENA-和ENA+不接,这是脱机信号控制
    6.PWM输出都采用开漏输出,需要外接上拉5V,不然没有PWM输出
    7.当选择电机转速较慢时,应该选择更多的细分数



    注:还有的一点需要注意的是我为什么采用开漏输出模式,外接上拉信号到5V。设计运用中当遇到大一点的步进电机时
    它的驱动器默认信号是5v以上至少5v(这个在拿到步进电机驱动器时可以看到)。单片机如果不设置为开漏输出外接上拉到5v的话,
    单片机输出的3.3V信号,有些驱动器根本就不认这个信号。








    展开全文
  • 步进电机控制和步进电机原理

    千次阅读 2017-11-20 20:49:38
    今天调试了一个步进电机,原来调试过一款欧柯达的42步进电机, 本以为两个电机差不多,驱动器给的一样,结果发现死活不能用自己百度了一下,做一个笔记 例如这个电机 42BYGH403AA  42 为机座尺寸, BYG是指混合式...

    今天调试了一个惠斯通的步进电机,原来调试过一款欧柯达的42步进电机, 本以为两个电机差不多,驱动器给的一样,结果发现死活不能动。用自己百度了一下,做一个笔记

    例如这个电机 42BYGH403AA

     42 为机座尺寸, BYGH是指混合式步进电机(混合式步进电机是综合了永磁式和反应式的优点而设计的步进电机。它又分为两相、三相和五相,两相步进角一般为1.8度 ,三相步进角 一 般为 1.2度 ,而五相步进角 一 般为0.72度。
    混合式步进电机的转子本身具有磁性,因此在同样的定子电流下产生的转矩要大于反应式步进电机,且其步距角通常也较小,因此,经济型数控机床一般需用混合式步进电机驱动。但混合转子的结构较复杂、转子惯量大,其快速性要低于反应式步进电机)

    这个图像就能看出电机的具体的尺寸标准 绕组是星型步距角1.8度,H就是混合式,法兰是异性法兰 

      步进电机还有带行星减速的尺寸,在最后我们可以看到一个

    比如这个

    OK42STH47-168AG3.71

    ok:是产品名,欧柯达42是尺寸其他的看不懂,3.71就是减速比


    最后一句话直接买电机对应的驱动器,这个市场根本没有统一的标准,杂乱无章,还是直接买一套直接用好,这一会调好了,一般工频10k左右吧程序发给大家参考一下

    #include "sydj.h"
    #include "gpio.h"
    #include "stmflash.h"
    #include "usart.h"
    
    
     u8 DJ_Buffer_temp[4];
     u8 datatemp[4];
    #define FLASH_SAVE_ADDR  0X08070000 	//设置FLASH 保存地址(必须为偶数,且其值要大于本代码所占用FLASH的大小+0X08000000)
    
    int32_t DJ_WEIZHI ;
    u8 End_flage=0;
    u8 Dj_turn=0;
    u32 Dj_step=0;
    u16 Dj_speed=0;
    u16 Dj_set=0;
    
      TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    	NVIC_InitTypeDef NVIC_InitStructure;
    void TIM1_Init(u16 arr ,u16 psc)
    {
    
    	
    
    	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //时钟使能
    
    	//定时器TIM3初始化
    	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
    	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
     
    	TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断
    	
    	TIM_Cmd(TIM1, ENABLE); 
    	//中断优先级NVIC设置
    	NVIC_InitStructure.NVIC_IRQChannel =TIM1_UP_IRQn;  //TIM7中断
    	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//先占优先级0级
    	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级3级
    	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
    	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
    
     //使能TIMx					
    }
    
    void Sydj_move(u8 turn, u16 speed,u32 steep)
    {
    	  
    	  Dj_step=steep;
    	  Dj_speed=speed;
        Dj_set=speed+500;
       	Dj_turn=turn;
    		SYDJ_DR=turn;
    	  TIM1_Init(71,speed);
    		while(End_flage==0);
    
    }
    
    
    void TIM1_UP_IRQHandler()
    {
    	static u8 dj_flag=0;
    	       u8 jiyi_flag=0;
    	if(TIM_GetITStatus(TIM1, TIM_IT_Update) != RESET)
    	{
    		dj_flag=~dj_flag;
    	  if(dj_flag!=0)
    		{
    			SYDJ_DR=Dj_turn;
    			SYDJ_PR=1;
    		  
    		}	
        else 
    		{
    			SYDJ_DR=Dj_turn;
    			SYDJ_PR=0;
    		}
    		jiyi_flag++;
    		Dj_step--;
    //		if(jiyi_flag==50)
    //		{
    //			jiyi_flag=0;
    //			 STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)datatemp,4);
    //			if(Dj_turn)
    //			{
    //			 DJ_WEIZHI=(int32_t)(datatemp[3]<<24|datatemp[2]<<16|datatemp[3]<<8|datatemp[0]);
    //			  printf("%d\n",DJ_WEIZHI);
    //				DJ_WEIZHI+=1;
    //			}
    //			else
    //			{
    //			 DJ_WEIZHI=(int32_t)(datatemp[3]<<24|datatemp[2]<<16|datatemp[3]<<8|datatemp[0]);
    //			 DJ_WEIZHI-=1;
    //			
    //			}
    //			DJ_Buffer_temp[3]=DJ_WEIZHI>>24;
    //			DJ_Buffer_temp[2]=DJ_WEIZHI>>16;
    //			DJ_Buffer_temp[1]=DJ_WEIZHI>>8;
    //			DJ_Buffer_temp[0]=DJ_WEIZHI;			
    //			 STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)DJ_Buffer_temp,4);
    //			 
    //		}
    	if(Dj_step>450)
    	{
        if(Dj_speed>150)
     		{
    	    Dj_speed=Dj_speed-1;
    			printf("%d\n",Dj_speed);
    			TIM1->PSC=Dj_speed;
    			
    		}
    		else 
    			TIM1->PSC=150;	
    	 }
        else if(Dj_step<=450)
    		{  Dj_speed+=1;
    				printf("%d\n",Dj_speed);
    			TIM1->PSC=Dj_speed;
    			if(Dj_step==0)//
    			{
    				TIM_Cmd(TIM1,DISABLE );
    				End_flage=1;
    			}
    		}			
    		
    			TIM_ClearITPendingBit(TIM1, TIM_IT_Update);	
    	}
    	
    }
    
    





    展开全文
  • 51单片机按键控制步进电机加减速及正反转

    万次阅读 多人点赞 2018-11-02 11:33:59
    之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。 所用硬件:步进电机及驱动器、STC89C52...

        之前尝试用单片机控制42步进电机正反转,电机连接导轨实现滑台前进后退,在这里分享一下测试程序及接线图,程序部分参考网上找到的,已经实际测试过,可以实现控制功能。

        所用硬件:步进电机及驱动器、STC89C52单片机、直流电源

    1、硬件连接图

                  

    • 注意:上图为共阳极接法,实际连接参考总体线路连接。
    • 驱动器信号端定义:

    PUL+:脉冲信号输入正。( CP+ )

    PUL-:脉冲信号输入负。( CP- )

    DIR+:电机正、反转控制正。

    DIR-:电机正、反转控制负。

    EN+:电机脱机控制正。

    EN-:电机脱机控制负。

    • 电机绕组连接

    A+:连接电机绕组A+相。

    A-:连接电机绕组A-相。

    B+:连接电机绕组B+相。

    B-:连接电机绕组B-相。

    • 电源连接

    VCC:电源正端“+”

    GND:电源负端“-”

    注意:DC直流范围:9-32V。不可以超过此范围,否则会无法正常工作甚至损坏驱动器.

    • 总体线路连接

    输入信号共有三路,它们是:①步进脉冲信号PUL+,PUL-;②方向电平信 号DIR+,DIR-③脱机信号EN+,EN-。输入信号接口有两种接法,可根据 需要采用共阳极接法或共阴极接法。

    在这里我采用的是共阴极接法:分别将 PUL-,DIR-,EN-连接到控制系统的地端(接入单片机地端); 脉冲输入信号通过PUL+接入单片机(代码中给的P2^6脚),方向信号通过DIR+接入单片机(代码中给的P2^4脚),使能信号通过EN+接 入(不接也可,代码中未接,置空)。按键连接见代码,分别用5个按键控制电机启动、反转、加速、减速、正反转。

    注意:接线时请断开电源,电机接线需注意不要错相,相内相间短路, 以免损坏驱动器。

    2、代码

    #include<reg51.h> 
    #define MotorTabNum 5
    unsigned char T0_NUM;
    sbit K1 = P3^5;        // 启动
    sbit K2 = P3^4;        // 反转
    sbit K3 = P3^3;        // 加速
    sbit K4 = P3^2;        // 减速
    sbit K5 = P3^1;        //正反转
    
    sbit FX      = P2^4;     // 方向
    //sbit MotorEn = P2^5;     // 使能
    sbit CLK     = P2^6;     // 脉冲
    
    int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};           
    
    unsigned char g_MotorSt = 0;     // 
    unsigned char g_MotorDir = 0;    // 
    unsigned char MotorTab[7] = {12, 10, 8, 6, 4, 2,1};
    
    signed char g_MotorNum = 0;
    
    void delayms(xms);
    void mDelay(unsigned int DelayTime);                
    void T0_Init();
    
    void KeyScan(void);
    
    
    
    void main(void)
    {
            T0_Init();            
     //       MotorEn = 0;     // 
            FX = 0;
            while(1)
            {
                    KeyScan();              // 
            }
    
    
    }
    
    void T0_Init()
    {
            TMOD = 0x01;
            TH0 = (65535-100)/256;  // 1ms
            TL0 = (65535-100)%256;
            EA = 1;
            ET0 = 1;
    //        TR0 = 1; 
    
    }
    
    void T0_time() interrupt 1
    {
    //        TR0 = 0;
            TH0 = (65535-100)/256;   
            TL0 = (65535-100)%256;
            T0_NUM++;
            if(T0_NUM >= MotorTab[g_MotorNum])        // 
            {
                    T0_NUM = 0;
                    CLK=CLK^0x01;               //   
            }
    //        TR0 = 1;
    }         
    
    
    //-----????---------------------
    void KeyScan(void)
    {
            if(K1 == 0)
            {
                    delayms(10);   
                    if(K1 == 0)
                    {
                            g_MotorSt = g_MotorSt ^ 0x01;
                          //  MotorEn ^= 1;
                            TR0 = 1; 
    						FX ^= 0;   //反转
                    }
            }
    
            if(K2 == 0)
            {
                    delayms(10);   //正转
                    if(K2 == 0)
                    {    
                            g_MotorDir = g_MotorDir ^ 0x01;
                            FX ^= 1;    //加速
                    }
            }
    
            if(K3 == 0)  // 
            {
                    delayms(5);   //加速
                    if(K3 == 0)
                    {   
                            g_MotorNum++;
                            if(g_MotorNum > MotorTabNum)
                                    g_MotorNum = MotorTabNum;
                    }
            }
    
            if(K4 == 0)  // 
            {
                    delayms(5);   // 减速
                    if(K4 == 0)
                    {       
                        g_MotorNum--;
                        if(g_MotorNum < 0)
                        g_MotorNum = 0;
                    }
            }
    
    		if(K5 == 0)  // 
    		{
    				delayms(10);   // 正反转
    				if(K5 == 0)
    				{      
    				    g_MotorSt = g_MotorSt ^ 0x01;
    					g_MotorDir = g_MotorDir ^ 0x01;
                        MotorEn ^= 1;
                        TR0 = 1;
    			        while(1)
    					{
                           FX ^= 1;    //													        
                           delayms(90000);
    					   FX ^= 0;    //
    					   delayms(90000);
    					}
    				}
    		}
    }
    
    void delayms(xms)//延时
    {
             unsigned int x,y;
             for(x=xms;x>0;x--)
                     for(y=110;y>0;y--);
    }

    3、常见问题解答

    • 控制信号高于5v一定要串联电阻,否则可能会烧坏驱动器控制接口电路。
    • 接通电源后如果驱动器灯亮,但是无法控制电机旋转,考虑控制部分驱动能力不足或者驱动器所设置的驱动电流不够(我就遇到过这种情况,后来通过调高驱动器限制电流解决的此问题)。如果调高驱动电流步进电机仍无法转动,查看电路板上的按键有没有接对,程序中按键引脚可根据电路板设计的按键引脚连接自行改动。
    • 判断步进电机四条线的定义:将任意两条线接在一起,用手旋转电机,如果有阻力,则两条线是同一相。用相同方法测试另外两条线是否是同一相。确定同相的两条线任意接入两相接口,如果旋转方向相反只需换相即可。
    • 增加启停及加减速功能代码:https://download.csdn.net/download/weixin_42670445/11978165
    展开全文
  • 单片机控制步进电机

    万次阅读 多人点赞 2019-06-06 18:05:40
    用单片机控制步进电机正转 反转 加速 减速;由LCD1602实时显示步进电机的状态;F-正转,B-反转;数字越大,转速越大; 仿真原理图如下: MCU和LCD1602显示模块: ULN2803驱动和步进电机模块: C语言代码如下...
  • ULN2003的基本介绍 ULN2003的概述 ULN2003是高耐压、大电流复合晶体管阵列,由七个硅NPN 复合晶体管组成。一般采用DIP—16 或SOP—16 塑料封装。 ULN2003的主要特点: ULN2003 的每一对达林顿都串联一个2.7K 的...
  • 三菱PLC控制步进电机

    千次阅读 多人点赞 2019-06-16 10:34:53
    我们学习PLC课程上机实验的时候,往往是用一个发光二极管代替步进电机,通过发光二极管的亮灭代表步进电机正转和反转,实际接线中往往出错,今天就简单介绍一下; 1 1.1 PLC型号的选择 我选择的是三菱FX2N系列PLC,...
  • 如何控制步进电机

    千次阅读 2019-04-29 09:06:13
    了解如何使用Arduino UNO开发板控制步进电机,以便在机器人中实现更精确的运动。 本篇文章将主要向您介绍如何控制步进电机以实现精细旋转和完美的角度控制 - 这是机器人项目的关键技能。 所需的硬件 ● 步进电机 ● ...
  • MCU——步进电机

    千次阅读 2017-03-16 20:07:11
    步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接受到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(既步进角)。您可以通过控制脉冲个数来控制角位移量,从而达到精确...

空空如也

1 2 3 4 5 ... 20
收藏数 5,111
精华内容 2,044
关键字:

步进电机