资源描述
第15页
西安科技大学电控学院课程设计
电控学院
课程设计(论文)
课程名称: ARM嵌入式系统
题 目: 红外感应自动窗帘控制器设计
院 (系): 电 控 学 院
专业班级: 自 动 化0904 0905
姓 名: 王杰 朱闯 许支明 严东虎 王飞(0905)
学 号: 0411 0410 0426 0806050428 0806050212
指导教师: 李红岩 杨学存
2013年 01月16日
目 录
第1章 ARM嵌入式系统概述…………………………………………………… 2
1.1 嵌入式系统………………………………………………………………… 2
1.2 嵌入式系统的特点…………………………………………………… 2
第2章 步进电机原理简介……………………………………………………… 2
2.1 步进电机…………………………………………………………………… 3
2.1.1 步进电机原理………………………………………………………… 3
2.1.2 步进电机的一些基本参数…………………………………………… 3
第3章 控制系统的总体设计……………………………………………3
3.1 总体设计思路……………………………………………………………… 3
3.2 系统硬件设计………………………………………………………………… 4
3.2.1 EasyARM2131开发板功能……………………………………………… 4
3.2.2 ULN003A驱动芯片…………………………………………………………5
3.2.3 TH12864-15液晶显示……………………………………………………… 5
3.2.4 电机驱动模块………………………………………………………………… 5
3.2.5 显示模块…………………………………………………………………………6
3.3 总设计电路图……………………………………………………………………7
3.4 软件设计……………………………………………………………………7
3.4.1 程序流程图……………………………………………………………………7
结论…………………………………………………………………………………… 7
附 录(课设体会)…………………………………………………………………8
参考文献………………………………………………………………………………… 8
设计程序………………………………………………………………………………… 9
第1章 ARM嵌入式系统概述
1.1嵌入式系统
嵌入式计算机系统的出现,是现代计算机发展史上的里程碑。嵌入式系统诞生于微型计算机时代,与通用计算机的发展道路完全不同,形成了独立的单芯片的技术发展道路。由于嵌入式系统的诞生,现代计算机领域出现了通用计算机与嵌入式计算机两大分支。
1.2嵌入式系统的特点
(1) 由于嵌入式系统一般是应用于小型电子装置,系统资源相对有限,所以内核较之传统的操作系统要小得多。
(2) 嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植,即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。
(3) 嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能的 设计及实现过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全。
(4) 高实时性的操作系统软件是嵌入式软件的基本要求。而且软件要求固化存储,以提高速度。软件代码要求高质量和高可靠性。
(4) 嵌入式软件开发要想走向标准化,就必须使用多任务的操作系统。嵌入式系统的应用程序可以没有操作系统而直接在芯片上运行;
(5) 嵌入式系统开发需要专门的开发工具和环境。由于嵌入式系统本身不具备自主开发能力,即使设计完成以后,用户通常也不能对其中的程序功能进行修改,因此必须有一套开发工具和环境才能进行开发,这些工具和环境一般是基于通用计算机上的软硬件设备以及各种逻辑分析仪、混合信号示波器等。
第2章 步进电机原理简介
2.1步进电机
在电气时代的今天,电动机一直在现代化的生产和生活中起着十分重要的作用。无论是在工农业生产还是在日常生活中的家用电器,都大量地使用着各种各样的电动机。因此对电动机的控制变得越来越重要了。。下图1为本设计所用到的五线式四相步进电机
图1五线式四相步进电机
2.1.1步进电机原理
步进电机是机电控制中一种常用的执行机构,其原理是通过对它每相线圈中的电流和顺序切换来使电机作步进式旋转。驱动电路由脉冲信号来控制,所以调节脉冲信号的频率便可改变步进电机的转速。通俗地说:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度(及步进角)。通过控制脉冲个数即可以控制角位移量,从而达到准确定位的目的。同时通过控制脉冲频率来控制电机转动的速度和加速度,从而达到调速的目的,现在比较常用的步进电机包括反应式步进电机(VR)、永磁式步进电机(PM),混合式步进电机(HB)和单相式步进电机等。
2.1.2步进电机的一些基本参数
电机固有步距角:它表示控制系统每发一个步进脉冲信号,电机所转动的角度。电机出厂时给出了一个步距角的值,如86BYG250A型电机给出的值为0。90/1。80(表示半步工作时为0。90、整步工作时为1。80),这个步距角可以称之为“电机固有步距角”,它不一定是电机实际工作时的真正步距角,真正的步距角和驱动器有关。
步进电机的相数:是指电机内部的线圈组数,目前常用的有二相、三相、四相、五相步进电机。电机相数不同,其步距角也不同,一般二相电机的步距角为0。90/1。80、三相的为0。750/1。50、五相的为0。360/0。720。在没有细分驱动器时,用户主要靠选择不同相数的步进电机来满足自己步距角的要求。如果使用细分动器,则“相数”将变得没有意义,用户只需在驱动器上改变细分数,就可以改变步距角。
第3章控制系统的总体设计
3.1总体设计思路
本次设计采用EasyARM2131 ARM芯片为主控制芯片,由ULN2003A为驱动芯片控制步进电机转动;并通过MG12864点阵图形液晶图形模块显示步进电机转动模式。系统硬件总体设计框图如图2所示。
12864液晶显示
EasyARMLPC2131
最小系统
红外感应模块
四相五线步进电机
ULN2003A驱动芯片
图2系统原理结构框图
3.2系统硬件设计
本设计共用到的功能器件有,EasyARM2131开发板、ULN2003A驱动芯片、MG12864液晶显示屏、四相五线式步进电机、按键开关等器件。
3.2.1 EasyARM2131开发板功能
EasyARM2131开发板是广州周立功公司设计的EasyARM系列开发套件之一,采用了PHILIPS公司基于ARM7TDMI-S 核、单电源供电、LQFP64封装的LPC2131,具有JTAG仿真调试、ISP编程等功能。
如下图3所示为2131功能框图。
图3 EasyARM2131开发板功能框图
可进行GPIO的控制实验,如LED闪烁控制、键盘输入、蜂鸣器控制、模拟SPI等; 可进行外部中断实验,学习向量中断控制器(VIC); 定时器控制实验,如定时控制LED、按键捕获输入、匹配比较输出等;使用RS232转换电路,完成UART通讯实验等。
3.2.2 ULN003A驱动芯片
ULN是集成达林管IC,内部还集成了一个消线圈反电动势的二极管,可用来驱动继电器。它是双列16脚封装,NPN晶体管矩阵,最大驱动电压为50V,电流为500MA,输入电压为5V,适用于TTL COMS,由达林顿管组成驱动电路。下图4为ULN2003A的管脚功能图。
图4 ULN2003A管脚图
ULN2003 高压大电流达林顿晶体管阵列芯片,吸收电流可达500mA,输出耐压50V,具有很强的驱动能力。内部具有7组达林顿管电路,可以驱动7路负载。IN 为输入端可由单片机引脚直接控制,当输入端为高电平时,输出端OUT输出低电平。
3.2.3 TH12864-15液晶显示
TH12864-15是128(列)×64(行)点阵的液晶显示模块。当15脚为低且16脚为高时选中TH12864-15的左区(左边的64×64),当15脚为高且16脚为低时选中MG12864的右区(右边的64×64)。19脚和20脚是为了在光线暗的环境下看到液晶显示器的显示内容而加的背光,即在液晶显示器的背面加一光源。控制线R/W、CSI、CS2、RS必须在使能线E为低的时候改变。当使能线E为高时控制线R/W、CSI、CS2、RS不能改变;使能线E为高时TH12864-15从数据线DB0~DB7输出数据。下图6为TH12864-15的管脚说明。
引脚号 符号 功能
引脚号 符号 功能
1 GND 模块的电源地
7~14 DB0~DB7 并行数据0~7
2 VDD 模块的电源正端
15 PSB 并/串行接口选择
3 V0 LCD驱动电压输入端
16 NC 空脚
4 RS 并行的指令/数据选择信号;串行的片选信号
17 RET 复位,低电平有效
18 NC 空脚
5 R/W 并行的读/写选择信号;串行的数据口
19 BLA 背光源正极(LED+5V)
6 E 并行的使能信号;串行的同步时钟
19 BLK 背光源负极(LED-0V)
图6TH12864-15管脚说明
3.2.4 电机驱动模块
设计使用ULN2003A驱动芯片来驱动步进电机,用发光二极管来显示程序的运行状态。驱动电路如下图5所示。
图5 电机驱动模块电路
3.2.5显示模块
设计采用TH12864-15点阵式液晶显示屏,使用串行接法,电路模块图如下图6所示。
图6 12864液晶显示模块
3.3总设计电路图(见报告最后)
3.4软件设计
3.4.1 程序流程:设置引脚功能
液晶初始化
是否上升沿跳变
是
电机正转
是否下降沿跳变
是
电机反转
结论
本次课程设计中主体功能采用步进电机实现,显示功能采用液晶12864实现,对于步进电机的驱动采用uln2003芯片,使用方便,简化电路。对于液晶12864的操作采用串行通信,串行通信操作简单,连线方便。检测感应模块主要通过检测人体运动产生电平跳变即有人走近窗帘或者离开窗帘,然后将信号发送给lpc2131来控制电机正反转。对于主程序的设计,先定义一个标志变量flag,当检测到电平上升沿时,控制电机正转,变量flag=1;当检测到下降沿,同时flag=1时即人离开窗帘,控制电机反转,关闭窗帘。定义两个变量用来计数,在开关窗帘过程中,每当电机转动一圈时,相应变量自动加一,当变量达到设定上限值时,电机停止转动,即窗帘已经完全打开或者完全关闭。
附录
朱闯设计心得
为期两周的课程设计结束了,在没有实际操作以前,我觉得ARM课程设计会比较麻烦,为此我们参考了别人的设计,初步了解总体思路后开始动手实践。
由于有C语言编程经验和51单片机课设的经验,再结合ARM课程的学习,真正设计的过程中并没有想象的那么困难。只要ARM中的各个寄存器的名称和功能,以及一些常用的指令语句记得清楚,那么同样的用C语言编程是没有什么困难的。
对于这种实践性比较强的课程,一般情况下是少说多动手才有益于我们对这门课程的学习。对于程序设计来说,各个子程序的设计比较简单,只需按照各个芯片的操作时序编程就可以。比较困难的是主程序,由于各个模块功能相互穿插,因此要综合考虑。
我们这次课设所做的题目是红外感应自动窗帘控制器设计。总共能够实现两个功能,第一是控制两个步进电机的同时的正转、反转和停止,也即控制窗帘的开闭和停。第二是实现了一个显示的功能,显示窗帘的开关以及窗帘的开度。
这次课设中硬件电路比较简单,最重要的是加深了软件的调试方法,先将各个功能模块的子程序设计好,再与主程序连接综合调试,加深了对ARM课程内容的理解。
参考文献:
[1]周立功.编著.ARM微控制器基础与实践[M].北京:北京航空航天大学出版社.2005.
[2]黄智伟.ARM嵌入式系统应用设计与实践[M].北京:北京航空航天大学出版社.2011.
[2]沈建华.译.ARM嵌入式系统开发、软件设计与优化[M].北京:北京航空航天大学出版社.2005.
设计程序:
#include "config.h"
#include "stdio.h"
#define KEY1 1<<17 // P0.17
#define KEY2 1<<20 // P0.20
#define BEEPCON 1<<7 // P0.7
#define KEY3 1<<21 // P0.21
#define MOTO1 1<<9 // P0.9
#define MOTO2 1<<10 // P0.10
#define MOTO3 1<<12 // P0.12
#define MOTO4 1<<13 // P0.13
#define MOTOCON 0x3c003600 // MOTO控制字
#define GPIOSET(PIN) IO0SET = PIN // 方便修改置位端口
#define GPIOCLR(PIN) IO0CLR = PIN // 方便修改清位端口
#define LCD_CON 0x000c0080 //液晶显示控制字
#define E_CLK (1<<18) ; //clock input 同步时钟输入端
const uint32 RW_SID= (1<<19) ; //data input/output 串行数据输入、输出端
const uint32 CS = (1<<7); //P0.7
unsigned char XX[] = "西安科技大学";
unsigned char TM[] = "红外智能窗帘";
unsigned char XS[] = "王严许朱";
unsigned char BJ[] = "自动化0904班";
unsigned char ZZ[] = "开窗帘:正转";
unsigned char ZZ1[] = "每步走1.8";
unsigned char FZ[] = "关窗帘:反转";
unsigned char TZ[] = "停止";
unsigned char KD[]= "开度:";
uint32 zhen;
uint32 fan;
uint8 tin;
uint8 flag;
void DelayNS(uint32 dly);
void MOTO_Mode1(uint8 i); // AB-BC-CD-DA 正转
void MOTO_Mode2(uint8 i); // AD-DC-CB-BA 反转
void MOTO_Mode3(uint8 i); //电机停止
/***********************************************************
******************以下是显示器的子程序********************/
void delay(uint32 dly)
{
uint32 i;
for ( ; dly>0; dly--)
for (i=0; i<10; i++);
}
//串行发送一字节数据
void SendByte(uint8 dat)
{
uint8 i;
IO0SET=CS;
for(i=0;i<8;i++)
{
IO0CLR=E_CLK ;delay(5);
if(dat&0x80)
{
IO0SET=RW_SID;delay(5);
}
else IO0CLR=RW_SID;
{
IO0SET=E_CLK;delay(5);
}
dat=dat<<1;
}
IO0CLR=CS;
}
//串行接收一字节数据
unsigned char ReceieveByte(void)
{
uint8 i,d1,d2;
for(i=0;i<8;i++)
{
IO0CLR=E_CLK;delay(5);
IO0SET=E_CLK;delay(5);
if(RW_SID)d1++;
d1=d1<<1;
}
for(i=0;i<8;i++)
{
IO0CLR=E_CLK;delay(5);
IO0SET=E_CLK;delay(5);
if(RW_SID)d2++;
d2=d2<<1;
}
return (d1&0xF0+d2&0x0F);
}
//写控制命令
void SendCMD(uint8 dat)
{
SendByte(0xF8);
SendByte(dat&0xF0);
SendByte((dat&0x0F)<<4); }
//写显示数据或单字节字符
void SendDat(uint8 dat)
{
SendByte(0xFA);
SendByte(dat&0xF0);
SendByte((dat&0x0F)<<4); }
void display(uint8 x_add, unsigned char * word)
{
SendCMD(x_add);
while(*word)
{
SendDat(*(word++));
}
}
//初始化 LCM
void initlcm(void)
{
delay(200);
SendCMD(0x30); //功能设置,一次送8位数据,基本指令集
SendCMD(0x0C); //0000,1100 整体显示,游标off,游标位置off
SendCMD(0x01); //0000,0001 清DDRAM
SendCMD(0x02); //0000,0010 DDRAM地址归位
SendCMD(0x80); //1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC
}
/****************************************************************************
* 名 称:main()
* 功 能:根据表DISP_TAB来控制LED显示。
****************************************************************************/
int main(void)
{
PINSEL0=0x00000000;
PINSEL1=0X00000000;
PINSEL2&=~(0x00000006); //设置所有I/O口为GPIO口
IO0DIR =MOTOCON|BEEPCON|LCD_CON;
initlcm(); //12864初始化程序
display(0x80,XX);
delay(100);
display(0x90,TM);
delay(100);
display(0x88,XS);
delay(100);
display(0x98,BJ);
//DelayNS(1000);
//IO0CLR=LCD_CON;
//while(1);
while(1)
{
if((KEY1&IO0PIN)==0)
{delay(5);
if((KEY1&IO0PIN)!=0&&(flag==0))
{MOTO_Mode1(6);
zhen=0x00;
flag=1;
}
}
//if((KEY1&IO0PIN)==0)
//{delay(5);
if((KEY1&IO0PIN)!=0&&(flag!=0))
{MOTO_Mode2(6);
fan=0x00;
flag=0;
}
//}
else if((KEY2&IO0PIN)==0)
{MOTO_Mode2(6);}
//WaitKey3();
if ((KEY3&IO0PIN)==0)
{ MOTO_Mode3(6);}
}
return 0;
}
/****************************************************************************
* 名 称:DelayNS()
* 功 能:长软件延时
* 入口参数:dly 延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void DelayNS(uint32 dly)
{ uint32 i;
for(; dly>0; dly--)
{
for(i=0; i<4000; i++);
}
}
void MOTO_Mode2(uint8 i)
{
while((fan!=0x5cf)&&(KEY3&IO0PIN)!=0)
{
initlcm();
display(0x80,FZ);
delay(100);
display(0x90,ZZ1);
delay(100);
/* AB */
GPIOSET(MOTO1);
GPIOSET(MOTO4);
DelayNS(i);
GPIOCLR(MOTO1);
GPIOCLR(MOTO4);
/* BC */
GPIOSET(MOTO4);
GPIOSET(MOTO3);
DelayNS(i);
GPIOCLR(MOTO4);
GPIOCLR(MOTO3);
/* CD */
GPIOSET(MOTO3);
GPIOSET(MOTO2);
DelayNS(i);
GPIOCLR(MOTO3);
GPIOCLR(MOTO2);
/* DA */
GPIOSET(MOTO2);
GPIOSET(MOTO1);
DelayNS(i);
GPIOCLR(MOTO2);
GPIOCLR(MOTO1);
fan++;
}
if(fan==0x5cf)
{initlcm();
display(0x80,TZ);
delay(100);}
}
void MOTO_Mode1(uint8 i)
{
if((KEY3&IO0PIN)!=0)
{
while(zhen!=0x5cf)
{
initlcm();
display(0x80,ZZ);
display(0x90,ZZ1);
delay(100);
if(zhen<=1400)
{
display(0x88,KD);
delay(100);
SendCMD(0x8B);
SendDat((zhen/14)/10+0x30);
SendCMD(0x8C);
SendDat((zhen/14)%10+0x30);
}
/* AB */
GPIOSET(MOTO1);
GPIOSET(MOTO2);
DelayNS(i);
GPIOCLR(MOTO1);
GPIOCLR(MOTO2);
/* BC */
GPIOSET(MOTO2);
GPIOSET(MOTO3);
DelayNS(i);
GPIOCLR(MOTO2);
GPIOCLR(MOTO3);
/* CD */
GPIOSET(MOTO3);
GPIOSET(MOTO4);
DelayNS(i);
GPIOCLR(MOTO3);
GPIOCLR(MOTO4);
/* DA */
GPIOSET(MOTO4);
GPIOSET(MOTO1);
DelayNS(i);
GPIOCLR(MOTO4);
GPIOCLR(MOTO1);
zhen++;
if((KEY3&IO0PIN)==0)
{while(tin==0)
{initlcm();
display(0x80,TZ);
delay(100);
GPIOCLR(MOTO1);
GPIOCLR(MOTO2);
GPIOCLR(MOTO3);
GPIOCLR(MOTO4);
DelayNS(10);
}
}
}
if(zhen==0x5cf)
{initlcm();
display(0x80,TZ);
delay(100);}
}
}
void MOTO_Mode3(uint8 i)
{while((KEY3&IO0PIN)==0)
{
initlcm();
display(0x80,TZ);
delay(100);
GPIOCLR(MOTO1);
GPIOCLR(MOTO2);
GPIOCLR(MOTO3);
GPIOCLR(MOTO4);
DelayNS(i);
}
}
展开阅读全文