步进电机ULN.docx

上传人:b****5 文档编号:3787376 上传时间:2022-11-25 格式:DOCX 页数:18 大小:100.46KB
下载 相关 举报
步进电机ULN.docx_第1页
第1页 / 共18页
步进电机ULN.docx_第2页
第2页 / 共18页
步进电机ULN.docx_第3页
第3页 / 共18页
步进电机ULN.docx_第4页
第4页 / 共18页
步进电机ULN.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

步进电机ULN.docx

《步进电机ULN.docx》由会员分享,可在线阅读,更多相关《步进电机ULN.docx(18页珍藏版)》请在冰豆网上搜索。

步进电机ULN.docx

步进电机ULN

步进电机驱动器的设计

 

摘要:

由在单片机结合ULN2003组成单片机的驱动系统的程序设计过程中,通过操作按键对步进电机的正转、反转和启动、停止。

 

关键词:

单片机驱动步进电机

 

目录

 

一、单片机的驱动原理.....................................3

二、单片机最小系统.......................................4

三、Max232串口电路......................................7

四、步进电机驱动模块电路..................................8

五、系统的软件设计.......................................9

附:

参考文献..............................................33

 

一、步进电机的驱动原理

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

在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。

这一线性关系的存在,加上步进电机只有周期性的误差而无累积误差等特点。

使得在速度、位置等控制领域用步进电机来控制变的非常的简单。

您可以通过控制脉冲个数来控制角位移量,从而达到准确定位的目的;同时您可以通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的。

虽然步进电机已被广泛地应用,但步进电机并不能象普通的直流电机,交流电机在常规下使用。

它必须由双环形脉冲信号、功率驱动电路等组成控制系统方可使用。

因此用好步进电机却非易事,它涉及到机械、电机、电子及计算机等许多专业知识。

  步进电机是将电脉冲信号转变为角位移或线位移的一种开环线性执行元件,具有无累积误差、成本低、控制简单特点。

产品从相数上分有二、三、四、五相,从步距角上分有0.9°/1.8°、0.36°/0.72°,从规格上分有口42~φ130,从静力矩上分有0.1N·M~40N·M。

(本实验提供的是四相步进电机,它对外有六条引线,其中二条为公共端、另四条分别为A相、B相、C相、D相,但引线具体排序未知,故在使用前需对步进电机进行分析、测试,并判断出具体的相序。

 

二、单片机最小系统

单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:

单片机、晶振电路、复位电路.

下面给出一个51单片机的最小系统电路图.

说明:

复位电路:

由电容串联电阻构成,由图并结合"电容电压不能突变"的性质,可以知道,当系统一上电,RST脚将会出现高电平,并且,这个高电平持续的时间由电路的RC值来决定.典型的51单片机当RST脚的高电平持续两个机器周期以上就将复位,所以,适当组合RC的取值就可以保证可靠的复位.一般教科书推荐C取10u,R取8.2K.当然也有其他取法的,原则就是要让RC组合可以在RST脚上产生不少于2个机周期的高电平.至于如何具体定量计算,可以参考电路分析相关书籍.

晶振电路:

典型的晶振取11.0592MHz(因为可以准确地得到9600波特率和19200波特率,用于有串口通讯的场合)/12MHz(产生精确的uS级时歇,方便定时操作)

复位电路

一、复位电路的用途

单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。

单片机也一样,当单片机系统在运行中,受到环境干扰出现程序跑飞的时候,按下复位按钮内部的程序自动从头开始执行。

单片机复位电路如下图:

二、复位电路的工作原理

在书本上有介绍,51单片机要复位只需要在第9引脚接个高电平持续2US就可以实现,那这个过程是如何实现的呢?

在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。

所以可以通过按键的断开和闭合在运行的系统中控制其复位。

开机的时候为什么为复位?

在电路图中,电容的的大小是10uF,电阻的大小是10k。

所以根据公式,可以算出电容充电到电源电压的0.7倍(单片机的电源是5V,所以充电到0.7倍即为3.5V),需要的时间是10K*10UF=0.1S。

也就是说在电脑启动的0.1S内,电容两端的电压时在0~3.5V增加。

这个时候10K电阻两端的电压为从5~1.5V减少(串联电路各处电压之和为总电压)。

所以在0.1S内,RST引脚所接收到的电压是5V~1.5V。

在5V正常工作的51单片机中小于1.5V的电压信号为低电平信号,而大于1.5V的电压信号为高电平信号。

所以在开机0.1S内,单片机系统自动复位(RST引脚接收到的高电平信号时间为0.1S左右)。

按键按下的时候为什么会复位?

在单片机启动0.1S后,电容C两端的电压持续充电为5V,这是时候10K电阻两端的电压接近于0V,RST处于低电平所以系统正常工作。

当按键按下的时候,开关导通,这个时候电容两端形成了一个回路,电容被短路,所以在按键按下的这个过程中,电容开始释放之前充的电量。

随着时间的推移,电容的电压在0.1S内,从5V释放到变为了1.5V,甚至更小。

根据串联电路电压为各处之和,这个时候10K电阻两端的电压为3.5V,甚至更大,所以RST引脚又接收到高电平。

单片机系统自动复位。

总结:

1、复位电路的原理是单片机RST引脚接收到2US以上的电平信号,只要保证电容的充放电时间大于2US,即可实现复位,所以电路中的电容值是可以改变的。

2、按键按下系统复位,是电容处于一个短路电路中,释放了所有的电能,电阻两端的电压增加引起的。

 

三、Max232串口电路

MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的接口电路,使用+5V单电源供电。

内部结构基本可分三个部分:

第一部分是电荷泵电路。

由1、2、3、4、5、6脚构成。

功能是产生+12V和-12V两个电源,提供给RS-232串口电平的需要。

第二部分是数据转换通道。

由7、8、9、10、11、12、13、14脚构成两个数据通道。

其中13脚(R0IN)、12脚(R0OUT)、11脚(T0IN)、14脚(T0OUT)为第一数据通道。

8脚(R1IN)、9脚(R1OUT)、10脚(T1IN)、7脚(T1OUT)为第二数据通道。

TTL/CMOS数据从T0IN、T1IN输入转换成RS-232数据从T0OUT、T1OUT送到电脑DP9插头;DP9插头的RS-232数据从R0IN、R1IN输入转换成TTL/CMOS数据后从R0OUT、R1OUT输出。

第三部分是供电。

15脚GND、16脚VCC(+5V)。

因为单片机输入、输出电平为TTL电平,而PC机配置的是RS-232C标准接口,二者的电气规范不同,所以要加电平转换电路。

给出了采用MAX-232芯片的PC机和单片机串行通信接口电路,与PC机相连采用9芯标准插座。

 

四、步进电机驱动模块电路

电路如下图所示:

 

 

五、系统的软件设计

要求:

可通过操作按键对步进电机的正转、反转、和启动、停止进行控制。

程序如下:

#include

#include//要用到_nop_();函数

#include

#defineucharunsignedchar

#defineuintunsignedint

ucharkey;

intn;

staticuchari;

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

/***********单片机引脚定义************/

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

/*DefineADCoperationconstforADC_CONTR*/

#defineADC_POWER0x80//ADCpowercontrolbit

#defineADC_FLAG0x10//ADCcompleteflag

#defineADC_START0x08//ADCstartcontrolbit

#defineADC_SPEEDLL0x00//540clocks

#defineADC_SPEEDL0x20//360clocks

#defineADC_SPEEDH0x40//180clocks

#defineADC_SPEEDHH0x60//90clocks

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

/*********************硬件部分********************************/

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

//按键控制

sbitk1=P1^3;

sbitk2=P1^2;

sbitk3=P1^1;

sbitk4=P1^0;

//电机驱动

sbitF1=P2^4;

sbitF2=P2^5;

sbitF3=P2^6;

sbitF4=P2^7;

//12864

sbitCS=P2^3;//片选高电平有效单片LCD使用时可固定高电平

sbitSID=P2^6;//数据

sbitSCLK=P2^5;//时钟

sbitPSB=P2^4;//串并口选择/******************************************************************************/

/**********数据部分***********/

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

//12864

voidWrite_char(bitstart,ucharddata);

voidSend_byte(ucharbbyte);

voidDelaynms(uintdi);

voidLcd_init(void);

voidLCD_Write_string(ucharX,ucharY,uchar*s);

voidLCD_set_xy(ucharx,uchary);

voiddisplay();

ucharcodewaves[]={"电机转动方式:

"};

ucharcodeznwk1[]={"启动"};

ucharcodeznwk2[]={"停止"};

ucharcodeznwk3[]={"正转"};

ucharcodeznwk4[]={"反转"};

//电机

voidstop();

voidmotor_ffw(ucharf);

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

/************各延时程序**************/

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

voiddelay()//电机延时

{

for(n=0;n<550;n++)

{_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

}

}

voiddelay10ms()//按键延时,去抖动

{

ucharms,km;

for(ms=10;ms>0;ms--)

for(km=150;km>0;km--);

}

voidDelaynms(uintdi)//12864延时

{

uintda,db;

for(da=0;da

for(db=0;db<10;db++);

}

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

voidInt_232(void)//232初始化

{

TMOD=0x20;

SCON=0x50;

TH1=0xFD;

TL1=0xFD;

TR1=1;

TI=0;

}

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

/**************12864显示部分*****************/

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

voidLcd_init(void)//初始化LCD

{

Delaynms(10);//启动等待,等LCM讲入工作状态

CS=1;

Write_char(0,0x30);//8位介面,基本指令集

Write_char(0,0x0c);//显示打开,光标关,反白关

Write_char(0,0x01);//清屏,将DDRAM的地址计数器归零

}

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

voidWrite_char(bitstart,ucharddata)//写指令或数据

{

ucharstart_data,Hdata,Ldata;

if(start==0)

start_data=0xf8;//写指令

else

start_data=0xfa;//写数据

Hdata=ddata&0xf0;//取高四位

Ldata=(ddata<<4)&0xf0;//取低四位

Send_byte(start_data);//发送起始信号

Delaynms(5);//延时是必须的

Send_byte(Hdata);//发送高四位

Delaynms

(1);//延时是必须的

Send_byte(Ldata);//发送低四位

Delaynms

(1);//延时是必须的

}

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

voidSend_byte(ucharbbyte)//发送一个字节

{

ucharled;

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

{

SID=bbyte&0x80;//取出最高位

SCLK=1;

Delaynms

(1);

SCLK=0;

Delaynms

(1);

bbyte<<=1;//左移

Delaynms

(1);

}

}

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

voidClr_Scr(void)//清屏函数

{

Write_char(0,0x01);

}

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

voidLCD_set_xy(ucharx,uchary)

{//设置LCD显示的起始位置,X为行,Y为列

ucharaddress;

switch(x)

{

case0:

address=0x80+y;break;

case1:

address=0x80+y;break;

case2:

address=0x90+y;break;

case3:

address=0x88+y;break;

case4:

address=0x98+y;break;

default:

address=0x80+y;break;

}

Write_char(0,address);

}

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

voidLCD_Write_string(ucharX,ucharY,uchar*s)

{//中英文字符串显示函数

LCD_set_xy(X,Y);

while(*s)

{

Write_char(1,*s);

s++;

Delaynms

(1);

}

}

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

/*voidLCD_Write_number(unsignedchars)//数字显示函数

{

Write_char(1,num[s]);

Delaynms

(1);

}

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

/*voidLcd_Mark2(void)

{

Clr_Scr();//清屏

LCD_Write_string(1,0,znwk);//

LCD_Write_string(2,0,waves);//

}

*/

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

voiddisplay()

{//uintk;

LCD_Write_string(2,0,waves);

if(k1==0)

{

LCD_Write_string(3,4,znwk1);

}

elseif(k2==0)

{

LCD_Write_string(3,4,znwk2);

}

elseif(k3==0)

{

LCD_Write_string(3,4,znwk3);

}

elseif(k4==0)

{

LCD_Write_string(3,4,znwk4);

}

}//******************************************************************

//**********************电机转动*********************************

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

voidmotor_ffw(ucharf)//f方向,f=0右转,

{if(f==0)

{

i++;

if(i==9)

{

i=1;

}

}

elseif(f==1)

{

i--;

if(i==0)

{

i=8;

}

}

switch(i)//一步转0.9度

{

/*case1:

F1=0;F2=1;F3=0;F4=1;break;

case2:

F1=0;F2=1;F3=1;F4=0;break;

case3:

F1=1;F2=0;F3=1;F4=0;break;

case4:

F1=1;F2=0;F3=0;F4=1;break;*/

case1:

F1=0;F2=1;F3=1;F4=1;break;

case2:

F1=0;F2=0;F3=1;F4=1;break;

case3:

F1=1;F2=0;F3=1;F4=1;break;

case4:

F1=1;F2=0;F3=0;F4=1;break;

case5:

F1=1;F2=1;F3=0;F4=1;break;

case6:

F1=1;F2=1;F3=0;F4=0;break;

case7:

F1=1;F2=1;F3=1;F4=0;break;

case8:

F1=0;F2=1;F3=1;F4=0;break;

default:

break;

}delay();

}

voidmoving(ucharf,uintk)//g=0右转k=次数

{

while(k>0)

{

motor_ffw(f);

k--;

}

}

voidstop()//停止

{

F1=1;F2=1;F3=1;F4=1;

}

voidgoing()//启动后正反转

{

if(key==1)

{

moving(0,1);

}

elseif(key==2)

{

stop();

}

elseif(key==3)

{

moving(0,1);

}

elseif(key==4)

{

moving(1,1);

}

else;

}

voidscan()//按键控制

{

if(k1==0)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 中职中专

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1