nbhkdz.com冰点文库

步进电机控制实训报告

时间:2011-11-23


2010/2011 学年第 1 学期 专用周实习报告 专用周实习报告

课程名称 : 班 姓 学 级 : 名 : 号 :

教学周数 : 地 点 :

指导教师 :

可编程控制器的设计 可编程控制器的设计

摘要: 介绍了一种基于 AT89S52 单片机控制的步进电机的设计,系统分为单片机控制、 LCD 显示、 摘要: 步进电机驱动和按键设置四个模块,设计的系统能通过按键来控制步进电机,并且步进电机的状态能 通过 LCD 液晶模块实时显示出来,使人们直观的看出步进电机的运行状态。用 ULN2003 驱动步进电 机,并由按键分别控制步进电机的启/停,快速/慢速,正转/反转。实现了步进电机的基本功能。本报 告对该系统的工作原理、硬件电路和软件进行了详细介绍。 关键词: 关键词: LCD 液晶显示 ULN2003 电机驱动、按键控制、步进电机

第1 章

引言

本系统是基于单片机控制的综合系统,单片机通过按键的设置实现步进电机的变速及 LCD 实 时显示步进电机的转速。它综合了电子技术和单片机软硬件技术,在控制模块选择、电机选择和驱 动模块选择中都进行了各种方案的对比比较,从中选出最合适的方案。

第2 章

方案比较与论证

总体系统框图如图 1 所示: LCD 液晶显 示

按键控制

AT89S52 微控制

ULN2003 驱 动模块

图 1 系统框图 2.1 微控制模块选择

方案一:采用 89S52 作为步进电机控制器。经典 52 单片机具有价格低廉、使用简单等优点。一 个微型计算机,其控制模块功能较全。 方案二:采用 STM32F103XX 作为步进电机控制器。STM32 通过寄存器模式,寻址方式灵活, RAM 和 FLASH 容量大,运算速度快、低功耗、低电压等,且通过 TIM2 的输出比较模式来控制步进 电机以连续周期的 50%和一个可变频率。DMA 控制器可用来改变时钟周期,Systick 定时器灵活地产 生中断。但这次设计可编程控制器控制电机较简单没必要采用 STM32,51 就可以。 基于以上分析,选择方案一。

2.2

步进电机 步进电机

步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。在非超载的情况下,电机的转 速、 启停的位置只取决于脉冲信号的频率和脉冲数, 而不受负载变化的影响, 即给电机一个脉冲信号, 电机则转过一个步距角。因此,步进电机具有快速启停能力,如果负荷不超过步进电机所能提供的动 态转矩值,就能立即使步进电机启动或反转,而且步进电机的转换精度高,驱动电路简单,非常适合

定位控制系统。

2.3

步进电机驱动模块的选择

方案一:采用继电器对电动机的开和关进行控制,通过开关的切换对电机的速度进行调整。这个方案 方案一 的优点是电路较为简单,实现容易;缺点是继电器的响应速度慢、机械结构易损坏、寿命较短。 方案二: 配以电机控制所需要的外围功能电路, 通过数控电压源调节电机运行速度, 方案二: 采用 DSP 芯片, 实现控制物体的运动轨迹。该方案优点是体积小、结构紧凑、使用便捷、可靠性提高。但系统软硬件 复杂、成本高。 方案三: 方案三: 采用专用芯片 ULN2003。ULN2003 是高压大电流达林顿晶体管阵列系列产品,具有电 流增益高、工作电压高、温度范围宽、带负载能力强等特点,适应于各类要求高速大功率驱动 的系统。 基于上述理论分析和实际情况,拟定选择方案三。

第3 章 3.1

系统硬件设计 电机驱动系统的设计

ULN2003 的原理和封装图分别如图 2 和图 3 所示:

图 3 ULN2003 封装图
ULN2003 引脚的功能如下所示:

引脚 引脚 引脚 引脚

1:CPU 2:CPU 3:CPU 4:CPU

脉冲输入端,端口对应一个信号输出端。 脉冲输入端。 脉冲输入端。 脉冲输入端。

引脚 5:CPU 脉冲输入端。 引脚 6:CPU 脉冲输入端。 引脚 7:CPU 脉冲输入端。 引脚 8:接地。 引脚 9:该脚是内部 7 个续流二极管负极的公共端,各二极管的正极分别接各 达林顿管的集电极。用于感性负载时,该脚接负载电源正极,实现续流作用。如果 该脚接地,实际上就是达林顿管的集电极对地接通。 引脚 10:脉冲信号输出端,对应 7 脚信号输入端。

参考电路接法

引脚 11:脉冲信号输出端,对应 6 脚信号输入端。 引脚 引脚 引脚 引脚 引脚 12:脉冲信号输出端,对应 13:脉冲信号输出端,对应 14:脉冲信号输出端,对应 15:脉冲信号输出端,对应 16:脉冲信号输出端,对应 5 4 3 2 1 脚信号输入端。 脚信号输入端。 脚信号输入端。 脚信号输入端。 脚信号输入端。

显示: 3.2 LCD1602 显示:
在本系统中我们采用 1602 字符型液晶显示模块来显示步进电机的转速、 起停以及正反转等步 进电机的状态。字符型液晶显示模块是专门用于显示字母、数字、符号等的点阵型液晶显示模块。 分 4 位和 8 位数据传输方式。提供内部自动上电复位电路,+5V 工作电压。一共有 16 个引脚, 其中一对电源引脚、一对 LED 背光电源引脚、LCD 驱动电压引脚、一个模式选择引脚用 p2.2 口 来控制、一个读写操作引脚用 p2.1 口控制、一个使能引脚用 p2.0 口来控制、7 个数据引脚用 p0 口来控制。其中 LCD 驱动电压 V0 可通过滑动变阻器进行调节,一般 V0 为零伏。具体应用电路 图如图 5 所示:
GND VC C VO RS R/W E DB 0 DB 1 DB 2 DB 3 DB 4 DB 5 DB 6 DB 7 BG VC C BG GND 1 2 3 4 5 6 P0.0 7 P0.1 8 P0.2 9 P0.310 P0.411 P0.512 P0.613 P0.714 15 16 R2

VCC

10k VCC

图 5 LCD 显示模块应用电路

第4 章

系统软件设计

本系统的软件设计分 LCD 显示子程序、按键扫描测试、步进电机控制程序和主程序组 成。整个系统采用 C 语言进行编写。 1. 主程序 主程序包括系统的初始化、 LCD 子程序的调用以及定时器中断函数和步进电机控制函 数组成。系统初始化包括对 LCD 显示模块数据位、命令位,步进电机停止、转速的定义 与初始化,LCD 显示程序显示静态的“Step Motor”和动态的不同速度水平式步进电机的 转速以及正反转的标志,定时器中断函数主要设定定时器中断间隔和步进电机的转速,步 进电机控制函数由步进电机索引函数和对索引值的加减函数组成。系统的主程序流程图如 图 10 所示

图 10 主函数流程图 2. LCD 子程序 LCD 子程序主要实现的功能是显示步进电机的状态。显示动态字符函数是用来显示步 进电机的转速计转向状态,例如:第一行显示:Step Motor 第二行显示:rate: 6 STOP 系统 LCD 显示子程序流程图如图所示

程序流程图如:

通过用 P2.3 控制停止键、P2.4 控制正转键、P2.5 控制反转键、P2.6 控制加速键、用 P2.7 控 制减速键,在程序中我们通过按键来调试电机的速度与正反转,再根据他的速度进行数据处理,再在 显示屏上显示出来:

开始

按键扫描检测

否 按键按下?

否 否 按键 1? 是 按键 2? 是 否 按键 3? 是 否 按键 4? 是 按键 5?





电机停止

电机正转

电机反转

电机加速

电机减速











进 行数 据处 理

进 行数据 处 理

进 行数据 处 理

进 行数 据处 理

进 行数据 处 理

LED 显示速度正反转标志

参考文献
[1] 李宁,《基于 MDK 的 STM32 处理器开发应用》,北京航空航天大学出版社 [2] 黄智伟,《全国大学生电子设计竞赛系统设计》,北京航空航天大学出版社 [3] 康华光,陈大钦,《电子技术基础》,高等教育出版社

附录一
主要元器件清单: 器件名称 AT89S52 微控制器 电机驱动芯片 ULN2003 步进电机 晶振、电阻、电容、按键等 器件数量 1片 1片 1个 若干

附录二
源代码包括两个文件:步进电机 、 源代码包括两个文件:步进电机.C、LCD.C; 包括两个文件 步进电机.C: 步进电机 : #include <reg52.h> //管脚定义头文件 #include "lcd.h" #define uchar unsigned char #define uint unsigned int sbit BEEP = P3^7; sbit sbit sbit sbit sbit k0 = P2^3; k1 = P2^4; k2 = P2^5; k3 = P2^6; k4 = P2^7; //方向标志 //蜂鸣器

bit direction; uchar code uchar code uchar code uchar code uchar code

cdis1[ ] = {" Step Motor "}; cdis2[ ] = {" RATE: "}; cdis3[ ] = {"STOP"}; //停止 cdis4[ ] = {">>>>"}; //正转 cdis5[ ] = {"<<<<"}; //反转

uchar count1 = 0,count2 = 0; uchar rate=9;

//预设定速率值

uchar code FFW[8]= //正转表 { 0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9 }; uchar code REV[8]= //反转表 {

0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1 }; char code reserve[3]_at_ 0x3b; //保留 0x3b 开始的 3 个字节 /********************************************************** x*0.14ms 延时子函数 **********************************************************/ void delay(uchar x) { uchar i; while(x--) { for (i = 0; i<14; i++) ; } }

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

蜂鸣器响一声 **********************************************************/ void beep(void) { uchar i; for (i=0;i<200;i++) { delay(5); BEEP=!BEEP; //BEEP 取反 } BEEP=1; //关闭蜂鸣器 }

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

速率显示子函数 **********************************************************/ void rate_conv(void)

{ uchar rate_l,rate_h; rate_h = (rate-3)/10; if(rate_h == 0) rate_h = 0x20; else rate_h = rate_h+0x30; rate_l = (rate-3)%10; rate_l = rate_l+0x30; lcd_pos(7,2); lcd_wdat(rate_h); lcd_wdat(rate_l); } /********************************************************** //高位 //高位为 0 不显示

//低位

//第二行 7 列

主函数 **********************************************************/ void main(void) { P0 = 0xff; //端口初始化 P2 = 0xff; P1 = 0xf0; //步进电机断电 lcd_init(); lcd_pos(0,1); wr_string(cdis1,0); lcd_pos(0,2); wr_string(cdis2,0); lcd_pos(10,2); wr_string(cdis3,0); TMOD = 0x01; TH0 = 0xf8; TL0 = 0xcc; ET0 = 1; EA = 1; TR0 = 0; //LCD1602 初始化 //设置显示位置为第一行 //显示字符串 1 //设置显示位置为第二行 //显示字符串 2 //第二行 10 列 //显示停止标记 //Timer0 工作方式 1 //2ms 定时常数 //允许 Timer0 中断 //允许总中断 //关闭 Timer0 中断

direction = 1; while(1) { rate_conv();

//置运行方向标志位(正转)

//速率显示

if(0==k0) { beep(); delayms(10); if(0==k0) //为遥控器的 K1 键 { lcd_pos(10,2); //第二行 10 列 wr_string(cdis3,0); //显示停止标记 TR0 = 0; P0 = 0xf0; //步进电机断电 while(!k0); } } if(0==k1) { beep(); delayms(10); if(0==k1) //为遥控器的 UP 键 { direction = 1; //置运行方向标志位(正转) lcd_pos(10,2); //第二行 10 列 wr_string(cdis4,0); //显示正转标记 TR0 = 1; while(!k1); } } if(0==k2) { beep(); delayms(10); if(0==k2) //为遥控器的 DOWN 键 { direction = 0; //清运行方向标志位(反转) lcd_pos(10,2); //第二行 10 列 wr_string(cdis5,0); //显示反转标记 TR0 = 1; while(!k2);

} } if(0==k3) { beep(); delayms(10); if (0==k3) { if(rate >4) rate--; else rate = 4; while(!k3); } } if(0==k4) { beep(); delayms(10); if (0==k4) { if(rate <15) rate++; else rate = 15; while(!k4); } } } } /********************************************************** 定时器 0 中断服务子函数

//“+”键

//“-”键

(负责步进电机运行)

**********************************************************/ void motor_onoff() interrupt 1 { TL0 = 0xcc; //2ms 定时常数 TH0 = 0xf8; count1++; //基本延时 rate 设为 9 if(count1 < rate)

{ return; } else { count1=0; if(direction==1) { if(count2 < 8) P1 = FFW[count2]; count2++; if(count2==8) count2=0; } else { if(count2 < 8) P1 = REV[count2]; count2++; if(count2 == 8) count2=0; } } } /*********************************************************/ LCD.C: : #include <reg52.h> #include <intrins.h> #define DATA_PORT P0 sbit LCD_RS = P2 ^ 0; sbit LCD_RW = P2 ^ 1; sbit LCD_EN = P2 ^ 2; /********************************************************** us 延时子程序 (4.34us) **********************************************************/ void delayNOP() //运行方向标志

//取数据,正转 //取数据次数加 1

//取数据,反转 //取数据次数加 1

{ _nop_(); _nop_(); _nop_(); _nop_(); } /********************************************************** ms 延时子程序 **********************************************************/ void delayms(unsigned int ms) { unsigned char k; while (ms--) { for (k = 0; k < 114; k++) ; } } /********************************************************** 检查 LCD 忙状态 lcd_busy 为 1 时,忙,等待。 lcd-busy 为 0 时, 闲,可写指令与数据。 **********************************************************/ void lcd_busy() { bit busy; busy = 1; while (busy) { LCD_RS = 0; LCD_RW = 1; LCD_EN = 1; busy = (bit)(DATA_PORT &0x80); delayNOP(); } LCD_EN = 0; }

/********************************************************** 写指令数据到 LCD RS=L,RW=L,EN 下降沿执行写操作。D0-D7=指令码。 Check=1,进行忙检测。 **********************************************************/ void lcd_wcmd(unsigned char cmd, bit Check) { if (Check) lcd_busy(); //进行忙检测 LCD_RS = 0; LCD_RW = 0; LCD_EN = 1; DATA_PORT = cmd; delayNOP(); LCD_EN = 0; } /********************************************************** 写显示数据到 LCD RS=H,RW=L,EN 下降沿执行写操作。D0-D7=数据。 **********************************************************/ void lcd_wdat(unsigned char dat) { lcd_busy(); //进行忙检测 LCD_RS = 1; LCD_RW = 0; LCD_EN = 1; DATA_PORT = dat; delayNOP(); LCD_EN = 0; } /********************************************************** LCD 初始化设定

**********************************************************/ void lcd_init() { delayms(15); lcd_wcmd(0x38, 0); //16*2 显示,5*7 点阵,8 位数据 delayms(5); lcd_wcmd(0x38, 0); //不进行忙检测,强制执行三次。 delayms(5); lcd_wcmd(0x38, 0); delayms(5); lcd_wcmd(0x38, 1); //进行忙检测 delayms(5); lcd_wcmd(0x0c, 1); //显示开,关光标 delayms(5); lcd_wcmd(0x06, 1); //移动光标 delayms(5); lcd_wcmd(0x01, 1); //清除 LCD 的显示内容 delayms(5); } /**********************************************************

设定显示位置 **********************************************************/ void lcd_pos(unsigned char xpos, unsigned char ypos) { if (ypos == 0x01) lcd_wcmd((xpos | 0x80), 1); if (ypos == 0x02) lcd_wcmd((xpos | 0xc0), 1); } /********************************************************** 自定义字符写入 CGRAM **********************************************************/ /* void writetab(unsigned char mytab[]) { unsigned char i;

lcd_wcmd(0x40,1); for (i = 0; i< 8; i++) lcd_wdat(mytab[i]);

//写 CGRAM

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

写字符串子函数 **********************************************************/ void wr_string(unsigned char str[],unsigned int time) { unsigned char num = 0; while (str[num]) { lcd_wdat(str[num++]); delayms(time); } } /*********************************************************/


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

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

步进电机实验报告.doc

步进电机实验报告 - 步进电机调速实验报告 班级: 姓名: 学号: 指导老师: xx xx xxx xx 步进电机调速实验报告 一、实验目的及要求: 1、熟悉步进电机的工作原理 ...

步进电机实验报告.doc

步进电机实验报告 - 北华航天工业学院 课程设计报告(论文) 课程名称: 微机控制技术课程设计 设计课题: 专业班级: 学生姓名: 指导教师: 设计时间: 2013 年 06 ....

步进电机实习报告.doc

步进电机实习报告 - 步进电机控制 摘要: 步进电机是将电脉冲信号转变为角位移或

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

步进电机实验报告 - Arduino 步进电机实验报告 步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机, 是现代数 字程序控制系统中的主要执行元件,应用极为...

步进电机实验报告.doc

步进电机实验报告 - 以LPC2114处理器构造数控系统并用Proteus仿真... 步进电机实验报告_机械/仪表_工程科技_专业资料...课程设计课程名称: 题目名称: 学院: 数字控制...

步进电机控制实验实验报告及程序.doc

步进电机控制实验实验报告及程序 - 实验九 姓名 专业 通信工程 步进电机控制实验 成绩 学号 一、实验目的 1. 掌握 keil C51 软件与 proteus 软件联合仿真调试的...

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

PLC控制步进电机实验报告 - 广东技术师范学院实验报告 学院: 姓名: 实验地点: 预习情况 专业: 学号: 实验日期: 操作情况 实验 (3) 1.实验项目名称 PLC 控制四...

PLC步进电机实训报告.doc

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

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

步进电机控制实验报告 - 实 院系:物科院 一 . 实验目的 班级:085 验

基于单片机控制的步进电机控制器实习报告电气工程及其....doc

基于单片机控制的步进电机控制实习报告电气工程及其自动化106程琦2010190624 - 步进电机控制 摘要 :本设计是基于单片机控制的步进电机,实现步进电机的启停、正转、...

步进电机实训报告.doc

步进电机实训报告 - 武汉软件工程职业学院 课程设计报告 课程名称:微机原理与接口技术课程设计 设计题目: 系专组别: 业: 别: 步进电机控制接口设计 软件学院 嵌入...

步进电机实验报告.doc

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

控制电机实验..pdf

表 7-1 n(r/min) U(V) 表 7-2 n(r/min) U(V) 二、实验报告 1...7-2 步进电动机步进电动机又称脉冲电机, 是数字控制系统中的一种重要的执行...

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

步进电机实验报告 - 北京工业大学,步进电机,实验报告... 步进电机实验报告_调查/报告_表格/模板_实用文档。...步进电机 1 一、设计题目 步进电机控制电路 二、设计...

步进电机综合实验报告.doc

步进电机综合实验报告 - 一、实验目的: 了解步进电机工作原理, 掌握用单片机的步进电机控制系统的硬件设计方法, 熟悉步进 电机驱动程序的设计与调试,提高单片机应用...

步进机控制系统实验报告提交_图文.doc

步进机控制系统实验报告提交 - 硬件课程设计报告 设计题目: 步进电机控制系统

步进电机的运行控制实习报告_图文.doc

步进电机的运行控制实习报告 - 步进电机运行控制,通过单片机控制步进电机的正转,

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

二、实验目的 (a)了解步进电机控制的基本原理 (b)掌握控制步进电机转动编程方

嵌入式电机转动控制实验.doc

嵌入式电机转动控制实验 - 《嵌入式系统设计与实例开发》 (2011-2012 学年第 2 学期) 实验报告 实验五 电机转动控制实验---c 语言实现方法 1 电机转动控制...