什么是步进电机?

步进电机是将电脉冲信号转变为角位移或者线位移的开源控制元件。

所以我们用的时候不要担心他的复杂,可以理解为一个元器件。

静态指标术语

1、相数:产生不同对极N、S磁场的激磁线圈对数。常用m表示。

2、拍数:完成一个磁场周期性变化所需脉冲数或

导电状态用n表示,或指电机转过一个齿距角所需脉冲数,以四相电机为例,有四相四拍运行方式即AB-BC-CD-DA-AB,四相八拍运行方式即 A-AB-B-BC-C-CD-D-DA-A

3、步距角:对应一个脉冲信号,电机转子转过的角位移用θ表示。θ=360度/(转子齿数*运行拍数),以常规二、四相,转子齿为50齿电机为例。四拍运行时步距角为θ=360度/(50*4)=1.8度(俗称整步),八拍运行时步距角为θ=360度/(50*8)=0.9度(俗称半步)。

4、定位转矩:电机在不通电状态下,电机转子自身的锁定力矩(由磁场齿形的谐波以及机械误差造成的)。

5、静转矩:电机在额定静态电压作用下,电机不作旋转运动时,电机转轴的锁定力矩。此力矩是衡量电机体积的标准,与驱动电压及驱动电源等无关。 虽然静转矩与电磁激磁安匝数成正比,与定齿转子间的气隙有关,但过分采用减小气隙,增加激磁安匝来提高静力矩是不可取的,这样会造成电机的发热及机械噪音。

如何接线

单片机控制步进电机停转时电流大(单片机是如何控制步进电机扎旋转的)(1)

单片机控制步进电机停转时电流大(单片机是如何控制步进电机扎旋转的)(2)

单片机控制步进电机停转时电流大(单片机是如何控制步进电机扎旋转的)(3)

7447芯片:是数码管驱动,与以往不同的是仅仅用4位就可以控制显示,里面有编好的,通过高低电平组合来显示数字。

单片机控制步进电机停转时电流大(单片机是如何控制步进电机扎旋转的)(4)

L298就是起到放大电流的作用。单片机的电流太小,驱动不了电机。

效果展示:(更多效果可以去看本人拍的视频和小视频)

单片机控制步进电机停转时电流大(单片机是如何控制步进电机扎旋转的)(5)

程序详细讲解:

#include "reg52.h"//头文件

unsigned char index =0; //宏定义一个步进索引,就是引导步进如何旋转

int n=0,n0=0;//定义周期,一个是档位

unsigned char flag=0,step=1; //方向,开关

main() //主函数

{

P3=0xff; //由于P3是数据输出端,所以最好就是高电平,这一句写不写影响大不大。

EA=1; //开总中断

EX0=1;EX1=1;ET0=1; //打开外部中断 和定时中断

IT0=1;IT1=1;//开外部中断

TMOD=0x01;//定时器为定时工作方式1

TH0=(65536-1000)/256; //每一毫秒 中断一次

TL0=(65536-1000)%6;//每一毫秒 中断一次

TR0=1; //开定时中断

while(1) //为真进行不停的循环,然后等待中断发生

{

if(P0==0xfe) { n0=70; P2= 1; } //按键 显示1挡

if(P0==0xfd) { n0=90; P2= 2; }//按键 显示2挡

if(P0==0xfb) { n0=110; P2= 3; } //按键 显示3挡

if(P0==0xf7) { n0=150; P2= 4; }//按键 显示4挡

}

}

void int0() interrupt 0 停止键中断子程序,只会在0/1之间变化。

{

step ;

if(step>=2)

step=0;

}

void int1() interrupt 2 正反转中断子程序 只会在正转和反转之间0-1变化

{

flag ;

if(flag>=2)

flag=0;

}

void time() interrupt 1 定时器中断子程序

{

TH0=(65536-1000)/256; //初值重装

TL0=(65536-1000)%6;//为了每次都是延时一毫秒,

if(step==1) //如何step等于1则,开始转,如果不等于,n就会加一。

{

if(n >= n0 )//输出脉冲周期N0*1毫秒,

{

if(flag==1)//问正转嘛?

{

switch(index) 如果是 就会执行这一句

{

case 0: P1=0X03;break;//因为INDEX不断地加一,就会从上到下不断的选择。

case 1: P1=0X06;break;//P1口两两组合,进行高低电平变化。

case 2: P1=0X0c;break;

case 3: P1=0X09;break;

}

index ; 不断地加一

if(index>=4) 如何等于4了,就再从0 开始

index=0; //从新赋值

n=0; //从新赋值

}

if(flag==0)如果是反转

{

switch(index)//和上面的讲解会一样的

{

case 0: P1=0X09;break;

case 1: P1=0X0c;break;

case 2: P1=0X06;break;

case 3: P1=0X03;break;

}

index ;

if(index>=4)

index=0;

n=0;

}

else

n=0;//既不是正转 也不是反转,就停止吧

}

n ;//如果是开启了,就会判断脉冲是否大于周期

}

else

n=0;如果没有开,或者启动。好比电视插上电,但是没有按下电视开关。则也不转动

}

,