ARM数字电压表+上位机显示+测控.docx
《ARM数字电压表+上位机显示+测控.docx》由会员分享,可在线阅读,更多相关《ARM数字电压表+上位机显示+测控.docx(14页珍藏版)》请在冰豆网上搜索。
ARM数字电压表+上位机显示+测控
电控学院
课程设计
课程名称:
ARM课程设计
题目:
ARM数字电压表设计
院(系):
电气与控制工程学院
专业班级:
测控技术与仪器1101班
姓名:
学号:
指导教师:
2015年01月09日
基于LPC2131数字电压表
一绪论
1.1课题设计目的
深入了解ARM2100系列芯片的功能以及应用,可以利用ARM2100系列设计简单测量仪表。
1.2课题设计要求
1)用protel画出最小系统及外围扩展电路
2)以ARM为控制器,采用中断方式,对2路0-5v的模拟电压进行循环采集。
采集的数据送LED显示,并存入内存。
超过界限时指示灯闪烁。
设计接口电路,将这些外设构成一个简单的ARM应用系统,画出接口的连接电路图。
或者用上位机(VB或虚拟仪器界面)。
3)编写下列控制程序
对2路模拟信号输入实行循环采集,每路连续采集16次,算平均值。
分别设定每一路的上限值,若采集的平均值超过该界限值,则对应通道的指示灯闪烁10次后一直亮,指示灯闪烁时蜂鸣器发声,以示警告。
1.3课题设计仪器
1、简介
(1)实验平台硬件结构
MagicARM2200教学实验开发平台是由广州周立功单片机发展有限公司开发的一款可使用uC/OS-Ⅱ和uClinux双操作系统、集众多功能于一身的ARM教学实验开发平台,开发板上带有充足的存储资源(PARAM、NANDFLASH、NORFLASH和E2ROM等)具有以太网接口MODEM接口、CAN接口、IDE硬盘接口、CF卡接口、SD卡接口、打印机接口5.2英寸320*240彩色液晶屏(带触摸屏),可使用JTAG仿真调试。
灵活的跳线选择(I/O口与功能电路的连接)并设有外设PACK和GPIO输出接口,非常适用于教学实验。
(2)LPC21xX系列
LPC2131/2132/2138是基于一个支持实时仿真和跟踪的16/32位ARM7TDMI-STMCPU,并带有32kB、64kB和512kB嵌入的高速Flash存储器。
128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。
对代码规模有严格控制的应用可使用16位Thumb模式将代码规模降低超过30%,而性能的损失却很小。
较小的封装和很低的功耗使LPC2131/2132/2138特别适用于访问控制和POS机等小型应用中;由于内置了宽范围的串行通信接口和8/16/32kB的片内SRAM,它们也非常适合于通信网关、协议转换器、软件
modem、语音识别、低端成像,为这些应用提供大规模的缓冲区和强大的处理功能。
多个32位定时器、1个或2个10位8路的ADC、10位DAC、PWM通道、47个GPIO以及多达9个边沿或电平触发的外部中断使它们特别适用于工业控制应用以及医疗系统。
(3)ADS集成开发环境及EASYJTAG-H仿真器
ADS集成开发环境是ARM公司推出的ARM核微控制器集成开发工具,英文全称为ARMDeveloperSuit,成熟版本为ADS1.2ADS1.2支持ARM10之前的所有ARM系列微控制器,支持软件调试及JTAG硬件仿真调试,支持汇编、C、C++源程序,具有编译效率高、系统库功能强等特点,可以在Windows98、WindowsXP、Windows2000以及RedHatLinux上运行。
(4)LabVIEW软件
LabVIEW自问世以来,经历了一个快速发展的过程,如今已被大家所认可。
它是当前测控领域的技术热点,也代表着未来虚拟仪器的发展方向。
LabVIEW是图形化的编程语言,类似于传统的文本编程语言中的函数或子程序,用它开发的软件成为虚拟仪器,在操作界面上与现实中的仪器完全一样,功能比现实中的传统仪器还要强大。
LabVIEW还包含了大量的控件、工具和函数,用于数据采集、分析、显示与存储等操作。
同时,其提供了广泛的接口,可以与DLL、VisualBasic、MATLAB等多种软件互相调用。
其附带有扩展库函数,在自身配备的工具不能完成一些任务时,就可以调用专业的数据采集和处理工具包扩展库,进行强大的专业数学分析等。
其也具有强大的仪器驱动库,可以和多种仪器连接。
LabVIEW软件可以编写出界面美观、功能强大的程序,它具有形象、生动的编程语言。
在编程过程中,需要某个控件时直接拖动到目的地就可以找到相应的接线端口,进行连线设置后即可传输数据,省去了许多源代码的编写麻烦和参数传递的设置。
2、方案设计
2.1设计思路
通过LPC2131板内的A/D转换器,在主程序中对芯片进行初始化和终端,通过改变电位器阻值改变2路模拟电压的值。
对2路0—5V的模拟电压进行循环采集,采集的数据通过串口UARTO向PC机发送显示。
PC机上用LabVIEW设计显示界面。
2.2通讯格式
8位数据位,1位停止位,无奇偶校验,波特率为115200。
3、硬件设计
3.1硬件设计原理图及介绍
图3.1原理框图
由上图知,两个被测信号进入ARM开发板,经过A/D转换模块转换得出电压值,再经由上位机显示出数值。
图3.2蜂鸣器报警电路
图3.3指示灯闪烁电路
4、软件设计
4.1程序流程图如图4.1所示。
根据流程图编程实现各自功能。
图4.1程序流程图
5、上位机设计
6、参考文献
[1]周立功.ARM嵌入式系统基础教程[M].北京航空航天大学出版社,2008.9.
[2]李红岩,杨学存.ARM嵌入式实验+实训指导书[M].西安科技大学出版社,2013.9.
[3]李江全,任玲,廖结安,温宝琴.LabVIEW虚拟仪器从入门到测控应用130例[M].电子工业出版社,2013.4.
7、心得体会
心得体会一(李云)
通过这一周的课程设计,对这学期所学的ARM课程有了更加深刻的认识,掌握了上课时没有掌握的知识。
更加清楚了团合作的重要性。
在刚开始做课程设计时,只有题目和设计要求,看着毫无头绪,通过老师的讲解,查阅资料,弄清楚了数字电压表的原理。
我们组两个人,分工合作,我负责调试程序,另一个负责做上位机界面,但班上也有其他组同学和我们做的题目一样遇到问题时,大家互相讨论,实在不能解决,就请教老师,每次请教老师,老师都会耐心解答我们的问题。
这次实习对于我来说还是有一定难度的,因为几乎没有什么实际经验而不像有的同学以前参加过电子设计大赛。
他们做起来感觉得心应手可以说是一气合成,而我画图所用的软件以前虽然用过但还是不太熟悉,画图过程中有很多问题。
通过这次课程设计,虽然学到了不少东西不管是电路图的绘制还是软件的编写和调试,对课堂上学的一些理论知识也有了更感性的认识,但同时也发现了自身的不足。
就比如说实际动手能力吧。
在以后的学习中,学好理论知识的同时要更多实践,增强自己的动手能力。
这次课程设计收获不小,ARM的应用越来越广泛,这次课程设计,对我们以后的工作也有很大帮助。
感谢这次课程设计的指导老师—秦老师和李老师对我们的耐心辅导。
心得体会二(韩文星)
在本次课程设计,我掌握了一些DXP画电路图的基本技巧,在以后的学习中,自己也会继续学习,直到熟练掌握。
以前只在课本中学过的一些器件,在这次课程设计中也真正了解到他们的用途以及在实物中怎样识别各个管脚。
在设计好电路图后,就是按照图进行接线,再接电路图后,电路出现了许多问题,接线不细心,就会少接线,运行不出来,检查不到问题,电路板最两边的两行是接通的,若接器件的话就会被短路,这就需要我们再接电路时要细心,接好电路后仔细检查。
在实验中还是会因为电路,器件,等等原因引起错误和误差,经过多次检查和老师的帮助最终才完成。
从中我知道们在书本上学到的东西真的甚少,要想多增加知识还必须多做一些类似的设计,只有从收集材料,筛选材料,制作,一步一步认认真真的才能完成。
而且必须多多分析每个错误的原因,这样我们才可以进步。
在这次课程设计中我发现自己的动手能力还很差,以后必须多做一些实验,增加自己的动手能力。
在这次课程设计中也遇到很多困难,感谢秦老师和李老师的悉心指导和帮助。
8、结论
这次课程设计,是对我们课堂上所学理论知识的实践与总结,这次我们做的数字电压表,由于时间原因,只采集两路电压信号,对电流和功率只在上位机上进行简单的运算并显示。
在以后的开发设计中,可以对电流进行采集。
9、附件
程序清单:
/****************************************************************************
*文件名:
main.c
*功能:
使用ADC模块的通道0、1进行电压的测量,然后将转换结果从串口输出,
*上位机使用LabVIEW软件编写显示界面
*说明:
跳线JP8、JP30短接。
由W1、W2调节测量电压值。
*通讯格式:
8位数据位,1位停止位,无奇偶校验,波特率为115200。
****************************************************************************/
#include"config.h"
#defineLED11<<16//P2.16
#defineLED21<<17//P2.17
#defineBEEPCON1<<20
//P0.7引脚控制B1,低电平蜂鸣
#defineLEDCON0x00000000
/****************************************************************************
*名称:
DelayNS()
*功能:
长软件延时
*入口参数:
dly延时参数,值越大,延时越久
*出口参数:
无
****************************************************************************/
voidDelayNS(uint32dly)
{uint32i;
for(;dly>0;dly--)
{
for(i=0;i<5000;i++);
}
}
/****************************************************************************
*名称:
UART0Init()
*功能:
初始化串口0。
设置为8位数据位,1位停止位,无奇偶校验
*入口参数:
bps通讯波特率
*出口参数:
无
****************************************************************************/
voidUART0Init(uint32bps)
{uint16Fdiv;
PINSEL0=(PINSEL0&(~0x0F))|0x05;//不影响其它管脚连接,设置I/O连接到UART0
U0LCR=0x83;//DLAB=1,可设置波特率
Fdiv=(Fpclk/16)/bps;//设置波特率
U0DLM=Fdiv/256;
U0DLL=Fdiv%256;
U0LCR=0x03;
}
/****************************************************************************
*名称:
UART0SendByte()
*功能:
向串口发送字节数据,并等待发送完毕。
*入口参数:
data要发送的数据
*出口参数:
无
****************************************************************************/
voidUART0SendByte(uint8data)
{
U0THR=data;//发送数据
while((U0LSR&0x40)==0);//等待数据发送完毕
}
/****************************************************************************
*名称:
UART0SendStr()
*功能:
向串口发送一字符串
*入口参数:
srt要发送的字符串的指针
*出口参数:
无
****************************************************************************/
voidUART0SendStr(char*str)
{
while
(1)
{
if(*str=='\0')break;
UART0SendByte(*str++);//发送数据
}
}
/****************************************************************************
*名称:
PCDispChar()
*功能:
向PC机发送显示字符。
*入口参数:
x显示位置的纵坐标,0-79
*y显示位置的横坐标,0-24
*chr显示的字符,不能为0xff
*color显示的状态包括前景色、背景色、闪耀位。
它与dos的字符显示状态一样。
*即0~3位:
前景色,4~6位:
背景色,7位:
闪耀位。
*出口参数:
无
****************************************************************************/
voidPCDispChar(uint8x,uint8y,uint8chr,uint8color)
{
UART0SendByte(0xff);//发送起始字节
UART0SendByte(x);//发送字符显示坐标(x,y)
UART0SendByte(y);
UART0SendByte(chr);//发送显示字符
UART0SendByte(color);
}
/****************************************************************************
*名称:
ISendStr()
*功能:
向PC机发送字串,以便显示。
*入口参数:
x显示位置的纵坐标,0-79
*y显示位置的横坐标,0-24
*color显示的状态包括前景色、背景色、闪耀位。
它与dos的字符显示状态一样。
*即0~3位:
前景色,4~6位:
背景色,7位:
闪耀位。
*str要发送的字符串,字串以'\0'结束
*出口参数:
无
****************************************************************************/
voidISendStr(uint8x,uint8y,uint8color,char*str)
{
while
(1)
{
if(*str=='\0')break;//若为'\0',则退出
PCDispChar(x++,y,*str++,color);//发送显示数据
if(x>=80)
{
x=0;
y++;
}
}
}
/****************************************************************************
*名称:
main()
*功能:
进行通道0、1电压ADC转换,并把结果转换成电压值,然后发送到串口。
*说明:
在CONFIG.H文件中包含stdio.h。
****************************************************************************/
intmain(void)
{
uint32ADC_Data;
charstr[20];
UART0Init(115200);//初始化UART0
PINSEL1=0x01400000;//设置P0.27、P0.28连接到AIN0、AIN1
IO1DIR=BEEPCON;//设置I/O为输出
IO2DIR=0x00000000;
IO1SET=BEEPCON;
/*进行ADC模块设置,其中x<ADCR=(1<<0)|//SEL=1,选择通道0
((Fpclk/1000000-1)<<8)|//CLKDIV=Fpclk/1000000-1,即转换时钟为1MHz
(0<<16)|//BURST=0,软件控制转换操作
(0<<17)|//CLKS=0,使用11clock转换
(1<<21)|//PDN=1,正常工作模式(非掉电转换模式)
(0<<22)|//TEST1:
0=00,正常工作模式(非测试模式)
(1<<24)|//START=1,直接启动ADC转换
(0<<27);//EDGE=0(CAP/MAT引脚下降沿触发ADC转换)
DelayNS(10);
ADC_Data=ADDR;//读取ADC结果,并清除DONE标志位
while
(1)
{
ADCR=(ADCR&0x00FFFF00)|0x01|(1<<24);//设置通道1,并进行第一次
转换
while((ADDR&0x80000000)==0);//等待转换结束
ADCR=ADCR|(1<<24);//再次启运转换
while((ADDR&0x80000000)==0);//等待转换结束
ADC_Data=ADDR;//读取ADC结果
ADC_Data=(ADC_Data>>6)&0x3FF;//提取AD转换值
ADC_Data=ADC_Data*3300;//数值转换
ADC_Data=ADC_Data/1024;
sprintf(str,"%4dmVatVIN1",ADC_Data);
ISendStr(30,23,0x30,str);
if(ADC_Data>=3000)
{uint32i;
for(i=0;i<10;i++)
{IO1SET=BEEPCON;
IO2DIR=0x00010000;//BEEPCON=1
DelayNS(15);
IO1CLR=BEEPCON;//BEEPCON=0
IO2DIR=0x00000000;
DelayNS(15);
}
IO2DIR=0x00010000;
DelayNS(150);
}
else
{IO1SET=BEEPCON;//BEEPCON=0
IO2DIR=0x00000000;}
ADCR=(ADCR&0x00FFFF00)|0x02|(1<<24);//设置通道2,并进行第一次转换
while((ADDR&0x80000000)==0);//等待转换结束
ADCR=ADCR|(1<<24);//再次启运转换
while((ADDR&0x80000000)==0);//等待转换结束
ADC_Data=ADDR;//读取ADC结果
ADC_Data=(ADC_Data>>6)&0x3FF;//提取AD转换值
ADC_Data=ADC_Data*3300;//数值转换
ADC_Data=ADC_Data/1024;
sprintf(str,"%4dmVatVIN2",ADC_Data);
ISendStr(30,21,0x30,str);
if(ADC_Data>=2500)
{uint32i;
for(i=0;i<10;i++)
{IO1SET=BEEPCON;
IO2DIR=0x00020000;//BEEPCON=1
DelayNS(15);
IO1CLR=BEEPCON;//BEEPCON=0
IO2DIR=0x00000000;
DelayNS(15);
}
IO2DIR=0x00020000;
DelayNS(150);
}
else
{IO1SET=BEEPCON;//BEEPCON=0
IO2DIR=0x00000000;}
}
return(0);
}