基于ARM的步进电机控制课程设计.doc
- 文档编号:4864584
- 上传时间:2023-05-07
- 格式:DOC
- 页数:19
- 大小:1.39MB
基于ARM的步进电机控制课程设计.doc
《基于ARM的步进电机控制课程设计.doc》由会员分享,可在线阅读,更多相关《基于ARM的步进电机控制课程设计.doc(19页珍藏版)》请在冰点文库上搜索。
ARM课程设计
专业:
电子信息工程
班级:
姓名:
学号:
指导教师:
目录
一、设计的目的与要求 2
二、方案的设计与论证 2
三、结构和基本原理 3
四、软件设计 9
五、调试 10
六、课程设计体会 10
七、参考文献 11
基于ARM的步进电机控制
一、设计的目的与要求
1.1设计目的
(1)本次课程设计是在学习了《深入浅出ARM7——LPC213X/214X》课程之后综合利用所学知识完成一个计算机应用系统设计并在实验室实现。
(2)通过课程设计,巩固和加深了对“微机原理与接口技术”课程中所学的理论知识和实验能力,基本掌握计算机接口应用电路的一般设计方法,提高电子电路的设计和实验能力。
(3)加深对计算机软硬知识的理解,获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。
1.2设计要求
(1)设计一个步进电机的控制系统。
(2)用LPC2134+L298+L297使用中断方式以及串口方式进行控制。
(3)可通过按键设定转速和方向。
二、方案的设计与论证
2.1设计分析
步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件。
电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响,即给电机加一个脉冲信号,电机则转过一个步距角。
本次课程设计所设计的步进电机的控制系统可通过键盘设定转速和方向,并能显示转速。
2.2方案论证
方案一:
采用ARM7的脉宽调制器PWM产生脉冲对步进电机进行控制。
方案二:
利用定时器定时中断进行步进电机的控制。
2.3方案选择
第一种方案中PWM技术是采用脉宽调制技术,即占空比不同的方波电压产生不同的平均电流使步进电机转动,通过调节占空比即可调节电机转速。
虽然很精确,但设置较繁琐。
第二种方案中采用定时器定时中断的方式,只需要几条简单的指令就可以产生具有一定
频率和数目的脉冲信号,而且在整个脉冲产生过程中,CPU可用来处理其他工作,大大
提高了系统的实时处理能力。
考虑到系统的实时性及程序的繁简程度我选择了第二种方案。
三、结构和基本原理
3.1ARM最小系统
(1)PHILIPS单片32位ARM微控制器-LPC2134
LPC2131/2132/2134/2136/2138微控制器是基于一个支持实时仿真和嵌入式跟踪的16/32位ARM7TDMI-SCPU,并带有32kB、64kB、128kB、256kB和512kB嵌入的高速Flash存储器。
128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。
对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。
特性
16/32位ARM7TDMI-S核,超小LQFP64封装。
8/16/32kB的片内静态RAM和32/64/128/256/512kB的片内Flash程序存储器。
128位宽度接口/加速器可实现高达60MHz工作频率。
通过片内boot装载程序实现在系统编程/在应用编程(ISP/IAP)。
单个Flash扇区或整片擦除时间为400ms。
256字节行编程时间为1ms。
EmbeddedICERT和嵌入式跟踪接口通过片内RealMonitor软件对代码进行实时调试和高速跟踪。
1个(LPC2131/32)或2个(LPC2134/36/38)8路10位的A/D转换器,共提供16路模拟输入,
每个通道的转换时间低至2.44us。
1个10位的D/A转换器,可产生不同的模拟输出。
(LPC2132/34/36/38)
2个32位定时器/外部事件计数器(带4路捕获和4路比较通道)、PWM单元(6路输出)和看门狗。
低功耗实时时钟具有独立的电源和特定的32kHz时钟输入。
多个串行接口,包括2个16C550工业标准UART、2个高速I2C总线(400kbit/s)、
SPI和具有缓冲作用和数据长度可变功能的SSP。
向量中断控制器。
可配置优先级和向量地址。
小型的LQFP64封装上包含多达47个通用I/O口(可承受5V电压)。
多达9个边沿或电平触发的外部中断管脚。
通过片内PLL(100us的设置时间)可实现最大为60MHz的CPU操作频率。
片内集成振荡器与外部晶体的操作频率范围为1~30MHz,
与外部振荡器的操作频率范围高达50MHz。
低功耗模式:
空闲和掉电。
可通过个别使能/禁止外部功能和外围时钟分频来优化功耗。
通过外部中断或BOD将处理器从掉电模式中唤醒。
单电源,具有上电复位(POR)和掉电检测(BOD)电路:
-CPU操作电压范围:
3.0~3.6V(3.3V±10%),I/O口可承受5V的电压。
图1LPC2134内部方框图
(2)原理图:
图2ARM最小系统
3.2按键电路
图3按键的连接图
不按下时为高电平,按下时变为低电平。
3.3步进电机驱动电路
在步进电机驱动电路中我们用的是L298+L297控制步进电机。
(1)L297的工作原理介绍
L297是意大利SGS半导体公司生产的步进电机专用控制器,它能产生4相控制信号,可用于计算机控制的两相双极和四相单相步进电机,能够用单四拍、双四拍、四相八拍方式控制步进电机。
芯片内的PWM斩波器电路可开关模式下调节步进电机绕组中的电机绕组中的电流。
该集成电路采用了SGS公司的模拟/数字兼容的I2L技术,使用5V的电源电压,全部信号的连接都与TFL/CMOS或集电极开路的晶体管兼容。
L297的芯片引脚特别紧凑,采用双列直插20脚塑封封装,其引脚见图3。
图4L297引脚图
(2)L298简介:
L298N为SGS-THOMSONMicroelectronics所出产的双全桥步进电机专用驱动芯片(DualFull-BridgeDriver),内部包含4信道逻辑驱动电路,是一种二相
和四相步进电机的专用驱动器,可同时驱动2个二相或1个四相步进电机,内含二个H-Bridge的高电压、大电流双全桥式驱动器,接收标准
TTL逻辑准位信号,可驱动46V、2A以下的步进电机,且可以直接透过电源来调节输出电压;此芯片可直接由单片机的IO端口来提供模拟时序信号,
但在本驱动电路中用L297来提供时序信号,节省了单片机IO端口的使用。
L298N之接脚如图4所示,Pin1和Pin15可与电流侦测用电阻连接来控制负载的电路;OUTl、OUT2和OUT3、OUT4之间分别接2个步进电机;input1~input4输入控制电位来控制电机的正反转;Enable则控制电机停转。
图5L298引脚图
(3)L298+L297组成的步进电机驱动电路如图5所示
图6步进电机驱动电路
3.4虚拟终端输入部分电路
图7虚拟终端输入
3.5总原理图
图8总原理图
3.5器件连接
(1)在EasyARM2138开发板上,当跳线JP6分别选择TXD0和RXD0端时方可进行UART0通信实验。
(2)KEY1连接P0.16;KEY2连接P0.17;KEY3连接P0.18,KEY4连接P0.19,KEY5连接P0.20,KEY6连接P0.21。
(3)步进电机的四个输入端口分别接EasyARM2138开发板上P2.2~P2.5四个端口。
四、软件设计
系统软件采用C语言编程,程序详情请参见附录。
程序的流程图如下:
开始
初始化参数:
设置SPI管脚连接,P0.30连接到AD0.3,P1[25:
16]连接GPIO,设置bjdj_qd控制口为输出,初始化SPI,IRQ中断使能,定时器0初始化,启动定时器,设置并启动定时器0中断IRQ。
步进电机进入最近一次设定的模式(初始时为模式0)
是否有按键按下
否
进入模式0:
八拍正转。
在数码管上显示0,同时在上位机上显示转速。
是
KEY按下?
是
进入模式1:
八拍反转。
在数码管上显示1,同时在上位机上显示转速。
KEY2按下?
否
是
进入模式2:
双四拍正转。
在数码管上显示2,同时在上位机上显示转速。
KEY3按下?
否
是
KEY按下?
否
进入模式3:
双四拍反转。
在数码管上显示3,同时在上位机上显示转速。
是
否
进行减速。
在数码管上显示5,同时在上位机上显示转速。
KEY5按下?
是
否
进行加速。
在数码管上显示6,同时在上位机上显示转速。
KEY6按下?
是
五、调试
在proture软件中运行程序,开始调试。
在一开始的时候,由于用定时器设置的中断时间太长导致看不见电机有明显的转动。
通过修改定时时间,渐渐地电机转动变得明显了。
然后测试按键功能时发现,案件的检测不够灵敏,有时候需要按几下才能检测到,后来经过修改延时消抖的时间,将其变短且在每次按下按键时不急于松开而保持一会儿,这样按键检测变得较为灵敏了。
在调试中发现:
单双八拍和双四拍要比单四拍的转动更加有效。
单四拍模式的时候电机只是震动并没有转动,用肉眼观察不到转速的快慢,故最后舍弃了这种模式。
调试的最终结果是:
程序开始时电机进入模式0,如果没有按键按下则一直保持模式0。
当有按键按下时,且按键为KEY1~KEY4则电机根据不同按键的按下进入不同的转动模式(KEY1对应模式0:
八拍正转,KEY2对应模式1:
八拍反转,KEY3对应模式2:
双四拍正转,KEY4对应模式3:
双四拍反转)。
当按键KEY5按下时,电机转速变慢,且随着KEY5按下次数的增多电机逐渐变慢直至停止;当按键KEY6按下时,电机转速变快,且随着KEY5按下次数的增多电机逐渐变快。
同时在上位机上可以看见当前的转速。
六、课程设计体会
一方面,通过这一周的课程设计,我对课本上关于LPC2134的硬件结构的知识有了更加深刻的理解,而且对其用法掌握得更加熟练。
在课程设计过程中,能够不断地发现问题,并想办法解决,如此提高了我自己解决问题的能力。
在编写程序方面,我对ARM7编程结构和技巧也有了深刻的理解和领会。
此次课程设计还让我知道什么是实时系统以及如何构建一个简单的实时系统。
现在我已经基本掌握了构建实时系统的方法。
还有我明白了流程图的重要性,以前在编程的时候,我从不写流程图,直接开始写程序,这样出现了不该出现的问题。
但这次课程设计时,我试着先写出流程图然后按照流程图编写程序,结果错误少了很多,即使有错误只要根据流程图一查就知道错在哪里,这让我节省了大量的时间和精力。
所以我认识到,以后要编写程序时,先写流程图是很有必要的。
另一方面,我感觉这一周的课程设计我自己的效率太低。
有时候被一些问题困惑了很久,但经过老师的指点,我才恍然大悟,原来只要换个方式思考问题就能想到很好的方法。
七、参考文献
[1]周立功.《深入浅出ARM7——LPC213X/214X(上册)》[M].北京:
北京航空航天大学出版社,2008:
146-175,226-240,275-286.
[2]周立功.《ARM嵌入式系统实验教程(三)》[M].北京:
北京航空航天大学出版社,
2005:
134-140.
[3]冷洪滨,邬义杰.基于计数器/定时器的步进电机可编程控制接口电路设计[J]北京:
组合机床与自动化加工技术,2004.
[4]周明德.微型计算机硬件软件及其应用.北京:
清华大学出版社,1993.
附录:
程序
#include"config.h"
intDelayTime=60; //延时参数
typedefstructUartMode
{
uint8datab; //字长度,5/6/7/8可选
uint8stopb; //停止位,1/2可选
uint8parity; //奇偶校验位,0:
无校验;1:
奇检验;2:
偶检验
}UARTMODE;
uint8rcv_buf; //UART0数据接收缓冲区
uint8rcv_new; //接收数据标志
//延时函数原型声明
voiddelay(intdly);
//工作模式设置函数原型声明
voidSetWorkMode(charWorkMode);
//中断服务程序原型声明
void__irqIRQ_Eint0(void);
void__irqIRQ_Eint1(void);
void__irqIRQ_Eint2(void);
void__irqIRQ_Eint3(void);
//中断初始化函数
voidInt_Init(void);
//串口0接收中断服务程序
void__irqIRQ_UART0(void);
//串口0数据发送函数
voidUART0_SendByte(uint8dat);
//串口0初始化函数
uint8UART0_Init(uint32baud,UARTMODEset);
//********************************************************************************************************
//主函数
intmain(void)
{
UARTMODEset;
set.datab=8; //设置字长度为8位
set.stopb=1; //设置停止位为1位
set.parity=0; //设置检验方式为无校验
rcv_new=0; //接收数据标志初始化
//配置引脚功能
PINSEL0=0x0005c0c5;
PINSEL1=0x00000301;
IO0DIR=0x03<<21; //设P0.21-P0.22为输出
UART0_Init(9600,set); //串口初始化
U0FCR=0x01; //使能FIFO,并设置触发点为1字节
U0IER=0x01; //允许RBR中断,即接收中断
Int_Init(); //中断初始化(外部中断、串口中断)
while
(1)
{
if(rcv_new==1)
{
rcv_new=0;
SetWorkMode(rcv_buf); //根据输入的控制信号改变步进电机的工作模式
UART0_SendByte(rcv_buf); //把键盘输入发回虚拟终端回显
}
//模拟脉冲信号驱动步进电机转动
IO0SET=0x01<<22;
delay(DelayTime);
IO0CLR=0x01<<22;
delay(DelayTime);
}
return0;
}
//********************************************************************************************************
//延时函数
voiddelay(intdly)
{
inti,j;
for(i=0;i for(j=0;j<1200;j++); } //******************************************************************************************************** //工作模式设置函数 voidSetWorkMode(charWorkMode) { //WorkMode: 控制信号 // '+': 加速 '-': 减速 '<': 逆时针 '>': 顺时针 switch(WorkMode) { case'+': if(DelayTime>20) DelayTime=DelayTime-20; //减少延时,即加速 break; case'-': if(DelayTime<100) DelayTime=DelayTime+20; //增加延时,即减速 break; case'<': IO0CLR=0x01<<21; //设置的步进电机的运转方向为逆时针 break; case'>': IO0SET=0x01<<21; //设置的步进电机的运转方向为顺时针 break; default: break; } } //******************************************************************************************************** //外部中断0服务程序 void__irqIRQ_Eint0(void) { IO0CLR=0x01<<21; //设置的步进电机的运转方向为逆时针 while((EXTINT&0x01)! =0) { EXTINT=0x01; //清除中断标志 } VICVectAddr=0; } //******************************************************************************************************** //外部中断1服务程序 void__irqIRQ_Eint1(void) { IO0SET=0x01<<21; //设置的步进电机的运转方向为顺时针 while((EXTINT&0x02)! =0) { EXTINT=0x02; //清除中断标志 } VICVectAddr=0; } //******************************************************************************************************** //外部中断2服务程序 void__irqIRQ_Eint2(void) { if(DelayTime>20) DelayTime=DelayTime-5; //减少延时,即加速 while((EXTINT&0x04)! =0) { EXTINT=0x04; //清除中断标志 } VICVectAddr=0; } //******************************************************************************************************** //外部中断3服务程序 void__irqIRQ_Eint3(void) { if(DelayTime<100) DelayTime=DelayTime+5; //增加延时,即减速 while((EXTINT&0x08)! =0) { EXTINT=0x08; //清除中断标志 } VICVectAddr=0; } //******************************************************************************************************** //中断初始化函数 voidInt_Init(void) { EXTMODE=0x00; //设置外部中断为电平触发 IRQEnable(); //使能IRQ中断 VICIntSelect=0x00000000; //设置所有分配为IRQ中断 VICVectCntl4=0x20|0x0e; //分配外部中断4到向量中断0 VICVectCntl1=0x20|0x0f; //分配外部中断1到向量中断0 VICVectCntl2=0x20|0x10; //分配外部中断2到向量中断0 VICVectCntl3=0x20|0x11; //分配外部中断3到向量中断0 VICVectCntl0=0x20|0x06; //分配Uart0中断到向量中断0 //设置中断服务程序地址 VICVectAddr4=(uint32)IRQ_Eint0; VICVectAddr1=(uint32)IRQ_Eint1; VICVectAddr2=(uint32)IRQ_Eint2; VICVectAddr3=(uint32)IRQ_Eint3; VICVectAddr0=(uint32)IRQ_UART0; EXTINT=0x0f; //清除所有外部中断标志 VICIntEnable=(1<<0x0e)|(1<<0x0f)|(1<<0x10)|(1<<0x11)|(1<<0x06); //使能所用到的中断 } //******************************************************************************************************** //串口0接收中断服务程序 void__irqIRQ_UART0(void) { if((U0IIR&0x0f)==0x04) rcv_new=1; //设置接收到新的数据标志 rcv_buf=U0RBR; //读取FIFO的数据,并清除中断 VICVectAddr=0; } //******************************************************************************************************** //串口0数据发送函数 voidUART0_SendByte(u
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ARM 步进 电机 控制 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)