基于EasyARM1138的课程设计.docx
《基于EasyARM1138的课程设计.docx》由会员分享,可在线阅读,更多相关《基于EasyARM1138的课程设计.docx(25页珍藏版)》请在冰豆网上搜索。
基于EasyARM1138的课程设计
ARM课外实验报告书
一、实验板介绍:
EasyARM1138的核心MCU是LuminaryMicro公司的Stellaris(群星)系列ARM之LM3S1138。
该芯片采用的是国际上最优秀的MCU内核设计公司ARM最新推出的先进Cortex-M3处理器,其特点如下:
⒈强大的MCU内核
32位ARMCortex-M3内核(ARMv7M架构);
兼容Thumb的Thumb-2指令集,提高代码密度25%以上;
50MHz运行频率,1.25DMIPS/MHz,加快35%以上;
单周期乘法指令,2~12周期硬件除法指令;
快速可嵌套中断,6~12个时钟周期;
具有MPU保护设定访问规则;
64KB单周期Flash,16KB单周期SRAM;
内置可编程的LDO输出2.25V~2.75V,步进50mV,为硬件系统节省一个电源稳压器;
支持非对齐数据的访问,有效地压缩数据到内存;
支持位操作,最大限度使用内存,并提供创新的外设控制;
内置系统节拍定时器(SysTick),方便操作系统移植。
⒉丰富的外设资源
7组GPIO,具有多种工作模式:
高阻抗输入、2/4/8mA推挽输出、开漏输出、弱上拉/弱下拉输出,等等;
4个32位Timer,每个Timer都可拆分为2个独立的16位子定时器,具有定时、捕获、PWM、RTC等丰富功能;
3路全双工UART,位速率高达3.125Mbps,16单元接收FIFO和发送FIFO,支持串行红外协议(IrDASIR);
2路I2C,支持100kbps标准模式、400kbps快速模式;
2路SSI,兼容FreescaleSPI、MICROWIRE、TexasInstruments串行通信协议,位速率高达25Mbps;
6路16位PWM,通过CCP管脚输出,能产生速度高达25MHz的方波;
3个模拟比较器
8通道10位ADC,采样速率可达1M/s;
内置看门狗定时器(WatchDogTimer),确保芯片可靠运行。
内嵌USB接口的下载仿真器
仅需插入一根USB电缆就能实现“三合一”功能:
5V供电、程序下载与在线仿真、UART串行通信;
不再要求电脑具有串口或并口,无论台式机还是笔记本电脑,只要拥有USB1.1或USB2.0接口就能运用自如;
除了能够下载仿真自身以外,开发板保留的JTAG接口还可以用来仿真其它LM3S系列开发板,适用于所有Stellaris系列ARM芯片;
USB接口提供虚拟UART的功能,不需要额外的接口电路(如SP3232)。
简明的外围电路设计,调试时无需任何连线和跳线,操作极为方便
5只LED指示灯;
3只KEY;
1只交流蜂鸣器,可演奏动听乐曲,如《梁祝》;
两排插针引出全部GPIO资源,以及ADC0~ADC7、5V、3.3V、GND等;
ARM1138实验板原理图:
ARM1138实验板管脚图:
实验板CPU框图:
二、实验内容:
(一)、温度传感器:
一、实验目的:
(1)了解温度传感器基本原理及设计方法.
(2)模/数转换器或者模拟/数字转换器
二、实验板介绍:
在实验板的搭建过程中用到了Easyarm138和的A/D转换模块,其可以完成温度信号的采集及处理TMP123的功能主要是将被测温度模拟量转换成数字量,把数字化信号编码成时间比率(t1/t2)形式。
T1和t2时间上是连续,用同一个时钟即可获二者比率。
温度仅与时间比率有关,而与时钟频率无关,时钟频率发生波动,也会解码过程中被数字滤波器滤掉。
TMP123既可以检测温度,也可单片机实现温度控制功能,适用于远程温度检测、微机或电子设备温度监视器及工业过程控制等领域。
三、实验原理:
1.模数转换原理:
A/D模数转换原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值。
其优点是用简单电路就能获得高分辨率,但缺点是由于转换精度依赖于积分时间,因此转换速率极低。
2.通过TMP123将采集到的模拟温度连续信号进行模拟信号的采集并进行处理,通过与138板进行连接数据的传送通过USB与电脑进行连接,通过超级终端我们可以观测到室内温度的变换情况,与温度计算有关的计算公式实现如下:
10位的ADC模块集成有一个温度传感器,可以用来获取芯片的当前温度。
在温度传感器特性图里,给出了以下公式:
Vsenso=2.7-(T+55)/75,单位:
V设Vsenso对应的ADC采样值为N,2.7V对应N1,(T+55)/75对应N2已知:
N1*(3/1024)=2.7N2*(3/1024)=(T+55)/75由此得到:
N=N1-N2=2.7/(3/1024)-((T+55)/75)/(3/1024)解得:
T=(151040-225*N)/1024结论:
ADC配置为温度传感器模式后,只要得到ADC采样值N,就能推算出当前的温度T。
温度及电压测试(温度传感器的特性)图:
四、实验内容:
//主函数(程序入口)
intmain(void)
{charshiwrite[1]=0x06;//初始化显示时间
charfenwrite[1]=0x06;
charcBuf[3];
unsignedlongulStatus;
tI2CM_DEVICELM75A={0xa2>>1,0x02,1,cBuf,3};
tI2CM_DEVICEfen={0xa2>>1,0x03,1,fenwrite,1};
tI2CM_DEVICEshi={0xa2>>1,0x04,1,shiwrite,1};
jtagWait();//防止JTAG失效,重要!
clockInit();//时钟初始化:
晶振,6MHz
uartInit();//UART初始化
I2CM_Init();
//I2C主机初始化
I2CM_DataSend(&fen);
I2CM_DataSend(&shi);
for(;;)
{
ulStatus=I2CM_DataRecv(&LM75A);
LM75A_TmpDisp(cBuf);//显示时间
Delay1(500000L);
Delay1(500000L);
Delay1(500000L);
Delay1(500);
}
for(;;)
{
}
}
分析:
我们在程序中设置好初始开始时间06:
06,通过LM75芯片读取秒的变化,而小时和分钟的变化是通过移位实现的。
然后利用URAT通信来读取发送过来的时间,设置超级终端收端口为COM6,波特率为9600。
在程序中一定要做的是要防止JTAG失效和进行系统初始化。
//显示温度值
voidTemperatureDisplay(unsignedlongulData)
{
unsignedlongulTmp=0;
chars1[20];
chars2[20];
ulTmp=(2700-ulData)*75-55000;
sprintf(s1,"%ld.",ulTmp/1000);
sprintf(s2,"%ld",ulTmp%1000);
switch(strlen(s2))
{
case1:
strcat(s1,"00");
break;
case2:
strcat(s1,"0");
break;
default:
break;
}
UART_Puts(s1);
UART_Puts(s2);
UART_Puts("℃\r\n");
}
分析:
10位的ADC模块集成有一个温度传感器,可以用来获取芯片的当前温度。
Vsenso=2.7-(T+55)/75,单位:
V。
设Vsenso对应的ADC采样值为N,2.7V对应N1,(T+55)/75对应N2已知:
N1*(3/1024)=2.7N2*(3/1024)=(T+55)/75由此得到:
N=N1-N2=2.7/(3/1024)-((T+55)/75)/(3/1024)解得:
T=(151040-225*N)/1024结论:
ADC配置为温度传感器模式后,只要得到ADC采样值N,就能推算出当前的温度T。
真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。
在此实验中我们主要了解和搭建室内温度的采集及A/D转换。
在实验板的搭建过程中用到了Easyarm138和的A/D转换模块,其可以完成温度信号的采集。
电路图如图12-1ADC模块框图
分析:
ADC模块是由4个定时器,1个中断控制器,4个采样序列发生器、一个FIFO块,一个硬件平均电路,一个模数转换器构成。
ADC模块按照电路图进行,就可以将芯片的温度提取出来,通过公式转换显示在超级终端上。
内部温度传感器的公式为:
五、实习小结及心得:
本次实验旨在了解温度传感器基本原理及设计方法和模/数转换器或者模拟/数字转换器一些基本知识。
通过这次实验,我们受益非且。
在实验的过程中,我们熟悉了常见的模数转换器的原理及实际的工作参数,尤其是TMP123的集成电路设计的内部构造,这对数电知识和模电知识的运用有着密切的联系,这不仅仅让我们巩固了模电数电的基础知识,并且对他的一些应用有了更深的理解。
我们还了解了其外围电路的连接的机理,尤其是在和单片机的连接上,TMP123既可以检测温度,也可单片机实现温度控制功能,适用于远程温度检测、微机或电子设备温度监视器及工业过程控制等领域。
而且,在实验过程中,我们要用到的1138有关模块及相关的拐角功能,所以我们首先要非常熟悉1138各个模块和拐角的作用,其次按实际的电路的原理图进行电路的连接,将已经调试好的程序下载致IAR软件中同时并打开电脑的超级终端,然后运行此时我们可以在超级终端观测到实时的室内温度,这样才能够得到正确的的实验结果。
通过温度传感器这个实验,我们可以设定时间的初始值,在超级终端接收显示时间,时间连续变化。
第二个实验可以测定器件的温度,并将华氏温度转换成摄氏温度,Vsenso=2.7-(T+55)/75,通过测定芯片的Vsenso值就可以算出芯片的实际摄氏温度。
我们了解了这个实验的基本原理,也对温度传感有了更深刻的认识。
(二)、液晶显示实验
一、实验目的:
通过实验了解和掌握和了解基本的黑白液晶显示器显示原理,并利用其显示所要得到实验目的,并掌握4*4键盘工作的简单原理。
二、实验板介绍(器件)
1.4*4的按键矩阵模块。
2.黑白液晶显示器模块。
三、实验原理:
1.矩阵式键盘的结构与工作原理;在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。
在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。
这样,一个端口就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。
由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
2.显示原理:
LCD液晶显示器的真实解析度定义为“定点形式”,所以我们在使用LCD显示器时,这样画面所呈现的影像将会越清晰,使用起来感觉也会越好。
四、实验内容:
搭建好电路之后,在IAR环境下进行程序的调试并在显示屏上点阵显示出目的的结果。
部分的程序段如下:
#defineSysCtlPeriEnableSysCtlPeripheralEnable
#defineSysCtlPeriDisableSysCtlPeripheralDisable
#defineGPIOPinTypeInGPIOPinTypeGPIOInput
#defineGPIOPinTypeOutGPIOPinTypeGPIOOutput
//定义KEY
#defineKEY_PERIPHSYSCTL_PERIPH_GPIOG
#defineKEY_PORTGPIO_PORTG_BASE
#defineKEY_PINGPIO_PIN_5
//防止JTAG失效
voidJTAG_Wait(void)
{
SysCtlPeriEnable(KEY_PERIPH);//使能KEY所在的GPIO端口
GPIOPinTypeIn(KEY_PORT,KEY_PIN);
//设置KEY所在管脚为输入,PG5
if(GPIOPinRead(KEY_PORT,KEY_PIN)==0x00)
//如果复位时按下KEY,则进入
{
for(;;);//死循环,以等待JTAG连接
}
SysCtlPeriDisable(KEY_PERIPH);//禁止KEY所在的GPIO端口
}
//定义全局的系统时钟变量
unsignedlongTheSysClock=12000000UL;
//系统初始化
voidSystemInit(void)
{
SysCtlLDOSet(SYSCTL_LDO_2_50V);//设置LDO输出电压
SysCtlClockSet(SYSCTL_USE_OSC|//系统时钟设置,采用主振荡器
SYSCTL_OSC_MAIN
SYSCTL_XTAL_6MHZ
SYSCTL_SYSDIV_1);
/*
SysCtlLDOSet(SYSCTL_LDO_2_75V);//配置PLL前将LDO电压设置为2.75V
SysCtlClockSet(SYSCTL_USE_PLL//系统时钟设置,采用PLL
SYSCTL_OSC_MAIN//主振荡器
SYSCTL_XTAL_6MHZ//外接6MHz晶振
SYSCTL_SYSDIV_10);//分频结果为20MHz
*/
TheSysClock=SysCtlClockGet();//获取系统时钟,单位:
Hz
LCD_Init();//初始化LED1和LED2
}
unsignedchars1[]={"王增西安邮电学院"};
unsignedchar*p1=s1;
unsignedchars2[]={"王增科技零七零一"};
unsignedchar*p2=s2;
unsignedchars3[]={"王增科技零七零一"};
unsignedchar*p3=s3;
unsignedchars4[]={"王增序号13号"};
unsignedchar*p4=s4;
unsignedchars5[]={"点阵式液晶屏"};
unsignedchar*p5=s5;
unsignedchar*p6=s6;
unsignedchars7[]={"省"};
unsignedchar*p7=s7;
unsignedchars8[]={"心"};
unsignedchar*p8=s8;
unsignedchars9[]={"波形:
方波"};
unsignedchar*p9=s9;
unsignedchars10[]={"频率:
1MHZ"};
unsignedchar*p10=s10;
unsignedchars11[]={":
正弦波"};
unsignedchar*p11=s11;
unsignedchars12[]={":
方波"};
unsignedchar*p12=s12;
unsignedchars13[]={":
三角波"};
unsignedchar*p13=s13;
unsignedchars14[]={":
锯齿波"};
unsignedchar*p14=s4;
主函数(程序入口)
intmain(void)
{intap;
unsignedlongi;
JTAG_Wait();//防止JTAG失效,重要!
while
(1)
{
SystemInit();
LCMDisplayPicture_4();Delay(2500*(TheSysClock/4000));
SystemInit();
LCMDisplayPicture_5();Delay(2500*(TheSysClock/4000));
SystemInit();
LCMDisplayPicture_6();
for(i=0;i<6;i+=6)
{
WRCM(0X91+i);
HANZI(s9);
}
for(i=0;i<6;i+=6)
{
WRCM(0X89+i);
HANZI(s10);
}
Delay(2500*(TheSysClock/4000));
SystemInit();
LCMDisplayPicture_7();
for(i=0;i<7;i+=7)
{
WRCM(0X81+i);
HANZI(s11);
}//系统初始
for(i=0;i<7;i+=7)
{
WRCM(0X91+i);
HANZI(s12);
}
//系统初始化
for(i=0;i<7;i+=7)
{
WRCM(0X89+i);
HANZI(s13);
}
//系统初始化
for(i=0;i<7;i+=7)
{WRCM(0X99+i);
HANZI(s14);
}
Delay(2500*(TheSysClock/4000));
SystemInit();
LCMDisplayPicture_3();Delay(2500*(TheSysClock/4000));
SystemInit();
LCMDisplayPicture();
Delay(2500*(TheSysClock/4000));SystemInit();
LCMDisplayPicture_1();
Delay(2500*(TheSysClock/4000));SystemInit();
LCMDisplayPicture_2();
Delay(2500*(TheSysClock/4000));
SystemInit();
for(i=0;i<8;i+=8)
{
WRCM(0X80+i);
HANZI(s1);
}
Delay(500*(TheSysClock/4000));
//系统初始
for(i=0;i<8;i+=8)
{
WRCM(0X90+i);
HANZI(s2);
}
Delay(500*(TheSysClock/4000));
//系统初始化
for(i=0;i<8;i+=8)
{
WRCM(0X88+i);
HANZI(s3);
}
Delay(500*(TheSysClock/4000));
//系统初始化
for(i=0;i<8;i+=8)
{
WRCM(0X98+i);
HANZI(s4);
}
Delay(2500*(TheSysClock/4000));
SystemInit();
for(ap=0;ap<5;ap++)
{Delay(200*(TheSysClock/4000));
LCMDisplayPicture();
for(i=0;i<8;i+=8)
{
WRCM(0X80+i);
HANZI(s6);
}
WRCM(0X90);
HANZI(s7);
WRCM(0X97);
HANZI(s7);
WRCM(0X88);
HANZI(s8);
WRCM(0X8F);
HANZI(s8);
for(i=0;i<8;i+=8)
{WRCM(0X98+i);
HANZI(s6);
}
Delay(200*(TheSysClock/4000));
//LCMDisplayPicture_1();
}
//系统初始化
SystemInit();
for(ap=0;ap<5;ap++)
{Delay(200*(TheSysClock/4000));
//LCMDisplayPicture_1();
for(i=0;i<16;i+=8)
{
WRCM(0X88+i);
HANZI(s5);
}
Delay(200*(TheSysClock/4000));
LCMDisplayPicture_2();
}
SystemInit();
for(ap=0;ap<5;ap++)
{
LCMDisplayPicture();
Delay(200*(TheSysClock/4000));
LCMDisplayPicture_2();
Delay(200*(TheSysClock/4000));
}}
}
五、实验分析及心得:
首先通过本实验了解并掌握了简单的液晶显示器的显示原理及构造,利用他显示了简单的实验结果。
这次实验还了解了4*4矩阵键盘的基本构造及电路的实现原理。
其次通过液晶显示这个实验,基本了解了矩阵键盘的构造,点阵构造了汉字显示,就通过每个点的亮灭就可以在液晶显示屏上显示出构造的汉字液晶显示屏是用点阵来表示的,每个汉字是用点阵来表示,用二进制的0或1表示那个点的亮灭,修改点阵就可以显示不同的字,液晶显示是按行从左到右的打,逐行打印。
(三)、定时器试验--定时器演奏乐曲
一、实习目的:
(1)了解并掌握蜂鸣器演奏音乐的设计
(2)了解电机的不同转速转设计。
二、实验板介绍:
实践环境是EASYARM1138这里不再赘述。
三、实验原理:
先给定时器赋一个初值,由赋值的不同,再根据算法的不同来调节脉宽,蜂鸣器会发出不同的音调,电机会以不同的转速转动。
下图为EasyARM1138开发板上的蜂鸣器驱动电路。
蜂鸣器类型是交流蜂鸣器也称无源蜂鸣器,需要输入一列方波才能鸣响,发声频率等于驱动方波的频率。
由于每次高电平的不同,所以响应时间不同,所以定时器周期不同,导致蜂鸣发声不同。
电机转速不同,改变电压的方法很多,最常见的是PWM脉宽调制,调节电机的输入占比,就可以控制电机的平均电压,控制转速。
四、实验内容:
主函数(程序入口)
intmain(void)
{jtagWait();//防止JTAG失效,重要!
clockInit();//时钟初始化:
晶振,6MHz
buzzerInit();//蜂鸣器初始化
for(;;)
{musicPlay();
SysCtlDelay(4000*(TheSysClock/300