基于ARM的步进电机控制系统_第1页
基于ARM的步进电机控制系统_第2页
基于ARM的步进电机控制系统_第3页
基于ARM的步进电机控制系统_第4页
基于ARM的步进电机控制系统_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式系统课程设计报告 基于ARM的步进电机控制系统 院 系: 机电学院 学生姓名: 李 明 专 业: 应用电子技术教育 班 级: 应教101 指导教师: 付广春 田丰庆 完成时间: 2013.9.11 基于ARM的步进电机控制系统一、进行课程设计的目的嵌入式系统课程设计为学生提供了一个理论与实践相结合的机会。既锻炼了学生动手能力,又会加深理解学生在课堂所学习的理论知识。通过课程设计可以将课本上的理论知识和实际应用有机的结合起来,培养学生又动脑,又动手,独立思考分析问题的能力,提高学生运用所学知识解决实际问题的综合素质。嵌入式系统课程设计的主要目标是:(1)掌握构建嵌入式系统软硬件平台的基本技

2、能;(2)具备基本嵌入式系统下C语言编程能力、嵌入式操作系统基本调试的能力;(3)了解应用嵌入式系统技术开发一套嵌入式系统设备的方法。二、课程设计设计题目基于ARM的步进电机控制系统三、课程设计基本要求1、基本要求设计一款步进电机控制器,能实现步进电机的启动、停止、正转、反转调速,并显示速度。尽量不采用专用的电机控制芯片,自己做驱动;2、扩展功能:可以根据自己的进度扩展其它功能。目录1 引言12 设计方案12.1 设计分析12.2 总体设计框图12.3 步进电机驱动电路12.4液晶显示电路23 软件设计33.1 程序流程图 . .34 总结3参考文献5附录 程序61 引言步进电机是数字控制系统

3、中的一种重要执行元件,广泛应用在各种自动化控制系统和机电一体化设备中。目前打印机、绘图仪、机器人、数控机床等设备都可以以步进电机为动力核心。随着步进电机在工业控制系统中的应用不断增加,对步进电机的控制系统提出了越来越高的要求。本课程设计主要是通过STM32单片机来控制步进电机的正转、反转、启动、停止调速等控制,并且通过1602液晶显示器显示出来。2 设计方案2.1 设计分析步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。本次课程设计所设计的步进电机的控制系统可通过

4、键盘设定转速和方向,并能显示转速。2.2 总体设计框图 图1 整体方框图2.3 步进电机驱动电路由两个三极管,一个可以对正极导通实现上拉,另一个可以对负极导通实现下拉。由两套这样的电路,在同一个电路中,同时一个上拉,另一个下拉,或相反,两者总是保持相反的输出,这样可以在单电源的情况下使负载的极性倒过来。由于这样的接法加上中间的负载画出来经常会像一个H的字样,故得名H桥。图2 H桥驱动电路2.4液晶显示电路1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的

5、间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。图3 LCD16021602采用标准的16脚接口,其中:第1脚:VSS为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平

6、(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第714脚:D0D7为8位双向数据端。第1516脚:空脚或背灯电源。15脚背光正极,16脚背光负极。3 软件设计K3按下判断K3是否按下正反转K2按下判断K2是否按下K1按下等待判断K1是否下3.1 程序流程图 否是否 是否 是是否图4 程序流程图4 总结为期两周的实习将要画上句号,可谓说道路艰险啊,刚看到任务书的时候有点不知所措,看着哪个都想做,哪个都简单。不知道该选择哪个,筛选了很多次后就选择了步进电机控制。看似简单的事情做起来却没有那么简单,刚开始真的不

7、知道从什么地方下手,最后看了一些资料,参考了一些电路才知道怎么去做。我把电路分成几块,然后逐块的去做,等到每块做好了以后把各块连接起来,程序也是每块每块的调试。这次实习运用的知识面很广,首先是对上学期学习的单片机的一个总结。其次考察了我们对电子知识是否牢固掌握,还考察我们对仿真软件的灵活运用。也回顾了以前的电路图和PCB的绘制。这次实习就像一根线一样把前前后后学过的知识都给串了起来,使我们对知识的掌握变得更加牢固,更加深刻。参考文献1 周立功.ARM嵌入式系统实验教程(三)M.北京:北京航空航天大学出版社,2005:134-140.2 冷洪滨,邬义杰.基于计数器/定时器的步进电机可编程控制接口

8、电路设计J北京:组合机床与自动化加工技术,2004.3 周明德.微型计算机硬件软件及其应用.北京:清华大学出版社 ,1993.附录 程序1 主程序#include "stm32f10x.h"#include "key.h"#include "led.h"#include "bujin.h"#include"Lcd_Display.h"extern int i;extern int j;extern u8 table;int main(void) Key_GPIO_Config(); LED_GP

9、IO_Config(); LCD_GPIO_Config(); Lcd_init(); Wcmd(0x80); for(j=0;j<16;j+) Wdate(tablej); while(1) if( Key_Scan(GPIOA,GPIO_Pin_0) = KEY_ON ) LCDxianshi(); while(1) liftturn(); if( Key_Scan(GPIOC,GPIO_Pin_2) = KEY_ON ) while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2) = KEY_ON); i=i-100;if(i=1300)i=1400

10、; LCDxianshi(); if( Key_Scan(GPIOC,GPIO_Pin_3) = KEY_ON ) while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3) = KEY_ON); i=i+200;LCDxianshi(); if( Key_Scan(GPIOA,GPIO_Pin_1) = KEY_ON ) break; if( Key_Scan(GPIOA,GPIO_Pin_1) = KEY_ON ) LCDxianshi(); while(1) rightturn(); if( Key_Scan(GPIOC,GPIO_Pin_2) = KEY

11、_ON ) while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2) = KEY_ON); i=i-100;if(i=1300)i=1400;LCDxianshi(); if( Key_Scan(GPIOC,GPIO_Pin_3) = KEY_ON ) while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3) = KEY_ON); i=i+200;LCDxianshi(); if( Key_Scan(GPIOA,GPIO_Pin_0) = KEY_ON ) break; 2 按键程序#include "key.h&q

12、uot; void Delay(_IO u32 nCount)for(; nCount != 0; nCount-); void Key_GPIO_Config(void)GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitStructure.GPIO_Pin =GPIO_Pin_0|GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOA, &GPIO_I

13、nitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStructure.GPIO_Pin =GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure);uint8_t Key_Scan(GPIO_TypeDef* GPIOx,u16 GPIO_Pin)if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) = K

14、EY_ON ) Delay(10000);if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) = KEY_ON ) return KEY_ON; elsereturn KEY_OFF;elsereturn KEY_OFF;3 LCD显示程序#include "stm32f10x.h"#include"Lcd_Display.h"#include "delay.h"u8 table=" present speed: "u8 table1=" r/min "extern

15、 int i;/E=C5, RW=C6, RS=C7 beep=A12 B高八位LCDvoid Lcd_clr(void) Wcmd(0x01);void Wcmd(u16 cmd) GPIO_ResetBits(GPIOC,GPIO_Pin_7); / RS=0 GPIO_ResetBits(GPIOC,GPIO_Pin_6); /RW=0, GPIO_ResetBits(GPIOC,GPIO_Pin_5); /E=0 Delay_nms(2); GPIO_Write(GPIOB,cmd<<8); Delay_nms(2); GPIO_SetBits(GPIOC,GPIO_Pin

16、_5);/E=1 Delay_nms(2); GPIO_ResetBits(GPIOC,GPIO_Pin_5); /E=0void Wdate(u16 date) Delay_nms(5); GPIO_SetBits(GPIOC,GPIO_Pin_7); / RS=1 GPIO_ResetBits(GPIOC,GPIO_Pin_6); /RW=0, GPIO_ResetBits(GPIOC,GPIO_Pin_5); /E=0,形成写脉冲 GPIO_Write(GPIOB,date<<8); Delay_nms(5); GPIO_SetBits(GPIOC,GPIO_Pin_5);/

17、E=1 Delay_nms(5); GPIO_ResetBits(GPIOC,GPIO_Pin_5); /E=0 下降沿写入void Lcd_init(void ) Delay_nms(10); Wcmd(0x0038); Delay_nms(5); Wcmd(0x0038); Delay_nms(5); Wcmd(0x0038); Delay_nms(5); Wcmd(0x000c); Delay_nms(5); Wcmd(0x0006); Delay_nms(5); Wcmd(0x0001); Delay_nms(5);void LCD_GPIO_Config(void)GPIO_Init

18、TypeDef GPIO_Initstructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB,ENABLE);GPIO_Initstructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_Initstructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_Initstructure);GPIO_

19、Initstructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;GPIO_Initstructure.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_Initstructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_Initstructure);void LCDxianshi(void) u8 k,speed; speed=60*100000

20、0/(200* i); table10=speed%1000/100+0x30; table11=speed%100/10+0x30; table12=speed%10+0x30; Wcmd(0xc4); for(k=0;k<8;k+) Wdate(table1k);void Set_pos(unsigned char x,unsigned char y) unsigned char addr; if (x=0) addr=0x80+y; if (x=1) addr=0xc0+y; Wcmd(addr);void Display_char(unsigned char x,unsigned

21、 char y,unsigned char *s) Set_pos(x,y); while(*s) Wdate(*s);s+; 4 步进电机程序#include "bujin.h"#include "delay.h" #define SetA GPIO_SetBits(GPIOC, GPIO_Pin_12);GPIO_ResetBits(GPIOC, GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15);#define SetB GPIO_SetBits(GPIOC, GPIO_Pin_14);GPIO_ResetBits(GPI

22、OC, GPIO_Pin_12| GPIO_Pin_13| GPIO_Pin_15);#define SetC GPIO_SetBits(GPIOC, GPIO_Pin_13);GPIO_ResetBits(GPIOC, GPIO_Pin_14| GPIO_Pin_12| GPIO_Pin_15);#define SetD GPIO_SetBits(GPIOC, GPIO_Pin_15);GPIO_ResetBits(GPIOC, GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_12);#define SetAB GPIO_SetBits(GPIOC, GPIO_Pin_

23、12|GPIO_Pin_14);GPIO_ResetBits(GPIOC, GPIO_Pin_13| GPIO_Pin_15);#define SetBC GPIO_SetBits(GPIOC, GPIO_Pin_13|GPIO_Pin_14);GPIO_ResetBits(GPIOC, GPIO_Pin_12| GPIO_Pin_15);#define SetCD GPIO_SetBits(GPIOC, GPIO_Pin_13|GPIO_Pin_15);GPIO_ResetBits(GPIOC, GPIO_Pin_12| GPIO_Pin_13);#define SetDA GPIO_Set

24、Bits(GPIOC, GPIO_Pin_12|GPIO_Pin_15);GPIO_ResetBits(GPIOC, GPIO_Pin_13| GPIO_Pin_14); int i=3000;int j;void liftturn(void) /*单四拍左转*/GPIO_SetBits(GPIOE, GPIO_Pin_2);/ GPIO_ResetBits(GPIOE, GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5);/ Delay_nms(i);/ GPIO_SetBits(GPIOE, GPIO_Pin_3);/ GPIO_ResetBits(GPIOE, GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5);/ Delay_nms

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论