nbhkdz.com冰点文库

步进电机实训报告

时间:2011-03-19


步进电机验报告
摘要 本设计主要是运用 AT89C52 单片机控制步进电机系统, 由单片机产生驱动脉冲信号, 控制步进电机以一定的转速向 某一方向产生一定的转动角度。同时能够利用单片机实现电 机的正转及速度控制,在数码管上显示出相应的速度以及超 速报警灯功能。 报告给出了该系统设计的硬件电路,软件设计,人机交 互等。主要内容包括以下几个方面: 单片机控制电机的原理。 电机驱动及控制的实现。 控制系统整体设计。 原理图。 C 程序代码。 关键词:单片机;步进电机;

第1页

前言
本设计主要目的是为了实现步进电机的综合控制,也就 是设计一套控制步进电机的系统。意义在于增强自己的专业 技能,锻炼自己的动手能力。实验最终应能实现对步进电机 的综合控制,包括加速减速,超速报警等。而本设计要解决 的主要问题正是如何实现超速报警以及加速减速指示灯的 亮灭问题。

第2页





一、实验目的··················· ···················4 二、实验内容··················· ···················4 三、方案论证··················· ···················4 四、步进电机的基本原理 ①步进电机概况·················4 ················ ②步进电机的一些基本参数············5 ··········· ③步进电机的一些特点··············5 ············· ④步进电机动态指标及术语············6 ··········· 五、C 程序清单·················· ··················7 六、 实验心得及结论················ 13 ················ 七、 附录····················· 14 ····················· 八、 参考文献··················· 16 ···················

第3页

一、 实验目的 步进电机作为一种数字控制电机,可以准确的控制角度和距 离,应用非常广泛,本实验利用 AT89C52 单片机通过编写程 序实现对步进电机的综合控制,以便在实验中掌握步进电机 的运行原理,熟悉步进电机的工作特性以及单片机的应用原 理。 二、 实验内容 掌握步进电机控制的编程方法,根据程序连接步进电机电 路,使用单片机对步进电机进行综合控制。 三、 方案论证 本设计要求实现的具体功能包括用按键控制步进电机的正 转,加速,减速功能,并用数码管象征性的显示其速度。 方案采用 AT89C52 单片机作为整机的控制单元, 并且运用单 片机的定时功能定时,利用 P1 口产生矩形脉冲来控制步进 电机的转速,在显示单元用数码管的动态显示来显示速度, 可采用独立式键盘来进行人与系统的交互。 在驱动方面可采用 L298N 芯片或者 ULN2003 来驱动电机, 由于电路要求并不高,所以可以采用后者。 结构框图如下:

四、步进电机的基本原理 ①步进电机概况 步进电机作为执行元件,是机电一体化的关键产品之一, 广泛应用在各种自动化控制系统中。随着微电子和计算机技 术的发展,步进电机的需求量与日俱增,在各个国民经济领 域都有应用。 步进电机是一种将电脉冲转化为角位移的执行机构。 当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设 定的方向转动一个固定的角度(称为“步距角”),它的旋转 是以固定的角度一步一步运行的。可以通过控制脉冲个数来 控制角位移量,从而达到准确定位的目的;同时可以通过控
第4页

制脉冲频率来控制电机转动的速度和加速度,从而达到调速 的目的。步进电机可以作为一种控制用的特种电机,利用其 没有积累误差(精度为 100%)的特点, 广泛应用于各种开环控 制。 现在比较常用的步进电机包括反应式步进电机(vr) 、 永磁式步进电机(pm) 、混合式步进电机(hb)和单相式步 进电机等。 永磁式步进电机一般为两相,转矩和体积较小,步进 角一般为 7.5 度 或 15 度; 反应式步进电机一般为三相,可实现大转矩输出,步 进角一般为 1.5 度,但噪声和振动都很大。反应式步进电机 的转子磁路由软磁材料制成,定子上有多相励磁绕组,利用 磁导的变化产生转矩。 混合式步进电机是指混合了永磁式和反应式的优点。 它又分为两相和五相:两相步进角一般为 1.8 度而五相步进 角一般为 0.72 度。这种步进电机的应用最为广泛,也是本 次细分驱动方案所选用的步进电机。 ② 步进电机的一些基本参数: 1)电机固有步距角: 它表示控制系统每发一个步进脉冲信号,电机所转动的 角度。 电机出厂时给出了一个步距角的值,如 86byg250a 型电 机给出的值为 0.9°/1.8°(表示半步工作时为 0.9°、整步 , ‘电机固有步距角’ , 工作时为 1.8°)这个步距角可以称之为 它不一定是电机实际工作时的真正步距角,真正的步距角和 驱动器有关。 2)步进电机的相数: 是指电机内部的线圈组数,目前常用的有二相、三相、 四相、五相步进电机。电机相数不同,其步距角也不同,一 般二相电机的步距角为 0.9°/1.8°、三相的为 0.75°/1.5°、 五相的为 0.36°/0.72° 。在没有细分驱动器时,用户主要 靠选择不同相数的步进电机来满足自己步距角的要求。如果 使用细分驱动器,则‘相数’将变得没有意义,用户只需在 驱动器上改变细分数,就可以改变步距角。 3)保持转矩: 是指步进电机通电但没有转动时,定子锁住转子的力 矩。它是步进电机最重要的参数之一,通常步进电机在低速 时的力矩接近保持转矩。由于步进电机的输出力矩随速度的 增大而不断衰减,输出功率也随速度的增大而变化,所以保 持转矩就成为了衡量步进电机最重要的参数之一。比如,当 人们说 2n.m 的步进电机,在没有特殊说明的情况下是指保 持转矩为 2n.m 的步进电机。 ③ 步进电机的一些特点:
第5页

1)一般步进电机的精度为步进角的 3-5%,且不累积。 2)步进电机的力矩会随转速的升高而下降。 当步进电机转动时,电机各相绕组的电感将形成一个反 向电动势;频率越高,反向电动势越大。在它的作用下,电 机随频率(或速度)的增大而相电流减小,从而导致力矩下 降。 3)步进电机低速时可以正常运转,但若高于一定速度就无法 启动,并伴有啸叫声。 步进电机有一个技术参数: 空载启动频率,即步进电机在空载情况下能够正常启 动的脉冲频率, 如果脉冲频率高于该值, 电机不能正常启动, 可能发生丢步或堵转。 在有负载的情况下, 启动频率应更低。 如果要使电机达到高速转动,脉冲频率应该有加速过程,即 启动频率较低,然后按一定加速度升到所希望的高频(电机 转速从低速升到高速) 。 步进电动机以其显著的特点,在数字化制造时代发挥 着重大的用途。伴随着不同的数字化技术的发展以及步进电 机本身技术的提高,步进电机将会在更多的领域得到应用。 ④ 步进电机动态指标及术语: 1)步距角精度: 步进电机每转过一个步距角的实际值与理 论值的误差。用百分比表示:误差/步距角*100%。不同运行 拍数其值不同,四拍运行时应在 5%之内,八拍运行时应在 15%以内。 2)失步: 电机运转时运转的步数,不等于理论上的步数。 称之为失步。 3)失调角: 转子齿轴线偏移定子齿轴线的角度,电机运转 必存在失调角,由失调角产生的误差,采用细分驱动是不能 解决的。 4)最大空载起动频率: 电机在某种驱动形式、电压及额定 电流下,在不加负载的情况下,能够直接起动的最大频率。 5)最大空载的运行频率: 电机在某种驱动形式,电压及额定 电流下,电机不带负载的最高转速频率。 6)运行矩频特性: 电机在某种测试条件下测得运行中输出力 矩与频率关系的曲线称为运行矩频特性,这是电机诸多动态 曲线中最重要的,也是电机选择的根本依据。

第6页

五、C 程序清单如下: /*----------------------------------------------名称:步进电机 编写:lishuo 日期:2010.12 内容: ------------------------------------------------*/ #include <reg52.h> bit ReadTimeFlag;//定义读时间标志 #define KeyPort P3 #define DataPort P0 //定义数据端口 程序中遇到 DataPort 则 用 P0 替换 sbit LATCH1=P1^4;//定义锁存使能端口 段锁存 sbit LATCH2=P1^5;// 位锁存 sbit L1=P2^6; sbit L2=P2^0; sbit SPK=P1^6; unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x0 7,0x7f,0x6f};// 显示段码值 0~9 unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};// 分 别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 sbit A1=P1^0; //定义步进电机连接端口 sbit B1=P1^1; sbit C1=P1^2; sbit D1=P1^3; #define Coil_AB1 {A1=1;B1=1;C1=0;D1=0;}//AB 相通电,其 他相断电 #define Coil_BC1 {A1=0;B1=1;C1=1;D1=0;}//BC 相通电,其 他相断电 #define Coil_CD1 {A1=0;B1=0;C1=1;D1=1;}//CD 相通电,其 他相断电 #define Coil_DA1 {A1=1;B1=0;C1=0;D1=1;}//D 相通电, 其他 相断电 #define Coil_A1 {A1=1;B1=0;C1=0;D1=0;}//A 相通电,其他 相断电 其他相 #define Coil_B1 {A1=0;B1=1;C1=0;D1=0;}//B 相通电,
第7页

断电 #define Coil_C1 {A1=0;B1=0;C1=1;D1=0;}//C 相通电, 其他相 断电 #define Coil_D1 {A1=0;B1=0;C1=0;D1=1;}//D 相通电,其他 相断电 #define Coil_OFF {A1=0;B1=0;C1=0;D1=0;}//全部断电 unsigned char Speed=1; bit StopFlag; void Display(unsigned char FirstBit,unsigned char Num); void Init_Timer0(void); unsigned char KeyScan(void); /*-----------------------------------------------uS 延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振 12M,精确延时请使用汇编,大致延时 长度如下 T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); } /*-----------------------------------------------mS 延时函数,含有输入参数 unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振 12M,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t) { while(t--) { //大致延时 1mS DelayUs2x(245); DelayUs2x(245); } } /*-----------------------------------------------主函数 ------------------------------------------------*/ main() { unsigned char num;
第8页

unsigned int i=512;//旋转一周时间 //unsigned char num; Init_Timer0(); Coil_OFF while(1) //正向 { num=KeyScan(); //循环调用按键扫描 if(num==1) //第一个按键,速度等级增加 { L1=0; DelayMs(1000); L1=1; if(Speed<17) Speed++; if(Speed>16) { for(i=0;i<1000;i++) { DelayMs(1); SPK=!SPK; } } } else if(num==2)//第二个按键,速度等级减小 { L2=0; DelayMs(1000); L2=1; if(Speed>1) Speed--; if(Speed==16) SPK=!SPK; } else if(num==3)//电机停止 { P2=0xfe; //赋初始值 for(i=0;i<8;i++) //加入 for 循环,表明 for 循环大 括号中的程序循环执行 8 次 { DelayMs(500); P2<<=1; } P2=0XFF; Coil_OFF
第9页

StopFlag=1; } else if(num==4)//电机启动 { P2=0x7F; //赋初始值 for(i=0;i<8;i++) //加入 for 循环, 表明 for 循环 大括号中的程序循环执行 8 次 { DelayMs(500); P2>>=1; } P2=0XFF; StopFlag=0; } //分解显示信息,如要显示 68,则 68/10=6 TempData[0]=dofly_DuanMa[Speed/10]; TempData[1]=dofly_DuanMa[Speed%10]; } } 68%10=8

/*-----------------------------------------------显示函数,用于动态扫描数码管 输入参数 FirstBit 表示需要显示的第一位,如赋值 2 表示 从第三个数码管开始显示 如输入 0 表示从第一个显示。 如需要显示 99 两位数值则该值 Num 表示需要显示的位数, 输入 2 ------------------------------------------------*/ void Display(unsigned char FirstBit,unsigned char Num) { static unsigned char i=0;

DataPort=0; LATCH1=1; LATCH1=0;

//清空数据,防止有交替重影 //段锁存

DataPort=dofly_WeiMa[i+FirstBit]; //取位码 LATCH2=1; //位锁存 LATCH2=0; DataPort=TempData[i]; //取显示数据,段码
第 10 页

LATCH1=1; LATCH1=0; i++; if(i==Num) i=0;

//段锁存

} /*-----------------------------------------------定时器初始化子程序 ------------------------------------------------*/ void Init_Timer0(void) { TMOD |= 0x01; //使用模式 1,16 位定时器,使用"|"符号 可以在使用多个定时器时不受影响 //TH0=0x00; //给定初值 //TL0=0x00; EA=1; //总中断打开 ET0=1; //定时器中断打开 TR0=1; //定时器开关打开 PT0=1; //优先级打开 } /*-----------------------------------------------定时器中断子程序 ------------------------------------------------*/ void Timer0_isr(void) interrupt 1 { static unsigned char times,i; TH0=(65536-1000)/256; //重新赋值 1ms TL0=(65536-1000)%256; Display(0,8); if(!StopFlag) { if(times==(20-Speed))//最大值 18, 所以最小间隔值 20-18=2 { times=0; switch(i) { case 0:Coil_A1;i++;break; case 1:Coil_B1;i++;break; case 2:Coil_C1;i++;break; case 3:Coil_D1;i++;break;
第 11 页

case 4:i=0;break; default:break; } } times++; } }

/*-----------------------------------------------按键扫描函数,返回扫描键值 ------------------------------------------------*/ unsigned char KeyScan(void) { unsigned char keyvalue; if(KeyPort!=0xff) { DelayMs(10); if(KeyPort!=0xff) { keyvalue=KeyPort; while(KeyPort!=0xff); switch(keyvalue) { case 0xfe:return 1;break; case 0xfd:return 2;break; case 0xfb:return 3;break; case 0xf7:return 4;break; case 0xef:return 5;break; case 0xdf:return 6;break; case 0xbf:return 7;break; case 0x7f:return 8;break; default:return 0;break; } } } return 0; }

第 12 页

六、实验心得: 通过单片机实训,我不仅加深了对单片机理论的理解, 将理论应用到实际当中去,而且我还学会了如何去培养自己 的创新精神,从而不断的战胜自己,超越自己。更重要的是, 在实训过程中锻炼了自己坚持不懈,不轻易言弃的精神。 实训过程中,我遇到了很多的挫折,就比如在给电路添 加功能时,程序经常出错,并且很难修改,稍有不慎就有前 功尽弃的危险,但是,经过自己不断的学习,一个个困难也 都被克服。 当然最终我还是成功的完成了预期的目标,不仅实现了 步进电机的一些基本功能,而且做了很多的扩展。比如超速 报警,LED 灯闪烁,就是将这些子程序子电路与步进电机综 合起来,实现更多的功能。 结论:本次实训成功完成了对步进电机的控制,并且添加 了加速减速指示灯以及超速报警,可以作为简单的控制系统 使用。 但是此步进电机没能实现反转功能,报警后蜂鸣器偶尔 会发生持续低音,总体来说系统功能有很多不足,这些不足 有待日后改进。 最后,衷心感谢在这次实训当中的指导老师们,是他们 给予了我无私的帮助,在这里对他们所做的工作表示感谢。

第 13 页

附录: 1、数码管显示模块电路

2、独立按键模块电路

3、LED 指示灯模块

第 14 页

4、步进电机模块

5、电路原理图

第 15 页

八、参考文献
[1]张义和,陈敌北主编, 《例说 8051》 人民邮电出版社,2007 年, P222——P239。 [2]郭天祥主编《51 单片机 C 语言教程》 电子工业出版社 2006 年, P435——P445。

第 16 页


步进电机实验报告.doc

步进电机实验报告 - 步进电机调速实验报告 班级: 姓名: 学号: 指导老师:

步进电机实验报告.doc

步进电机实验报告 - 北华航天工业学院 课程设计报告(论文) 课程名称: 微机控

步进电机实验报告_图文.doc

步进电机实验报告 - 北京工业大学,步进电机,实验报告... 步进电机实验报告_调查/报告_表格/模板_实用文档。北京工业大学,步进电机,实验报告 北京工业大学电子课程设计...

步进电机实验报告.doc

步进电机实验报告 - 单片机实验 课程名称:步进电机表实验 授课班级: 2010

步进电机控制实训报告.doc

步进电机控制实训报告 - 关于步进电机的按键控制,正反转加减速,液晶显示,仅供参

步进电机实验报告.doc

步进电机实验报告 - 以LPC2114处理器构造数控系统并用Proteus仿真... 步进电机实验报告_机械/仪表_工程科技_专业资料。以LPC2114处理器构造数控系统并用Proteus仿真 ...

PLC步进电机实训报告.doc

PLC步进电机实训报告 - 前言 本次实验的内容是完成“步进电机控制”的方法,用

步进电机实验报告剖析.doc

步进电机实验报告剖析 - 北华航天工业学院 课程设计报告(论文) 课程名称: 微

步进电机实验报告(1).doc

步进电机实验报告(1) - 步进电机调速实验报告 班级: 姓名: 学号: xx

步进电机实训报告.doc

步进电机实训报告 - 武汉软件工程职业学院 课程设计报告 课程名称:微机原理与接

步进电机实验报告.doc

步进电机实验报告 - 步进电机控制实验 一、实验目的 步进电机作为一种数字控制电

步进电机实训报告.doc

步进电机实训报告 - 系统硬件设计 2010/2011 学年第 1 学期 专用周

电机实验报告模板.doc

电机实验报告模板 - C 语言测控系统程序设计 步进电机控制实验报告 学生姓名:

步进电机实验报告_图文.doc

步进电机实验报告 - Arduino 步进电机实验报告 步进电机是将电脉冲信号转

步进电机课程设计实验报告.doc

步进电机课程设计实验报告 - 成绩: 汇编及接口技术课程设计 题目:步进电机控制

PLC控制步进电机实验报告.doc

PLC控制步进电机实验报告 - 广东技术师范学院实验报告 学院: 姓名: 实验地

步进电机设计报告.doc

步进电机设计报告 - 硬件实习报告 步进电动机的设计报告 题学专班 目:步进电动机的设计与制作 院:大数据与信息工程学院 业:计算机科学与技术 级:电信 113 学生...

步进电机实验报告.doc

步进电机实验报告 - 论文题目: 课程名称: 学院 步进电机的控制 计算机控制技

步进电机课程设计实验报告_图文.doc

步进电机课程设计实验报告 - 指导教师评定成绩: 审定成绩: 重庆邮电大学自动化学院 计算机控制技术课程设计报告 设计题目:步进电动机调速控制 单位(二级学院) 自动...

内科大信息学院自动化步进电机实训报告.pdf

内科大信息学院自动化步进电机实训报告_工学_高等教育_教育专区。内蒙古科技大学信