步进电机驱动程序

步进电机驱动程序
步进电机驱动程序

步进电机驱动程序

采用热转印制作 PCB ,电路采用2相推挽全桥驱动,单片机采用 STC54C12C5404

学生的设计要求:具体的模式如下:五种模式选择

一:停止。

二:顺时针转2分钟,停6分钟,循环;

三:逆时针转2分钟,停6分钟,循环;

四:顺指针转2分钟停6分钟,逆时针转2分钟停6分钟,循环;

五:顺指针转5分钟,逆时针转5分钟持续3小时,停9小時,循环。

请将模式四和五放在首选。用数字码显示模式

步进电机39BYG250

品牌:北斗型号: 39BYG 技术参数

步距角: 1.8 电流: 0.4 A 电阻: 27 Ω

重量: 0.130 kg 驱动电压: 12 V

相电流: 0.4 A 相数: 2 环境温度:130 ℃

1代表程式1,2代表程式2。。。。。

1位数码管,1个按钮

8圈/分,

每圈要分4步跳

//2010.8.26

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

具体的模式如下:五种模式选择

0:停止。

1:顺时针转2分钟,停6分钟,循环;

2:逆时针转2分钟,停6分钟,循环;

3:顺指针转2分钟停6分钟,逆时针转2分钟停6分钟,循环;

4:顺指针转5分钟,逆时针转5分钟持续3小时,停9小時,循环。

模式四和五放在首选。用数字码显示模式

1代表程式1,2代表程式2。。。。。

1位数码管,1个按钮

8圈/分,68

每圈要分4步跳

;***************************************************************/ #include "STC12C5410AD.H"//头文件

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

#define uchar unsigned char//宏定义

#define uint unsigned int//宏定义

#define DPDR P2//并行数据接口定义

sbit key=P3^2;//按键

sbit AB=P3^5;

sbit CP=P3^3;

//sbit HHH=P1^6;

sbit CLL=P3^4;

bit Forward_Inversion_bit;//正转,//反转,标志

bit bit_bit;

//1:正转

//0:反转

bit Start_Stop_bit;//启动,停止,标志

//1:启动

//0:停止

//uchar count_2;

uint counter_3;

uchar counter_4;

uchar Forward_Tolerance_Counter;//正转容错记数器,保持步进电机不跳步uchar Inversion_Tolerance_Counter;//反转容错记数器,保持步进电机不跳步

uchar Mode_Selection;//模式选择////数码管显示值

//0:停止。

//1:顺时针转2分钟,停6分钟,循环;

//2:逆时针转2分钟,停6分钟,循环;

//3:顺指针转2分钟停6分钟,逆时针转2分钟停6分钟,循环;

//4:顺指针转5分钟,逆时针转5分钟持续3小时,停9小時,循环。

uchar Time_Counter_5;//时间计数器:200*5=1秒

uchar Time_Counter_60;//时间计数器:1秒*60=1分钟

uchar Time_Counter_x;//时间计数器:1分钟*x=x分钟

uchar Time_3_by_3;//时间计数器:3小时*3=9小时

uchar Time_30_by_30;//时间计数器:3小时*3=9小时

#define ISP_IAP_BYTE_READ 0x01//读

#define ISP_IAP_BYTE_PROGRAM 0x02//编程

#define ISP_IAP_SECTOR_ERASE 0x03//扇区擦除

#define ENABLE_ISP 0x85//等待时间,和对ISP_CONTR设置初值

#define EEPROM_ADDRESS_1 0x2800//第一扇区地址 2800-29FF

#define EEPROM_ADDRESS_2 0x2A00//第二扇区地址 2A00-2BFF

#define EEPROM_ADDRESS_3 0x2A01//第二扇区地址 2A00-2BFF

//#define EEPROM_ADDRESS_3 0x2C00//第三扇区地址 2C00-2DFF

//#define EEPROM_ADDRESS_4 0x2E00//第四扇区地址 2E00-2FFF

uchar DATA_H_ADDRESS;//单片机内部 EEPROM 地址高字节

uchar DATA_L_ADDRESS;//单片机内部 EEPROM 地址低字节

uint sfr_16;//双字节缓存对单片机内部 EEPROM 地址字节的处理

uchar code DispTab_Digital[]={0xa0,0xf3,0x34,0x32,0x63,0x2a,0x28,0xb3,0x20,0x22,0xff};//数码管显示

//0;1;2;3;4;5; ;

uchar code DispTab_Inversion[]={0x60,0x09,0x12,0x84};//反转

//d=+,c=-;

//b=+,a=-;

//c=+,d=-;

//a=+,b=-;

/*

uchar code DispTab_Forward[]={0xa3,0x3a,0xac,0xca};//正转

//a=-,b=+;1010 0011=0xa3

//c=-,d=+;0011 1010=0x3a

//a=+,b=-;1010 1100=0xac

//c=+,d=-;1000 1010=0xca*/

uchar code DispTab_Forward[]={0x84,0x12,0x09,0x60};//正转

//a=-,b=+;1010 0011=0xa3

//c=-,d=+;0011 1010=0x3a

//a=+,b=-;1010 1100=0xac

//c=+,d=-;1000 1010=0xca

void delay(uint z)//延时为 1ms

{

uchar x,x1;

for(;z>0;z--)

{

for(x=0;x<114;x++)

{

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

}

}

}

void init()

{

P1M1=0xff;// 设为强上拉0101 0101

P2M1=0xff;// 设为强上拉0101 0101

DPDR=0xaa;

TMOD=0x11;

TH1=0x16;//10ms

TL1=0xed;//10ms

TH0=0x16;//200ms

TL0=0xed;//200ms

EA=1;

ET1=1;

TR1=0;

CLL=1;

AB=1;

CP=1;

ET0=1;

TR0=1;

PT0=1;

WDT_CONTR=0x3d;//看门狗//0x3c=1.2S,,,0x3d=2.2S,,,0x3e=4.5S counter_3=0;

counter_4=0;

bit_bit=0;

Forward_Tolerance_Counter=0;

Inversion_Tolerance_Counter=0;

Time_Counter_5=0;//时间计数器:200*5=1秒

Time_Counter_60=0;//时间计数器:1秒*60=1分钟

Time_Counter_x=0;//时间计数器:1分钟*x=x分钟

Time_3_by_3=0;//时间计数器:3小时*3=9小时

}

void Timer0(void) interrupt 1

{

//static uchar WDT_CONTR_Counter;

TH0=0x16;//200ms

TL0=0xed;//200ms

//WDT_CONTR_Counter++;

//if(WDT_CONTR_Counter==9)//4S 喂一次狗,

//WDT_CONTR_Counter=0;

//WDT_CONTR=0x3d;//看门狗

//}

////////////////////////////////////////

//0:停止。

if(Mode_Selection==0)

{

Start_Stop_bit=0;//停止。

}

//1:顺时针转2分钟,停6分钟,循环.

else if(Mode_Selection==1)//Forward_Inversion_bit;//正转,//反转{

if(Start_Stop_bit==1)

{

Time_Counter_5++;//时间计数器:200*5=1秒

if(Time_Counter_5==5)

{

Time_Counter_5=0;

Time_Counter_60++;//时间计数器:1秒*60=1分钟

if(Time_Counter_60==59)

{

Time_Counter_60=0;

Time_Counter_x++;//1分钟*x=x分钟

if(Time_Counter_x==2)

{

Time_Counter_x=0;

Start_Stop_bit=0;

Forward_Inversion_bit=1;

}

}

}

}

else

{

Time_Counter_5++;//时间计数器:200*5=1秒

if(Time_Counter_5==5)

Time_Counter_5=0;

Time_Counter_60++;//时间计数器:1秒*60=1分钟

if(Time_Counter_60==59)

{

Time_Counter_60=0;

Time_Counter_x++;//1分钟*x=x分钟

if(Time_Counter_x==6)

{

Time_Counter_x=0;

Start_Stop_bit=1;

Forward_Inversion_bit=1;

}

}

}

}

}

//2:逆时针转2分钟,停6分钟,循环;

else if(Mode_Selection==2)//Forward_Inversion_bit;//正转,//反转{

if(Start_Stop_bit==1)

{

Time_Counter_5++;//时间计数器:200*5=1秒

if(Time_Counter_5==5)

{

Time_Counter_5=0;

Time_Counter_60++;//时间计数器:1秒*60=1分钟

if(Time_Counter_60==59) //60

{

Time_Counter_60=0;

Time_Counter_x++;//1分钟*x=x分钟

if(Time_Counter_x==2) //2

{

Time_Counter_x=0;

Start_Stop_bit=0;

Forward_Inversion_bit=0;

}

}

}

else

{

Time_Counter_5++;//时间计数器:200*5=1秒

if(Time_Counter_5==5)

{

Time_Counter_5=0;

Time_Counter_60++;//时间计数器:1秒*60=1分钟

if(Time_Counter_60==59)//60

{

Time_Counter_60=0;

Time_Counter_x++;//1分钟*x=x分钟

if(Time_Counter_x==6)//6

{

Time_Counter_x=0;

Start_Stop_bit=1;

Forward_Inversion_bit=0;

}

}

}

}

}

//3:顺指针转2分钟停6分钟,逆时针转2分钟停6分钟,循环;

else if(Mode_Selection==3)//Forward_Inversion_bit;//正转,//反转{

if(Start_Stop_bit==1)

{

Time_Counter_5++;//时间计数器:200*5=1秒

if(Time_Counter_5==5)

{

Time_Counter_5=0;

Time_Counter_60++;//时间计数器:1秒*60=1分钟

if(Time_Counter_60==59)

{

Time_Counter_60=0;

Time_Counter_x++;//1分钟*x=x分钟

if(Time_Counter_x==2)

{

Time_Counter_x=0;

Start_Stop_bit=0;

Forward_Inversion_bit=~Forward_Inversion_bit;

}

}

}

}

else

{

Time_Counter_5++;//时间计数器:200*5=1秒

if(Time_Counter_5==5)

{

Time_Counter_5=0;

Time_Counter_60++;//时间计数器:1秒*60=1分钟

if(Time_Counter_60==59)

{

Time_Counter_60=0;

Time_Counter_x++;//1分钟*x=x分钟

if(Time_Counter_x==6)

{

Time_Counter_x=0;

Start_Stop_bit=1;

}

}

}

}

}

//4:顺指针转5分钟,逆时针转5分钟持续3小时,停9小時,循环。else if(Mode_Selection==4)

{

if(Start_Stop_bit==1)

{

Time_Counter_5++;//时间计数器:200*5=1秒

if(Time_Counter_5==5)

{

Start_Stop_bit=1;

Time_Counter_5=0;

Time_Counter_60++;//时间计数器:1秒*60=1分钟

if(Time_Counter_60==59) //60

{

Time_Counter_60=0;

Time_Counter_x++;//1分钟*x=x分钟

if(Time_Counter_x==5) //5分钟

{

Time_Counter_x=0;

Forward_Inversion_bit=!Forward_Inversion_bit; Time_3_by_3++;

if(Time_3_by_3==36) //36//3钟

{

Start_Stop_bit=0;

Time_3_by_3=0;

TH1=0x16;//200ms

TL1=0xed;//200ms

TR0=0;

TR1=1;

}

}

}

}

}

}

}

void Timer1(void) interrupt 3

{

//static uchar count;

TH1=0x16;//200ms

TL1=0xed;//200ms

if(Mode_Selection==4)

{

if(Start_Stop_bit==0)

{

Time_Counter_5++;//时间计数器:200*5=1秒

if(Time_Counter_5==5)

{

Start_Stop_bit=0;

Time_Counter_5=0;

Time_Counter_60++;//时间计数器:1秒*60=1分钟if(Time_Counter_60==59) //60

{

Time_Counter_60=0;

Time_Counter_x++;//1分钟*x=x分钟

if(Time_Counter_x==59) //60分钟

{

Time_Counter_x=0;

Time_3_by_3++;

if(Time_3_by_3==9) //9钟

{

Start_Stop_bit=1;

Time_3_by_3=0;

Forward_Inversion_bit=1;

TH0=0x16;//200ms

TL0=0xed;//200ms

TR0=1;

TR1=0;

}

}

}

}

}

}

}

void IAP_Disable()//关闭 IAP

{

ISP_CONTR=0;

ISP_CMD=0;

ISP_TRIG=0;

}

void Byte_read()//读

{

uint sfr_sfr;

sfr_sfr=sfr_16;

DATA_L_ADDRESS=sfr_sfr;//低地址字节

sfr_sfr>>=8;

DATA_H_ADDRESS=sfr_sfr;//高地址字节

ISP_CONTR=ENABLE_ISP;

ISP_CMD=ISP_IAP_BYTE_READ;

ISP_ADDRH=DATA_H_ADDRESS;

ISP_ADDRL=DATA_L_ADDRESS;

//EA=0;

ISP_TRIG=0x46;

ISP_TRIG=0xb9;

_nop_();

//EA=1;

//ISP_DATA//读出的数据在 ISP_DATA

IAP_Disable();

}

void Byte_program(uchar Byte_data)////编程//Byte_data为要保存的数据{

uint sfr_sfr;

sfr_sfr=sfr_16;

DATA_L_ADDRESS=sfr_sfr;//低地址字节

sfr_sfr>>=8;

DATA_H_ADDRESS=sfr_sfr;//高地址字节

ISP_CONTR=ENABLE_ISP;

ISP_CMD=ISP_IAP_BYTE_PROGRAM;

ISP_ADDRH=DATA_H_ADDRESS;

ISP_ADDRL=DATA_L_ADDRESS;

ISP_DATA=Byte_data;

//EA=0;

ISP_TRIG=0x46;

ISP_TRIG=0xb9;

_nop_();

//EA=1;

// IAP_Disable();

}

void Sector_Erase()//扇区擦除

{

uint sfr_sfr;

sfr_sfr=sfr_16;

DATA_L_ADDRESS=sfr_sfr;//低地址字节sfr_sfr>>=8;

DATA_H_ADDRESS=sfr_sfr;//高地址字节

ISP_CONTR=ENABLE_ISP;

ISP_CMD=ISP_IAP_SECTOR_ERASE;

ISP_ADDRH=DATA_H_ADDRESS;

ISP_ADDRL=DATA_L_ADDRESS;

//EA=0;

ISP_TRIG=0x46;

ISP_TRIG=0xb9;

_nop_();

//EA=1;

//IAP_Disable();//关闭 IAP

}

void Digital_Tube()//数码管显示

{

//uchar ii,temp,a;

//P1=DispTab_Digital[2];

P1=DispTab_Digital[Mode_Selection];

//HHH=0;

}

void Key_Detection()//按键检测{

if(Mode_Selection>4)

{

Mode_Selection=0;

}

if(key==0)

{

delay(20);

if(key==0)

{

Digital_Tube();//数码管显示while(key==0);

delay(20);

if(Mode_Selection==0)

{

Mode_Selection=1;

Start_Stop_bit=1;

Forward_Inversion_bit=1;

}

else if(Mode_Selection==1) {

Mode_Selection=2;

Start_Stop_bit=1;

Forward_Inversion_bit=0;

}

else if(Mode_Selection==2) {

Mode_Selection=3;

Start_Stop_bit=1;

Forward_Inversion_bit=1;

}

else if(Mode_Selection==3)

{

Mode_Selection=4;

Start_Stop_bit=1;

Forward_Inversion_bit=1;

}

else if(Mode_Selection==4)

{

Mode_Selection=0;

Start_Stop_bit=0;

Forward_Inversion_bit=1;

}

else if(Mode_Selection==0)

{

Mode_Selection=1;

//Start_Stop_bit=0;

//Forward_Inversion_bit=1;

}

Time_Counter_5=0;//时间计数器:200*5=1秒Time_Counter_60=0;//时间计数器:1秒*60=1分钟Time_Counter_x=0;//时间计数器:1分钟*x=x分钟Time_3_by_3=0;//时间计数器:3小时*3=9小时counter_3=0;

counter_4=0;

bit_bit=0;

sfr_16=EEPROM_ADDRESS_1;

Sector_Erase();//扇区擦除

Byte_program(Mode_Selection);////编程

IAP_Disable();

Digital_Tube();//数码管显示

}

}

}

void Database_Refresh()//刷新数据库

{

sfr_16=EEPROM_ADDRESS_1;

Byte_read();//读

Mode_Selection=ISP_DATA;

if(Mode_Selection>4)

{

Mode_Selection=0;

}

sfr_16=EEPROM_ADDRESS_2;

Byte_read();//读

Forward_Tolerance_Counter=ISP_DATA;

sfr_16=EEPROM_ADDRESS_3;

Byte_read();//读

Inversion_Tolerance_Counter=ISP_DATA;

if(Mode_Selection==0)

{

Start_Stop_bit=0;

}

if(Mode_Selection==2)

{

Start_Stop_bit=1;

Forward_Inversion_bit=0;

}

if((Mode_Selection==1)||(Mode_Selection==1)) {

Start_Stop_bit=1;

Forward_Inversion_bit=1;

}

//if(Mode_Selection==3)

//{

// Start_Stop_bit=1;

// Forward_Inversion_bit=1;

//}

//else

// Start_Stop_bit=1;

// Forward_Inversion_bit=1;

//}

}

void main()

{

//uchar i;

init();//单片机硬件资源初始化

Database_Refresh();//刷新数据库

Digital_Tube();//数码管显示

TR1=0;

while(1)

{

Key_Detection();//按键检测

WDT_CONTR=0x3d;//看门狗

delay(27);//27

if(Start_Stop_bit==1)//启动,停止,标志

{

if(Forward_Inversion_bit==1)//正转,//反转,标志{

Forward_Tolerance_Counter++;

if(Forward_Tolerance_Counter>3)

{

Forward_Tolerance_Counter=0;

}

DPDR=DispTab_Forward[Forward_Tolerance_Counter]; if(Forward_Tolerance_Counter==0)

{

Inversion_Tolerance_Counter=1;

}

if(Forward_Tolerance_Counter==1)

{

Inversion_Tolerance_Counter=0;

}

if(Forward_Tolerance_Counter==2)

Inversion_Tolerance_Counter=3;

}

if(Forward_Tolerance_Counter==3)

{

Inversion_Tolerance_Counter=2;

}

}

else if(Forward_Inversion_bit==0)//反转

{

Inversion_Tolerance_Counter++;

if(Inversion_Tolerance_Counter>3)

{

Inversion_Tolerance_Counter=0;

}

DPDR=DispTab_Inversion[Inversion_Tolerance_Counter]; if(Inversion_Tolerance_Counter==0)

{

Forward_Tolerance_Counter=1;

}

if(Inversion_Tolerance_Counter==1)

{

Forward_Tolerance_Counter=0;

}

if(Inversion_Tolerance_Counter==2)

{

Forward_Tolerance_Counter=3;

}

if(Inversion_Tolerance_Counter==3)

{

Forward_Tolerance_Counter=2;

}

}

sfr_16=EEPROM_ADDRESS_2;

Sector_Erase();//扇区擦除

Byte_program(Forward_Tolerance_Counter);////编程sfr_16=EEPROM_ADDRESS_3;

Byte_program(Inversion_Tolerance_Counter);////编程IAP_Disable();

if(bit_bit==0)

{

counter_3++;

if(counter_3==50)

{

counter_3=0;

Start_Stop_bit=0;

bit_bit=1;

}

}

}

if(bit_bit==1)

{

counter_4++;

if(counter_4==20)

{

counter_4=0;

Start_Stop_bit=1;

bit_bit=0;

}

}

if(Start_Stop_bit==0)//启动,停止,标志

{

DPDR=0xaa;

}

}

}

51单片机控制的步进电机C语言程序

我上周刚做的这个实验成功拉,给你参考一下吧这可是我当时辛辛苦苦编出来的啊,不过我用的是L298驱动的和ULN2003一样,你把它换成2003就行拉 #include unsigned char code table[]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf 9,0x00,0xf1,0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0x00}; unsigned char temp,temp_old; unsigned char key; unsigned char i,j,k,m,s; void delay(int i) { for(m=i;m>0;m--) for(j=250;j>0;j--) for(k=10;k>0;k--); } void saomiao() { P3=0xff; P3_4=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--)

for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp) { case 0x0e: key=1; break; case 0x0d: key=2; break; case 0x0b: key=3; break; case 0x07: key=4; break; } temp=P3;

temp=temp&0x0f; while(temp!=0x0f) { temp=P3; temp=temp&0x0f; } } } P3=0xff; P3_5=0; temp=P3; temp=temp&0x0f; if(temp!=0x0f) { for(i=50;i>0;i--) for(j=200;j>0;j--); temp=P3; temp=temp&0x0f; if(temp!=0x0f) { temp=P3; temp=temp&0x0f; switch(temp)

4四相五线减速步进电机28BYJ48原理仿真及演示程序使用ULN2019A驱动-4页文档资料

减速步进电机28BYJ-48的原理如下图:中间部分是转子,由一个永磁体组成,边上的是定子绕组。当定子的一个绕组通电时,将产生一个方向的电磁场,如果这个磁场的方向和转子磁场方向不在同一条直线上,那么定子和转子的磁场将产生一个扭力将定子扭转。 依次改变绕组的磁场,就可以使步进电机正转或反转(比如通电次序为 A->B->C->D正转,反之则反转)。而改变磁场切换的时间间隔,就可以控制步进电机的速度了,这就是步进电机的驱动原理。 由于步进电机的驱动电流较大,单片机不能直接驱动,一般都是使用 ULN2003达林顿阵列驱动,当然,使用下拉电阻或三极管也是可以驱动的,只不过效果不是那么好,产生的扭力比较小。 参考:减速步进电机28BYJ-48最简单的驱动方法 28BYJ-48的内部结构请见这里 下面是一个步进电机的演示程序: #include sbit key=P2^0; //按键控制步进电机的方向 unsigned char speed=5; //步进电机的转速

//八拍方式驱动,顺序为A AB B BC C CD D DA unsigned char code clockWise[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x0d}; void delay(unsigned char z) { unsigned char x,y; for(x=0;x

步进电机可编程驱动控制器设计资料及例程

步进电机可编程驱动控制器 【简要说明】 一、尺寸:长88mmX宽68mmX高35mm 二、主要芯片:AT89S52单片机、L298NL、298N(支持AT89S52编程) 三、工作电压:输入电压(5V~30V)输入电压的大小由被控制电机的额定电压决定。 四、可驱动直流(5~30V之间电压的直流电机或者步进电机) 五、最大输出电流2A (瞬间峰值电流3A) 六、最大输出功率25W 七、特点: 1、具有信号指示 2、转速可调 3、抗干扰能力强 4、具有续流保护 5、转速、转向、工作方式可根据程序灵活控制 6、可单独控制一台步进电机 7、根据需要自己编程可以灵活控制步进电机,实现多种功能; 8、可实现正反转 9、采用光电隔离 10、单片机P3口已用排针引出,可以方便使用者连接控制更多外围设备。 11、四位LED灯指示 12、四位按键输入(可以对AT89S52单片机编程实现任何控制) 13、核心控制芯片采用市场上最常用的AT89S52单片机,支持STC89C52单片机,控制方式简单,只需控制IO口电平即可!

14、采用独立编码芯片L297,不用在单片机程序里编程复杂的逻辑代码和占用单片机资源。 15、设计有程序下载口,可以实时编程实时调试。 16、芯片都安装在对应的管座上,可以随时更换芯片。 17、外部连线采用旋转压接端子,使接线更牢固。 18、四周有固定安装孔。 产品最大特点:可以对AT89S52单片机编程实现任意控制被控的直流电机或者步进电机。 适用场合:单片机学习、电子竞赛、产品开发、毕业设计。。。 注意啦:本产品提供例程(附带原理图以及说明!) 【标注图片】 【步进电机控制接线图】 步进电机的控制实例 步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。 一、步进电机最大特点是:

基于51单片机的步进电机控制-设计报告(说明书)及源程序

南京XX大学 指导老师:张X 课程设计基于51单片机的步进电机控制 机械电子工程学院 测控技术与仪器 XXXXX Xxx 2012年1年4日

步进电机控制系统 [摘要]本课程设计的内容是利用51单片机,达到控制步进电机的启 动、停止、正转、反转、两档速度和状态显示的目的,使步进电机控制更加灵活。步进电机驱动芯片采用ULN2803,ULN2803具有大电流、高电压,外电路简单等优点。利用四位数码管增设电机状态显示功能,各项数据更直观。实测结果表明,该控制系统达到了设计的要求。 关键字:步进电机、数码管、51单片机、ULN2803 一步进电机与驱动电路 1.1 什么是步进电机 步进电机是一种将电脉冲转化为角位移的执行机构。通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时也可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。 1.2 步进电机的种类 步进电机分永磁式(PM)、反应式(VR)、和混合式(HB)三种。永磁式步进一般为两相,转矩和体积较小,步进角一般为7.5度或15度;反应式步进一般为三相,可实现大转矩输出,步进角一般为1.5度,但噪声和振动都很大。在欧美等发达国家80年代已被淘汰;混合式步进是指混合了永磁式和反应式的优点。它又分为两相和五相:两相步进角一般为1.8度而五相步进角一般为 0.72度。这种步进电机的应用最为广泛。 1.3 步进电机的特点 1.精度高一般的步进电机的精度为步进角的3-5%,且不累积。可在宽广的频率范围内通过改变脉冲频率来实现调速,快速起停、正反转控制及制动等,这是步进电动机最突出的优点 2.过载性好其转速不受负载大小的影响,不像普通电机,当负载加大时就会出现速度下降的情况,所以步进电机使用在对速度和位置都有严格要求的场合; 3.控制方便步进电机是以“步”为单位旋转的,数字特征比较明显,这样就给计算

(整理)二相步进电机驱动.

电机驱动器使用说明书 L298N是ST公司生产的一种高电压、大电流电机驱动芯片。该芯片采用15脚封装。主要特点是:工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;额定功率25W。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。使用L298N芯片驱动电机,该芯片可以驱动一台两相步进电机或四相步进电机,也可以驱动两台直流电机。 简要说明: 一、尺寸:80mmX45mm 二、主要芯片:L298N、光电耦合器 三、工作电压:控制信号直流5V;电机电压直流3V~46V(建议使用36伏以下) 四、最大工作电流:2.5A 五、额定功率:25W 特点:1、具有信号指示。 2、转速可调 3、抗干扰能力强 4、具有过电压和过电流保护 5、可单独控制两台直流电机 6、可单独控制一台步进电机 7、PWM脉宽平滑调速 8、可实现正反转

9、采用光电隔离 六、有详细使用说明书 七、提供相关软件 八、提供例程及其学习资料 实例一:步进电机的控制实例 步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。 一、步进电机最大特点是: 1、它是通过输入脉冲信号来进行控制的。 2、电机的总转动角度由输入脉冲数决定。 3、电机的转速由脉冲信号频率决定。 二、步进电机的驱动电路 根据控制信号工作,控制信号由单片机产生。(或者其他信号源) 如图:按CTRL并点击(L298N驱动器与直流电机接线图) 三、基本原理作用如下: 两相四拍工作模式时序图:

基于51单片机控制步进电机

单片机原理及系统课程设计 1 引言 步进电机又称为脉冲电动机或阶跃电动机,它是基于最基本的电磁感应作用,将电脉冲信号转变为角位移或线位移的开环控制元件。单片机控制的步进电机广泛地应用于工业自动控制、数控机床、组合机床、机器人、计算机外围设备、照相机,大型望远镜,卫星天线定位系统等等。 随着经济的发展,技术的进步和电子技术的发展,步进电机的应用领域更加广阔,同时也对步进电机的运行性能提出了更高的要求。 步进电机的原始模型起源于1830年至1860年,1870年前后开始以控制为目的的尝试,应用于氩弧灯的电极输送机构中,这被认为最早的步进电机。 1950年后期晶体管的发明也逐渐应用在步进电机上,对于数字化的控制变得更为容易。到20世纪60年代后期,在步进电机本体方面随着永磁材料的发展,各种实用性步进电机应运而生。步进电机往后经过不断改良,使得今日步进电机已广泛运用在需要高定位精度、高分解能、高响应性、信赖性等灵活控制性高的机械系统中。 在生产过程中要求自动化、省人力、效率高的机器中,我们很容易发现步进电机的踪迹,尤其以重视速度、位置控制、需要精确操作各项指令动作的灵活控制性场合步进电机用得最多。

2 设计方案与原理 4.1 设计方案 设计一个51单片机四相步进电机控制系统要求系统具有如下功能: (1)由I/O口产生的时序方波作为电机控制信号; (2)信号经过驱动芯片驱动电机的运转; (3)电机的状态通过键盘控制,包括正转,反转,加速,减速,停止和单步运行。 4.2 设计原理 步进电机实际上是一个数字\角度转换器,也是一个串行的数\模转换器。步进电机的基本控制包括启停控制、转向控制、速度控制、换向控制4个方面。从结构上看,步进电机分为三相、四相、五相等类型,本次设计的是四相电机。四相步进电机的工作方式有单四拍、双四拍和单双八拍三种。 在本次设计中,我们使用的是四相单八拍的工作方式。通过P1口给A,B,C,D四相依次输出高电平即可实现步进电机的旋转,通过控制两次输出的间隔,即可实现对步进电机的速度控制。 图 2.1 步进电机内部结构截图 根据步进电机的相关相序表我们可以正常的控制电机的步进运行。

A步进电机四相八拍

一.方案设计 本设计采用电压为DC12V的四相八拍步进电机35BYJ46型电机,用ULN2803作为步进电动机驱动电路主芯片,以8255A作为8088并行输出接口,8088对步进电机的控制信号则通过8255A送到ULN2803. 关于转向与转速,通过查表的方式实现,以逐次递增方向查表,依次输出表中数据,则步进电机正转;以逐次递减方向查表,则步进电机反转,即通过一个表实现步进电机的正转与反转。转速则通过调用延时子程序,当调用延时较长的子程序时,则步进电机转速慢,当调用延时较短的子程序时,步进电机转速加快。 二、硬件系统的基本原理 在工业控制系统里步进电动机是主要的控制元件之一。步进电机具有快速启动停止,精确定位和能够使用数字信号进行控制,能够实现脉冲-角度转换的特点,因此得到广泛的应用。在使用步进电机的控制系统里,脉冲分配器产生周期的控制脉冲序列,步进电机驱动器每接收一个脉冲就控制步进电机沿给定方向步进一步。 实验使用型号为35BYJ46的四相步进电机,采用四相八拍控制方式工作。步进电机的转角和转动方向取决于各相中通电脉冲的个数和顺序。8088控制机控制步进电机的电路见图1-1。计算机将表1-1所示的各种通电方式转换成相应的状态控制字,通过计算机将各种状态字依次送到接口电路,并根据速度的要求作相应的延时处理。由接口电路输出所需的控制脉冲通过驱动电路路使步进电机按要求动作。驱动电路使用ULN2803A达林顿晶体管,反相驱动,驱动电流可以达到500mA。驱动电路的作用是对控制脉冲进行放大,产生步进电机工作所需要的激励电流。

图1-1 步进电机控制实验原理图 35BYJ46型步进电机使用DC12V 电压,采用四相八拍控制相序。励磁线圈和励磁顺序如图1-2,控制相序如表1-1。表中的PB10~PB13对应并行接口8055的B 口0~3位。如果使用8255B 口的其它位则相应的状态字也要改变。 表1-1 步进电机四相八拍相序表 步 序 相 序 通电相 对应PB 口的输出值 (状态字) PB13 PB12 PB11 PB10 1 0 0 0 1 A 01H 2 0 0 1 1 AB 03H 3 0 0 1 0 B 02H 4 0 1 1 0 BC 06H 5 0 1 0 0 C 04H 6 1 1 0 0 CD 0CH 7 1 0 0 0 D 08H 8 1 0 1 DA 09H 1 2 3 4 5 6 7 8 5 + + + + + + + + 4 - - - 3 - - - 5 (黑) 4 (黄) 3 (棕) 2 (蓝) 1 (红) +12V A ’ B ’ C ’ D ’ A B C D PB0 PB1 PB2 PB3 8255 驱动单元 步进电动机

基于单片机的步进电动机控制器的设计

第一部分培训软件简介 Proteus软件是英国Lab Center Electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前比较好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。 Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MATLAB等多种编译器。 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。 第二部分培训项目实例 培训项目一:基于单片机的步进电动机控制器的设计 项目要求: 采用单片机对步进电机进行控制,包括正转、反转、加速、减速和停止,同时采用液晶显示屏显示步进电动机的运行情况。 培训目的: 1.掌握步进电机的工作原理;

基于AT89C51单片机的步进电动机控制系统设计

重庆科技大学 本科毕业论文 基于AT89C51单片机的步进电动机控制系统 设计 考生姓名: XXXXX X 准考证号: XXXXXXXXXXXX 专业层次:本科院(系):XXXXXXXXXXXXXXXXXXX 指导教师: XXXXXX 职称:讲师 重庆科技大学 二O一二年月日

基于AT89C51单片机的步进电动机控制系统 设计 考生姓名: XXXXXX 准考证号: XXXXXXXXXXXX 专业层次:本科 指导教师: XXXXXXX 院(系):机械与动力工程学院 重庆科技大学 二O一二年九月二十日

摘要 随着微电子和计算机技术的发展,步进电机的需求量与日俱增,它广泛用于打印机、电动玩具等消费类产品以及数控机床、工业机器人、医疗器械等机电产品中,其在各个国民经济领域都有应用。研究步进电机的控制系统,对提高控制精度和响应速度、节约能源等都具有重要意义。 步进电机是一种能将电脉冲信号转换成角位移或线位移的机电元件,步进电机控制系统主要由步进控制器,功率放大器及步进电机等组成。采用单片机控制,用软件代替上述步进控制器,使得线路简单,成本低,可靠性大大增加。软件编程可灵活产生不同类型步进电机励磁序列来控制各种步进电机的运行方式。 本设计是采用AT89C51单片机对步进电机的控制,通过I/O口输出的时序方波作为步进电机的控制信号,信号经过芯片ULN2003驱动步进电机。 实践证明,基于单片机控制的步进电机比传统的步进控制器具有更好的性能,更加简单、方便、可靠。本设计的主要研究对象就是开环伺服系统中最常用的执行器件——步进电机。 关键词:步进电机,单片机,正反转控制,键盘控制,LCD液晶显示

四相步进电机原理图及程序

四相步进电机原理图 本文先介绍该步进电机的工作原理,然后介绍了其驱动器的软、硬件设计。 1. 步进电机的工作原理 该步进电机为一四相步进电机,采用单极性直流电源供电。只要对步进电机的各相绕组按合适的时序通电,就能使步进电机步进转动。图1是该四相反应式步进电机工作原理示意图。 图1 四相步进电机步进示意图 开始时,开关SB接通电源,SA、SC、SD断开,B相磁极和转子0、3号齿对齐,同时,转子的1、4号齿就和C、D相 绕组磁极产生错齿,2、5号齿就和D、A相绕组磁极产生错齿。

当开关SC接通电源,SB、SA、SD断开时,由于C相绕组的磁力线和1、4号齿之间磁力线的作用,使转子转动,1、4号齿和C相绕组的磁极对齐。而0、3号齿和A、B相绕组产生错齿,2、5号齿就和A、D相绕组磁极产生错齿。依次类推,A、B、C、D四相绕组轮流供电,则转子会沿着A、B、C、D方向转动。 四相步进电机按照通电顺序的不同,可分为单四拍、双四拍、八拍三种工作方式。单四拍与双四拍的步距角相等,但单四拍的转动力矩小。八拍工作方式的步距角是单四拍与双四拍的一半,因此,八拍工作方式既可以保持较高的转动力矩又可以提高控制精度。 单四拍、双四拍与八拍工作方式的电源通电时序与波形分别如图2.a、b、c所示: a. 单四拍 b. 双四拍 c八拍 图2.步进电机工作时序波形图 2.基于AT89C2051的步进电机驱动器系统电路原理 步进电机驱动器系统电路原理如图3:

图3 步进电机驱动器系统电路原理图 AT89C2051将控制脉冲从P1口的P1.4~P1.7输出,经74LS14反相后进入9014,经9014放大后控制光电开关,光电隔离后,由功率管TIP122将脉冲信号进行电压和电流放大,驱动步进电机的各相绕组。使步进电机随着不同的脉冲信号分别作正转、反转、加速、减速和停止等动作。图中L1为步进电机的一相绕组。AT89C2051选用频率22MHz的晶振,选用较高晶振的目的是为了在方式2下尽量减小AT89C2051对上位机脉冲信号周期的影响。 图3中的RL1~RL4为绕组内阻,50Ω电阻是一外接电阻,起限流作用,也是一个改善回路时间常数的元件。D1~D4为续流二极管,使电机绕组产生的反电动势通过续流二极管(D1~D4)而衰减掉,从而保护了功率管TIP122不受损坏。

步进电机程序编写及说明

步进电机 学习交流群——126500542(验证信息:千寻琥珀心) 在这里介绍一下如何用51单片机驱动步进电机。 本例所使用的步进电机为四项驱动,驱动电压为12V,锯齿角(为什么叫锯齿叫而不叫步进角,我也不知道这样解释是否正确,但是根据步进角计算公式所得的结果将7.5理解为锯齿叫会更好些,也在网上搜了不少资料,说是步进角的较多,但都是直接给出的,而未作出计算,不过也有是将其作为锯齿角的,并且结合书上的内容,在此就将此作为锯齿角理解,那何谓步进角,下面公式将给出)为7.5度。(也就是说锯齿之间的单位角度),不进一圈总共需要360度,故有48个锯齿。 在此对电路图部分不再给出,具体引脚连接接下来给出。本例所使用的电机驱动芯片为达林顿驱动器(ULN2003),通过P1.0~P1.3分别接通步进电机的驱动线圈来控制步进电机的运转。注意如果直接使用单片机通过驱动芯片驱动电机,力矩可能不够大,效果不是很好,因为ULN2003的驱动电压为12V,而单片机系统电压为5V,故请读者注意此点,在设计电路时,另施电压。 步进电机要想正常工作,必须有驱动信号,转动的速度与驱动信号的频率是成正比的。(实例中将会给出并予以说明)接下来我们看看对于电机驱动中的信号的产生。 本例中采用的步进电机为四项,三项驱动和四项驱动原理上

是一样的。假设步进电机的四个项为:A、B、C、D。它的拍数可由读者任意设定(即步进节奏)。再继续下面的内容时,我们现在此给出一个计算步进电机的公式:Qs=360/NZr,其中N=McC 为运行的拍数,McC为控制绕组项数,C为状态系数,当采用单双本项拍数时,C=1,当采用单双本项一倍拍数时,C=2。(此处说的本项拍数,如三项为单三拍,双三拍。本项一倍拍数为单六拍,简言之,三拍为1.六拍为2对于四项则四拍为1,8拍为2(说的有些玄乎,手中板砖还望留情)),Zr为转子齿数,先来看看单四拍,即A→B→C→D→A.因为上述已经给出了锯齿数,此例C=1,所以Qs=360/(4*1*48)=1.875°。故此电机的步进角为1.875°(既步与步之间的角度),因为行进是和脉冲有关的,一个脉冲行进一步,那么行进一圈,所需脉冲数为:360/1.875=192个脉冲。同时我们如果控制这些脉冲的频率就可以直接控制步进电机的运转速度了。继续我们的单四拍,运行方向A→B→C→D →A。(假设为正转)则在程序中对应的操作执行码为:(硬件连接时P1口的高四位不用全置1,此处只需用到低四位) P1.3 P1.2 P1.1 P1.0 D C B A (对应4个线圈) 1 1 1 0 0xfe (根据外部链接电路定,也可以是0001,此处采用低电平导通,导通A项线圈) 1 1 0 1 0xfd (导通B项线圈) 1 0 1 1 0xfb (导通C项线圈)

PLC控制步进电机的实例(图与程序)

PLC控制步进电机的实例(图与程序) ·采用绝对位置控制指令(DRVA),大致阐述FX1S控制步进电机的方法。由于水平有限,本实例采用非专业述语论述,请勿引用。 ·FX系列PLC单元能同时输出两组100KHZ脉冲,是低成本控制伺服与步进电机的较好选择! ·PLS+,PLS-为步进驱动器的脉冲信号端子,DIR+,DIR-为步进驱动器的方向信号端子。 ·所谓绝对位置控制(DRVA),就是指定要走到距离原点的位置,原点位置数据存放于32位寄存器D8140里。当机械位于我们设定的原点位置时用程序把D8140的值清零,也就确定了原点的位置。 ·实例动作方式:X0闭合动作到A点停止,X1闭合动作到B点停止,接线图与动作位置示例如左图(距离用脉冲数表示)。

·程序如下图:(此程序只为说明用,实用需改善。) ·说明: ·在原点时将D8140的值清零(本程序中没有做此功能) ·32位寄存器D8140是存放Y0的输出脉冲数,正转时增加,反转时减少。当正转动作到A点时,D8140的值是3000。此时闭合X1,机械反转动作到B点,也就是-3000的位置。D8140的值就是-3000。 ·当机械从A点向B点动作过程中,X1断开(如在C点断开)则D8140的值就是200,此时再闭合X0,机械正转动作到A点停止。 ·当机械停在A点时,再闭合X0,因为机械已经在距离原点3000的位置上,故而机械没有动作! ·把程序中的绝对位置指令(DRVA)换成相对位置指令(DRVI): ·当机械在B点时(假设此时D8140的值是-3000)闭合X0,则机械正转3000个脉冲停止,也就是停在了原点。D8140的值为0 ·当机械在B点时(假设此时D8140的值是-3000)闭合X1,则机械反转3000个脉冲停止,也就是停在了左边距离B点3000的位置(图中未画出),D8140的值为-6000。 ·一般两相步进电机驱动器端子示意图: ·FREE+,FREE-:脱机信号,步进电机的没有脉冲信号输入时具有自锁功能,

51单片机控制四相步进电机解析

51单片机控制四相步进电机 2009年07月21日星期二 12:44 51单片机控制四相步进电机 2009-03-01 18:53 接触单片机快两年了,不过只是非常业余的兴趣,实践却不多,到现在还算是个初学者吧。这几天给自己的任务就是搞定步进电机的单片机控制。以前曾看过有关步进电机原理和控制的资料,毕竟自己没有做过,对其具体原理还不是很清楚。今天从淘宝网买了一个EPSON的UMX-1型步进电机,此步进电机为双极性四相,接线共有六根,外形如下 图所示: 详细内容: https://www.360docs.net/doc/ed3819970.html,/31907887_d.h tml

拿到步进电机,根据以前看书对四相步进电机的了解,我对它进行了初步的测试,就是将5伏电源的正端接上最边上两根褐色的线,然后用5伏电源的地线分别和另外四根线(红、兰、白、橙)依次接触,发现每接触一下,步进电机便转动一个角度,来回五次,电机刚好转一圈,说明此步进电机的步进角度为360/(4×5)=18度。地线与四线接触的顺序相反,电机的转向也相反。 如果用单片机来控制此步进电机,则只需分别依次给四线一定时间的脉冲电流,电机便可连续转动起来。通过改变脉冲电流的时间间隔,就可以实现对转速的控制;通过改变给四

线脉冲电流的顺序,则可实现对转向的控制。所以,设计了如下电路图: C51程序代码为: 代码一 #include static unsigned int count; static unsigned int endcount; void delay(); void main(void)

基于51系列单片机控制步进电机调速实验 (自动保存的)

基于51系列单片机控制步进电机调速实验 实验指导书 仇国庆编写 重庆邮电大学自动化学院 自动化专业实验中心 2009年2月

基于51系列单片机控制步进电机调速实验 实验目的及要求: 1、熟悉步进电机的工作原理 2、熟悉51系列单片机的工作原理及调试方法 3、设计基于51系列单片机控制的步进电机调速原理图(要求实现电机的速度反馈测量,测量方式:数字测量) 4、实现51系列单片机对步进电机的速度控制(步进电机由实验中心提供,具体型号42BYG )由按钮控制步进电机的启动与停止;实现加速、匀速、和减速控制。速度设定由键盘设定,步进电机的反馈速度由LED 数码管显示。 实验原理: 步进电机控制原理 一般电动机都是连续旋转,而步进电动却是一步一步转动的,故叫步进电动机。步进电机是数字控制电机,它将脉冲信号转变成角位移,即给一个脉冲信号,步进电机就转动一个角度,因此非常适合于单片机控制。步进电机可分为反应式步进电机(简称VR)、永磁式步进电机(简称PM)和混合式步进电机(简称HB)。因此步进电动机是一种把脉冲变为角度位移(或直线位移)的执行元件。步进电动机的转子为多极分布,定子上嵌有多相星形连接的控制绕组,由专门电源输入电脉冲信号,每输入一个脉冲信号,步进电动机的转子就前进一步。由于输入的是脉冲信号,输出的角位移是断续的,所 以又称为脉冲电动机。随着数字控制系统的发展,步进电动机的应用将 逐渐扩大。 步进电机区别于其他控制电机的最大特点是,它是通过输入脉冲信号来 进行控制的,即电机的总转动角度由输入脉冲数决定,而电机的转速由 脉冲信号频率决定。步进电机的驱动电路根据控制信号工作,控制信号 可以由单片机产生。 电机转子均匀分布着很多小齿,定子齿有三个励磁绕阻,其几 何轴线依次分别与转子齿轴线错开。0、1/3て、2/3て,(相邻 两转子齿轴线间的距离为齿距以て表示),即A与齿1相对齐, B与齿2向右错开1/3て,C与齿3向右错开2/3て,A'与齿5相对齐,(A'就是A,齿5就是齿1)下面是定转子的展开图:(图2所示)

四相步进电机驱动电路及驱动程序设计

四相步进电机驱动电路及驱动程序设计 我们用一个单片机控制多个步进电机指挥跳舞机器人的双肩、双肘和双脚伴着音乐做出各种协调舒缓充满感情的动作,荣获一等奖。电路采用74373锁存,74LS244和ULN2003作电压和电流驱动,单片机(Atc52)作脉冲序列信号发生器。程序设计基于中断服务和总线分时利用方式,实时更新各个电机的速度、方向。整个舞蹈由运动数据所决定的一截截动作无缝连接而成。本文主要介绍一下这个机器人的四相五线制步进电机驱动电路及程序设计. 1、步进电机简介 步进电机根据内部线圈个数不同分为二相制、三相制、四相制等。本文以四相制为例介绍其内部结构。图1为四相五线制步进电机内部结构示意图。

2、四相五线制步进电机的驱动电路 电路主要由单片机工作外围电路、信号锁存和放大电路组成。我们利用了单片机的I/O端口,通过74373锁存,由74LS244驱动,ULN2003对信号进行放大。8个电机共用4bit I/O端口作为数据总线,向电机传送步进脉冲。每个电机分配1bit的I/O端口用作74373锁存信号,锁存步进电机四相脉冲,经ULN2003放大到12V驱动电机运转。 电路原理图(部分)如图2所示。 (1)Intel 8051系列单片机是一种8位的嵌入式控制器,可寻址64K字节,共有32个可编程双向I/O口,分别称为P0~P3。该系列单片机上集成8K的ROM,128字节RAM可供使用。 (2)74LS244为三态控制芯片,目的是使单片机足以驱动ULN2003。

ULN2003是常用的达林顿管阵列,工作电压是12V,可以提供足够的电流以驱动步进电机。关于这些芯片的详细介绍可参见它们各自的数据手册。 (3)74373是电平控制锁存器,它可使多个步进电机共用一组数据总线。我们用P1.0~P1.7作为8个电机的锁存信号输出端,见表1。 这是一种基于总线分时复用的方式,以动态扫描的方式来发送控制信号,这和高级操作系统里的多任务进程调度的思想一致。这种方法明显的好处是节省I/O口,使系统可以控制更多的步进电机。本电路设计为控制8个。 3 、程序设计 传统的步进电机驱动程序利用简单的条件循环来发送脉冲序列,但当电机数目发生变化时,编程繁杂,冗余代码较多,难以做到信号占空比一致,进而产生“抖动” 现象。下面提出一种基于中断服务方式,面向舞蹈动作,可实时改变各个电机速度和方向(每200ms可改变一次)的程序设计方法。 3.1 速度归一化和线性关系 我们将速度量化成一个-128~127内可变的数,正号代表正转,负号代表返转,称之归一化速度(-128~127为一个字节)。给每个电机分

51单片机控制步进电机程序及硬件电路图

#include static unsigned int count; //计数 static int step_index; //步进索引数,值为0-7 static bit turn; //步进电机转动方向 static bit stop_flag; //步进电机停止标志 static int speedlevel; //步进电机转速参数,数值越大速度越慢,最小值为1,速度最快static int spcount; //步进电机转速参数计数 void delay(unsigned int endcount); //延时函数,延时为endcount*0.5毫秒 void gorun(); //步进电机控制步进函数 void main(void) { count = 0; step_index = 0; spcount = 0; stop_flag = 0; P1_0 = 0; P1_1 = 0; P1_2 = 0; P1_3 = 0; EA = 1; //允许CPU中断 TMOD = 0x11; //设定时器0和1为16位模式1 ET0 = 1; //定时器0中断允许 TH0 = 0xFE;

TL0 = 0x0C; //设定时每隔0.5ms中断一次TR0 = 1; //开始计数 turn = 0; speedlevel = 2; delay(10000); speedlevel = 1; do{ speedlevel = 2; delay(10000); speedlevel = 1; delay(10000); stop_flag=1; delay(10000); stop_flag=0; }while(1); } //定时器0中断处理 void timeint(void) interrupt 1 { TH0=0xFE; TL0=0x0C; //设定时每隔0.5ms中断一次count++; spcount--; if(spcount<=0) { spcount = speedlevel; gorun(); } } void delay(unsigned int endcount) { count=0; do{}while(count

四相六线步进电机驱动

交直流电机控制课程设计 任务书 (09级) 步进电机控制 学生姓名沈滨彬 学号09143416 院系工学院机电系 专业自动化 指导教师叶军 填写日期2012-10-17

目录 1. 设计任务与要求 (3) 2.总体方案设计 (3) 2.1设计思路 (3) 2.2方案论证与比较 (3) 2.2.1驱动电路选择方案 (3) 2.2.2 显示模块选择方案 (3) 3 硬件设计 (4) 3.1 步进电机控制系统设计 (4) 3.2 5V稳压电路 (4) 3.3 电机驱动电路 (5) 3.4 人机交互界面 (6) 4 实物图 (7) 5.参考文献 (7) 6.致谢 (8) 7.元器件清单: (8) 附录一: (9)

1. 设计任务与要求 1.1、设计题目 步进电机控制 1.2、内容与要求 设计一步进电机控制系统,实现对电机的正转,反转和速度控制。 1.3、设计任务 1)画出系统原理图。 2)硬件电路设计及描述。 3)任选一种语言编写程序。 4)仿真实验。 5)编写设计说明书一份。 2.总体方案设计 2.1设计思路 本系统设计的步进电机控制系统,以单片机STC12C5A60S2为主控芯片,包括主控器、驱动电路以及人机交互界面。本设计主要通过单片机进行相序输出,经过ULN2803进行电流放大后驱动电机运行。。 2.2方案论证与比较 2.2.1驱动电路选择方案 方案一:采用mc3479,此芯片控制简单,可输出整步/半步相序,省去软件方面的很多麻烦,由于实验室暂无此元件,因此不选此方案。 方案二:采用ULN2803,此芯片主要是用来放大电流的,相对mc3479控制,比较麻烦,但价格便宜,身边正好有此元件因此采用此方案。 2.2.2 显示模块选择方案 方案一:采用SMS0801,驱动方便,但是无法显示中文,外观欠佳,因此不采用。 方案二:采用12864,可以显示中文文字、数字、英文字母等等,功能强大,故选择方案二。

FX1S控制步进电机的实例(图与程序

FX1S控制步进电机的实例(图与程序) FX1S控制步进电机的实例(图与程序) : ·采用绝对位置控制指令(DRVA),大致阐述FX1S控制步进电机的方法。·FX系列PLC 单元能同时输出两组100KHZ脉冲,是低成本控制伺服与步进电机的较好选择! ·PLS+,PLS-为步进驱动器的脉冲信号端子,DIR+,DIR-为步进驱动器的方向信号端子。 ·所谓绝对位置控制(DRVA),就是指定要走到距离原点的位置,原点位置数据存放于32位寄存器D8140里。当机械位于我们设定的原点位置时用程序把D8140的值清零,也就确定了原点的位置。 ·实例动作方式:X0闭合动作到A点停止,X1闭合动作到B点停止,接线图与动作位置示例如左图(距离用脉冲数表示)。 ·程序如下图:(此程序只为说明用,实用需改善。)

说明: ·在原点时将D8140的值清零(本程序中没有做此功能) ·32位寄存器D8140是存放Y0的输出脉冲数,正转时增加,反转时减少。当正转动作到A点时,D8140的值是3000。此时闭合X1,机械反转动作到B点,也就是-3000的位置。D8140的值就是-3000。 ·当机械从A点向B点动作过程中,X1断开(如在C点断开)则D8140的值就是200,此时再闭合X0,机械正转动作到A点停止。 ·当机械停在A点时,再闭合X0,因为机械已经在距离原点3000的位置上,故而机械没有动作! ·把程序中的绝对位置指令(DRVA)换成相对位置指令(DRVI): ·当机械在B点时(假设此时D8140的值是-3000)闭合X0,则机械正转3000个脉冲停止,也就是停在了原点。D8140的值为0 ·当机械在B点时(假设此时D8140的值是-3000)闭合X1,则机械反转3000个脉冲停止,也就是停在了左边距离B点3000的位置(图中未画出),D8140的值为-6000。 ·一般两相步进电机驱动器端子示意图:

51单片机驱动步进电机的方法(详解)

51单片机驱动步进电机的方法2019.02 这款步进电机的驱动电压12V,步进角为7.5度. 一圈360 度, 需要48 个脉冲完成!!! 该步进电机有6根引线,排列次序如下:1:红色、2:红色、3:橙色、4:棕色、5:黄色、6:黑色。 采用51驱动ULN2003的方法进行驱动。 ULN2003的驱动直接用单片机系统的5V电压,可能力矩不是很大,大家可自行加大驱动电压到12V。 ;****************************************************************************** ;*************************步进电机的驱动*************************************** ; DESIGN BY BENLADN911 FOSC = 12MHz 2005.05.19

;--------------------------------------------------------------------------------- ; 步进电机的驱动信号必须为脉冲信号!!! 转动的速度和脉冲的频率成正比!!! ; 本步进电机步进角为7.5度. 一圈360 度, 需要48 个脉冲完成!!! ;--------------------------------------------------------------------------------- ; A组线圈对应P2.4 ; B组线圈对应P2.5 ; C组线圈对应P2.6 ; D组线圈对应P2.7 ; 正转次序: AB组--BC组--CD组--DA组(即一个脉冲,正转7.5 度) ;---------------------------------------------------------------------------------- ;----------------------------正转-------------------------- ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV R3,#144 正转3 圈共144 脉冲 START: MOV R0,#00H START1: MOV P2,#00H MOV A,R0 MOV DPTR,#TABLE MOVC A,@A+DPTR JZ START 对A 的判断,当A = 0 时则转到START MOV P2,A LCALL DELAY INC R0 DJNZ R3,START1 MOV P2,#00H LCALL DELAY1 ;-----------------------------反转------------------------ MOV R3,#144 反转一圈共144 个脉冲 START2: MOV P2,#00H

三相混合式步进电机驱动器的设计原理和控制详解

上海昀研自动化科技有限公司自2004年起致力于三相混合式步进电机及驱动器的开发,42系列低压三相混合式步进电机,57系列低压、高压三相混合式步进电机,86系列低压、高压三相混合式步进电机,110、130系列高压三相混合式步进电机,YK3605MA,TK3411MA,YK3822MA,YKA3722MA等多款产品已成功应用于市场。 上海昀研自动化科技有限公司生产的三相混合式步进电机采用交流伺服原理工作,转子和定子的直径比高达50%,高速时工作扭矩大,低速时运行极其平稳,几乎无共振区。其配套驱动器YK3822MA具有单相220V/50Hz输入,三相正弦输出,输出电流可设置,具有十细分和半流额定值60%功能;控制方式灵活,有“脉冲+方向控制”,也有“正转脉冲+反转脉冲”控制方式;有过热保护功能,因此使用起来十分的方便。 1.前言 步进电机是一种开环伺服运动系统执行元件,以脉冲方式进行控制,输出角位移。与交流伺服电机及直流伺服电机相比,其突出优点就是价格低廉,并且无积累误差。但是,步进电机运行存在许多不足之处,如低频振荡、噪声大、分辨率不高等,又严重制约了步进电机的应用范围。步进电机的运行性能与它的驱动器有密切的联系,可以通过驱动技术的改进来克服步进电机的缺点。相对于其他的驱动方式,细分驱动方式不仅可以减小步进电机的步距角,提高分辨率,而且可以减少或消除低频振动,使电机运行更加平稳均匀。总体来说,细分驱动的控制效果最好。因为常用低端步进电机伺服系统没有编码器反馈,所以随着电机速度的升高其内部控制电流相应减小,从而造成丢步现象。所以在速度和精度要求不高的领域,其应用非常广泛。 因为三相混合式步进电机比二相步进电机有更好的低速平稳性及输出力矩,所以三相混合式步进电机比二相步进电机有更好应用前景。传统的三相混合式步进电机控制方法都是以硬件比较器完成,本文主要讲述使用DSP及空间矢量算法SVPWM来实现三相混合式步进电机控制。 2.细分原理 步进电机的细分控制从本质上讲是通过对步进电机的定子绕组中电流的控制,使步进电机内部的合成磁场按某种要求变化,从而实现步进电机步距角的细分。最佳的细分方式是恒转矩等步距角的细分。一般情况下,合成磁场矢量的幅值决定了电机旋转力矩的大小,相邻两合成磁场矢量的之间的夹角大小决定了步距角的大小。在电机内产生接近均匀的圆形旋转磁场,各相绕组的合成磁场矢量,即各相绕组电流的合成矢量应在空间作幅值恒定的旋转运动,这就需要在各相绕相中通以正弦电流。 三相混合式步进电机的工作原理十分类似于交流永磁同步伺服电机。其转子上所用永磁磁铁同样是具有高磁密特性的稀土永磁材料,所以在转子上产生的感应电流对转子磁场的影响可忽略不计。在结构上,它相当于一种多极对数的交流永磁同步电机。由于输入是三相正弦电流,因此产生的空间磁场呈圆形分布,而且可以用永磁式同步电机的结构模型(图1)分析三相混合式步进电机的转矩特性。为便于分析,可做如下假设: a.电机定子三相绕组完全对称; b.磁饱和、涡流及铁心损耗忽略不计; c.激磁电流无动态响应过程。

相关文档
最新文档