ARM课程设计频率计.docx
《ARM课程设计频率计.docx》由会员分享,可在线阅读,更多相关《ARM课程设计频率计.docx(21页珍藏版)》请在冰豆网上搜索。
ARM课程设计频率计
电控学院
课程设计(论文)
课程名称:
ARM嵌入式系统基础教程
题目:
ARM为核心的频率计设计
院(系):
电气与控制工程学院
专业班级:
测控技术与仪器1002
组员:
指导教师:
2013年12月28日
ARM为核心的频率计设计
[摘要]:
频率计又称为频率计数器,是一种专门对被测信号频率进行测量的电子测量仪器。
频率计最基本的工作原理为:
当被测信号在特定时间段T内的周期个数为N时,则被测信号的频率f=N/T。
本文以ARM为内核设计频率计,用ARM的定时器/计数器的定时和计数功能,检测外部方波频率,并用上位机显示。
关键词:
频率计、ARM、定时计数
1.概述1
1.1本次设计任务1
1.1.1设计题目1
1.1.2设计要求1
1.2设计基本原理2
2.方案设计3
3.硬件设计4
3.1硬件设计原理图及其介绍4
3.2主要单元电路的设计4
3.2.1电源电路设计4
3.2.2时钟振荡电路设计6
3.2.3复位电路设计6
3.2.4串口电路7
3.2.5显示电路设计8
3.3硬件电路总体设计11
4.软件设计11
结论12
心得体会13
致谢14
参考文献15
附录1:
程序清单16
1.概述
数字频率计(DFM)是电子测量与仪表技术最基础的电子仪表类别之一,数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器,而且它是数字电压表(DVM)必不可少的部件。
当今数字频率计不仅是作为电压表、计算机、天线电广播通讯设备、工艺过程自动化装置。
多种仪表仪器与家庭电器等许多电子产品中的数据信息输出显示器反映到人们眼帘。
集成数字频率计由于所用元件少、投资少,体积小,功耗低,且可靠性高,功能强,易于设计和研发,使得它具有技术上的实用性和应用的广泛性。
不论从我们用的彩色电视机、电冰箱,DVD,还有我们现在家庭常用到的数字电压表数字万用表等等都包含有频率计。
现在频率计已是向数字智能方向发展,即可以很精确的读数也精巧易于控制。
数字频率计已是现在频率计发展的方向,它不仅可以很方便的读数,而且还可以使频率的测量范围和测量准确度上都比模拟先进.而且频率计的使用已是很多的方面,数字卫星、数字通讯等高科技的领域都有应用,今天数字频率计的发展已经不仅仅是一个小电子产品的发展也是整个民族乃至整个国家的发展,所以频率计的发展是一个整体的趋势。
1.1本次设计任务
1.1.1设计题目
以ARM为核心设计频率计
1.1.2设计要求
1)用protel画出最小系统及外围扩展电路
2)显示部分可用12864或者数码管最好用上位机(VB界面)
主要功能为,用ARM的定时器/计数器的定时和计数功能,外部扩展6位LED数码管,要求累计每秒进入ARM的外部脉冲个数,用LED数码管显示出来。
或用上位机显示。
3)要求小组成员分工明确,答辩到位
1.2设计基本原理
所谓频率,就是周期性信号在单位时间(1s)内变化的次数.若在一定时间间隔T内测得这个周期性信号的重复变化次数为N,则其频率可表示为fx=N/T。
从原理图可知,被测信号Vx经放大整形电路变成计数器所要求的脉冲信号Ⅰ,其频率与被测信号的频率fx相同。
时基电路提供标准时间基准信号Ⅱ,具有固定宽度T的方波时基信号II作为闸门的一个输入端,控制闸门的开放时间,被测信号I从闸门另一端输入,被测信号频率为fx,闸门宽度T,若在闸门时间内计数器计得的脉冲个数为N,则被测信号频率fx=N/THz。
可见,闸门时间T决定量程,通过闸门时基选择开关选择,选择T大一些,测量准确度就高一些,T小一些,则测量准确度就低.根据被测频率选择闸门时间来控制量程.在整个电路中,时基电路是关键,闸门信号脉冲宽度是否精确直接决定了测量结果是否精确.逻辑控制电路的作用有两个:
一是产生锁存脉冲Ⅳ,使显示器上的数字稳定;二是产生清“0”脉冲Ⅴ,使计数器每次测量从零开始计数。
图1.l原理总体结构图
2.方案设计
方案1由外部波形发生器传送出频率后经LPC2200定时器对频率进行计数。
然后由上位机对频率进行计数显示。
方案2通过板内的1个定时器,完成发射频率与频率计数。
板内自带的定时器向另一个定时器发送方波频率,由另一个定时器接受并进行计数。
外接液晶屏1602显示频率,并且显示的程序可由板内的2个按键切换或进行中断。
因为本次设计所提供的器件有波形发生器,使用方案1更有利于整体设计,且在软件设计上更容易实现。
故此次设计我们使用方案1。
3.硬件设计
3.1硬件设计原理图及其介绍
图3.1原理框图
由上图知,被测脉冲信号进入ARM开发板,然后经过1S的定时捕获得出频率值,再经由上位机显示出数值。
3.2主要单元电路的设计
本次电路设计主要包括以下几个模块:
电源电路设计、时钟电路设计、复位电路设计和LCD显示电路。
3.2.1电源电路设计
电源、晶振及复位电路是整个系统正常工作的基础。
在进行电路设计时,首先保证其设计的正确性和可靠性,其次在系统调试之前也应首先检查它们的工作是否正常:
上电之前的电路是否短路、电压输出是否正确、晶振输出是否正确、以及复位信号电平和持续时间是否满足要求等。
本系统中5V电压直接由外部电源引入,1.8V及3.3V电压由电压转换器获得。
在此选用固定电压输出的DC-DC转换器:
ams1117-1.8(输出电压1.8V)和ams1117-3.3(输出电压3.3V)。
图3.2电源电路
3.2.2时钟振荡电路设计
图3.3时钟振荡电路
3.2.3复位电路设计
复位电路完成系统的上电复位和运行中的按键复位功能。
本系统采用电压监控芯片R3112完成电路的复位设计,具体电路如图8.3所示。
LPC2200芯片复位端为低有效端子,R3112芯片在加电后,其输出端(OUT)会在保持一定时间的低电平信号后变为高电平,低电平信号存在时间的长短由CD端连接的电容决定,通过调节此电容可以满足系统对复位时间的要求。
另外R3112可以监控系统电压,在系统电压低于一定值时,输出低电平,复位整个系统,从而保证了系统工作的可靠性。
图3.4复位电路
3.2.4串口电路
SP232E器件是一个符合RS-232和V.28串行协议规格的收发器家族,带有增强ESD性能。
这些器件的ESD容限得到了改进,不论是人体放电模式还是IEC1000-4-2气隙放电,都达到了±15kV。
SP232E器件在引脚上兼容Sipex的SP232A 器件,符合热门行业标准。
与原来的版本一样,在带负载情况下SP232E器件具有至少120Kbps的数据传输速率,0.1μF的电荷
泵电容,以及适应商业应用的整体强度。
同时,这些器件还具有Sipex的双极型CMOS设计,允许低功耗操作,而不影响性能。
SP232E系列可选塑料或陶瓷DIP和SOIC封装,覆盖商业级,工业级和军工级温度范围。
由于开发板是3.3V供电系统,需要使用电平转换芯片SP3232E来进行RS-232电平转换。
SP3232E的工作电压为3.3V,电平转换电路如图25所示。
当使用ISP(在系统可编程集成开发环境)功能时,需要将PC机的串口与开发板的串口相连,短接JP6端口,短接P0.14,在系统复位时,进入ISP状态。
同样,在程序仿真调试中,若用到串口UART0,则需要短接JP6两个端口。
图3.5UART0
3.2.5显示电路设计
液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
在本次频率计设计当中12864液晶显示最后的频率计算结果。
12864液晶显示具有如下的特性:
提供8位,4位并行接口及串行接口可选
并行接口适配M6800时序
自动电源启动复位功能
内部自建振荡源
64×16位字符显示RAM(DDRAM最多16字符×4行,LCD显示范围16×2行)(改为半角输入)
2M位中文字型ROM(CGROM),总共提供8192个中文字型(16×16点阵)
16K位半宽字型ROM(HCGROM),总共提供126个西文字型(16×8点阵)
64×16位字符产生RAM(CGRAM)
15×16位总共240点的ICONRAM(ICONRAM)
液晶显示12864的引脚功能如表3.1所示。
表3-1液晶显示12864的引脚功能
引脚号
引脚名称
方向
功能说明
1
VSS
-
模块的电池地
2
VDD
-
模块的电源正端
3
VO
-
LCD驱动电压输入端
4
RS(CS)
H/L
并行的指令\数据选择信号:
串行的片选信号
5
R/W(SID)
H/L
并行的读写选择信号:
串行的数据口
6
E(CLK)
H/L
并行的使能信号:
串行的同步时钟
7
DB0
H/L
数据0
8
DB1
H/L
数据1
9
DB2
H/L
数据2
10
DB3
H/L
数据3
11
DB4
H/L
数据4
12
DB5
H/L
数据5
13
DB6
H/L
数据6
14
DB7
H/L
数据7
15
PSB
H/L
并\串行接口选择:
H-并行:
L-串行
16
NC
空脚
17
RST
H/L
复位低电平有效
18
NC
空脚
19
LED_A
-
背光电源正极
20
LED_K
-
背光电源负极
对12864写控制时,在使能信号E下降沿有效。
在使能信号E下降沿后,为了保证数据或指令可靠写入,需要在使能信号E下降沿后有一段延时,使12864完成内部动作。
12864的指令集分为基本指令集和扩充指令集,扩充指令集提供绘图功能,可以显示图片;在本设计当中,仅需要基本指令集以显示汉字、数字和字母,表3.2给出12864的基本指令集。
清除显示指令将DDRAM填满“20H”,并且设定DDRAM的地址计数器(AC)为“00H”。
地址归位指令设定DDRAM的地址计数器(AC)为“00H”,并且将游标移到开头原点位置,这个指令
并不改变DDRAM的内容。
在显示状态开/关指令中,D=1,整体显示ON,C=1,游标ON,B=1,游标位置ON。
在功能设定指令中DL=1(必须为1),RE=1,扩充指令集动作,RE=0,基本指令集动作。
表3-212864的基本指令
指令
指令码
RS
RW
DB7
DB6
DB5
DB4
DB3
DB2
DB1
DB0
设定DDRAM地址
0
0
1
AC6
AC5
AC4
AC3
AC2
AC1
AC0
些资料到RAM
1
0
D7
D6
D5
D4
D3
D2
D1
D0
清楚显示
0
0
0
0
0
0
0
0
0
1
地址归位
0
0
0
0
0
0
0
0
1
X
显示状态开\关
0
0
0
0
0
0
1
D
C
B
游标或显示移位控制
0
0
0
0
0
1
S/C
R/L
X
X
功能设定
0
0
0
0
1
DL
X
RE
X
X
3.3硬件电路总体设计
图3.6总体电路
4.软件设计
由硬件电路和和设计原理:
所谓频率,就是周期性信号在单位时间(1s)内变化的次数。
若在一定时间间隔T内测得这个周期性信号的重复变化次数为N,则其频率可表示为fx=N/T。
因此,可以用计数器累计单位时间内的信号个数,然后经译码、显示输出测量结果,发送给12864或上位机显示。
4.1程序流程图
结论
此次实验题目为ARM为核心的频率计设计,主要完成从方波发生器接收脉冲信号,对其进行上升沿捕获,计1s脉冲个数,通过串口0将最终频率数值显示在上位机上,读取显示数值为最终计算频率。
此次实验使我通过亲自动手操作,将课本《ARM嵌入式系统基本教程》上的理论知识应用于实践,充分发掘学生们的潜力,进一步掌握ARM相关知识。
此外,实验中有一些问题存在,在实验室做设计时,没有有效地利用仪器设备进行设计调试,希望以后能有所改进。
心得体会
【软件调试】:
xxx在设计的过程中,遇到许许多多错误。
由于所测信号是方波信号,开始的程序设计是,每当一个周期的高电平到来时计数器的值加一,定时一秒,再把计数器的值发送给上位机显示,但高电平时一段持续高电平,不是脉冲信号,程序很难设计。
在老师的帮助下应用定时捕获才最终把程序调试了出来。
总之,这次课程设计锻炼了我的动手实践能力,把课本上学到的理论知识与设计制作很好的结合起来,加深了我对很多知识的理解。
【硬件设计】:
xxx
在做数字频率计的设计时,开始是遇到不少的问题,比如我们想如此微弱的信号是怎样被数字频率计检测的呢,频率计到底是什么设计原理呢,毕竟还没有接触过实际设计和开发,所以在考虑问题的时候往往是不全面的,也就是说这次设计还不少的方面没有考虑周全,也一定存在着这样那样的问题。
这个电路的设计有很多的不足,我们的能力在很多方面也需要提高,通过这次小小的考验让我们懂得第一次接触的东西也是能融会贯通的,态度决定一切。
致谢
通过一周的努力,我们的ARM毕设接近了尾声。
此次我们选择了以ARM为核心的频率及设计,在本次课设与论文完成中,xxx老师和xxx老师都给予了我们耐心的指导和无私的帮助,从选择题目到提纲撰写,再到流程进程,再到软硬件的设计以及各种调试,老师们多次指出我们设计存在的问题,并给与我们帮助,我们在此表示衷心感谢。
参考文献
[1]周立功著.ARM嵌入式系统基本教程(第2版).北京航空航天大学出版社,2008年.
[2]周立功著.深入浅出ARM7-LPC213X/214X.北京航空航天大学出版社,2005年6月.
[3]XX文库资料.《频率计设计》
[4]多媒体课件.《第6章接口技术与硬件设计》
附录1:
程序清单
/****************************************************************************
*文件名:
pinlvji.c
*功能:
计外部脉冲个数,将频率数值通过串口发送到上位机进行显示,使*用串口调试助手的窗口显示频率值。
*说明:
使用外部晶振为11.0592MHz,即Fpclk=11.0592MHz,根据
*CONFIG.H文件配置;
*通讯格式:
8位数据位,1位停止位,无奇偶校验,通讯波特率
*115200。
****************************************************************************/
#include"config.h"
#defineUART_BPS115200//定义通讯波特率
#defineTIMER5
#defineKEY1<<7//定义按键
/****************************************************************************
*名称:
DelayNS()
*功能:
长软件延时
*入口参数:
dly延时参数,值越大,延时越久
*出口参数:
无
****************************************************************************/
voidDelayNS(uint32dly)
{uint32j;
for(;dly>0;dly--)
{
for(j=0;j<5000;j++);
}
}
/****************************************************************************
*名称:
Time0Init()
*功能:
初始化定时器0,定时时间为1S。
*入口参数:
无
*出口参数:
无
****************************************************************************/
voidTime0Init(void)
{/*Fcclk=Fosc*4=11.0592MHz*4=44.2368MHz
Fpclk=Fcclk/4=44.2368MHz/4=11.0592MHz
*/
T0PR=99;//设置定时器0分频为100分频,得110592Hz
T0MCR=0x03;//匹配通道0匹配中断并复位T0TC
T0MR0=110592;//比较值(1S定时值)
T0TCR=0x03;//启动并复位T0TC
T0TCR=0x01;
}
/****************************************************************************
*名称:
UART0_Ini()
*功能:
初始化串口0。
设置为8位数据位,1位停止位,无奇偶校验,波
*特率为115200
*入口参数:
无
*出口参数:
无
****************************************************************************/
voidUART0_Init(void)
{uint16Fdiv;
PINSEL0=(PINSEL0&(~0x0F))|0x05;//不影响其它管脚连接,设置I/O连接到UART0
U0LCR=0x83;//DLAB=1,可设置波特率
Fdiv=(Fpclk/16)/UART_BPS;//设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
}
/****************************************************************************
*名称:
UART0_SendByte()
*功能:
向串口发送字节数据,并等待发送完毕。
*入口参数:
data要发送的数据
*出口参数:
无
****************************************************************************/
voidUART0_SendByte(uint8data)
{
U0THR=data;//发送数据
while((U0LSR&0x40)==0);//等待数据发送完毕
}
/****************************************************************************
*名称:
UART0_SendStr()
*功能:
向串口发送一字符串
*入口参数:
srt要发送的字符串的指针
*出口参数:
无
****************************************************************************/
voidUART0SendStr(char*str)
{
while
(1)
{
if(*str=='\0')break;
UART0SendByte(*str++);//发送数据
}
}
/***************************************************************************************
*函数名:
itoa
*描述:
将整形数据转换成字符串
*输入:
-radix=10表示10进制,其他结果为0
*-value要转换的整形数
*-buf转换后的字符串
*-radix=10
*输出:
无
*返回:
无
*调用:
被USART1_printf()调用
******************************************************************************************/
staticchar*itoa(intvalue,char*string,intradix)
{
inti,d;
intflag=0;
char*ptr=string;
if(radix!
=10)
{
*ptr=0;
returnstring;
}
if(!
value)
{
*ptr++=0x30;
*ptr=0;
returnstring;
}
if(value<0)
{
*ptr++='-';
value*=-1;
}
for(i=10000;i>0;i/=10)
{
d=value/i;
if(d||flag)
{
*ptr++=(char)(d+0x30);
value-=(d*i);
flag=1;
}
}
*ptr=0;
returnstring;
}
/******************************************************************************************
名称:
显示函数
功能:
显示转化后的字符串
说明:
*******************************************************************************************/
voiddisply(intd)
{
charbuf[16];
itoa(d,buf,10);
UART0SendStr(buf);
}
/****************************************************************************
*名称:
main()
*功能:
向串口UART0发送字符串
*说明:
在CONFIG.H文件中包含stdio.h。
***********************************