全国大学生电子设计竞赛论文模板.docx
《全国大学生电子设计竞赛论文模板.docx》由会员分享,可在线阅读,更多相关《全国大学生电子设计竞赛论文模板.docx(22页珍藏版)》请在冰豆网上搜索。
全国大学生电子设计竞赛论文模板
2013年全国大学生电子设计竞赛
手写绘图板(G题)
【NX0301组】
2013年9月7日
摘要:
本设计利用覆铜板的电势场效应,检测铜板两点间的微弱的电位差,小信号电位差经过LM324进行千倍放大,从而经过快速的高精度的A/D转换。
使转换的信号经过单片机进行与所建立的触摸板坐标库函数进行比较,输出位置的的纵横坐标及所在象限,并且使精度大于0.8mm,并能很快显示表笔所在触摸板的位置。
通过检测,此方案是具有可行性的,
关键字:
电势差;LM324千倍放大电路;ARM系统
1系统方案5
1.1方案比较与选择5
1.2方案描述6
1.3各模块的设计7
1.3.1表笔的设计7
1.3.2触摸板的设计7
1.3.3信号的采集模块8
1.3.4放大电路模块8
1.3.5模数转换的电路模块8
1.3.6单片机的选择与确定8
1.3.7输出设备模块9
2理论分析与计算9
2.1系统的理论分析9
2.2恒压源的计算10
2.4运算放大器的计算11
2.5触摸板坐标库函数的计算12
2.6模拟信号的A/D转换计算13
3电路与程序设计14
3.1电路的设计14
3.1.1系统总体框图14
3.1.2放大器的子系统框图与电路原理图14
3.1.3显示子系统框图15
3.1.4电源子系统框图16
4测试方案与测试结果17
4.1测试方案17
4.2测试条件与仪器17
4.3测试结果及分析18
附录1:
源程序18
1系统方案
1.1方案比较与选择
方案一:
采用测微电阻的方法进行定位
通过对覆铜板上电阻值的测量,由覆铜板上不同点处的电阻值也不同的特点,从而让不同俩点之间产生电阻差,把测得的电阻差通过A/D转换,再把这个信号传送给单片机,进而实现手写绘图的功能。
但由于测量后发现电阻值非常微小,且同一覆铜板上电阻的变化率很小,检测到很微小电阻,所以很难检测,硬件电路也非常复杂,所花费的成本也比较高,软件调试并不容易,要保证技术要求的指标困难,所并且花费的成本也比较高,故采用此方案不理想。
方案二:
采用测冲击电流的方法进行定位
鉴于覆铜板电阻甚小,故转向测测冲击电流,采用测冲击电流的方法及相应的装置,由控制单元控制充电回路的开关闭合,放电回路的开关断开,使得充电回路中的可控电源给一个储能电容器充电,然后控制电路断开充电回路的开关,闭合放电回路的开关,并同时给取样单元以触发信号,储能电容器放电产生一冲击电流至待测电阻;取样单元通过放电回路中的电流传感器和电压传感器得到待测电阻上的冲击电流和电压数据,再反馈至控制单元,控制单元读取这些数据,经计算处理得到待测电阻的阻值。
电阻测出后,根据不同电阻值定位坐标。
但缺点是电路板上每个点都对应一个不一样的信号,测量时对技术要求很高,所以此方案可行性也不大。
方案三:
采用测电压的方法进行定位
本方案是给触摸板分别加横轴电势场与纵轴电势场原理(如图1)进行测电压,进而定位。
表笔在覆铜板上接触相当于测量部分覆铜板的电压,找出电压大小与距离测量点距离的关系,从而进行定位。
切换DD与CC的电压,可分别检测出一点的X轴坐标与Y轴坐标。
经过检测,覆铜板的分辨率为mv/cm,经过1000倍的信号放大电路,产生的电压信号经过模数转换,是可以用单片机进行转换并测出并经显示屏显示出坐标与位置。
(图1)
综合以上三种方案,所以选择方案三。
1.2方案描述
把表笔检测到的信号,经过千倍以上的放大,输出0~3V的电压,经过A/D芯片把模拟信号转化为数字信号,然后建立横轴与纵轴的坐标库函数,然后把转化的数字信号经过单片机进行检测,输出坐标的位置象限。
(图2总体设计框架图)
1.3各模块的设计
1.3.1表笔的设计
我们的表笔采用的是万用表表笔,因为选材比较方便,还比较好用,表笔采用平衡电桥进行小信号的输出,从而使输出的电压信号更加精准,更容易精确确定触摸板的定位坐标。
我们用毫安表测试出了微小电压,说明了小信号的放大可行性。
1.3.2触摸板的设计
我们采用现有的设备,就是PCB覆铜板,经过我们的改进,利用覆铜板采集到的坐标电压信号比较精确,而且选材方便,而且成本较低,经济划算。
不像某些高电阻率的材料,比较难找,而且成本比较高,一点都不节约成本。
1.3.3信号的采集模块
用表笔接触触摸板,会产生微小的电位差,经过惠更斯电桥,使测得的小电压更加精准,而惠更斯电桥的搭建很简单,只采用四个电阻即可搭建,却能产生精度比较高的电压信号,而且更有利于确保信号的稳定。
1.3.4放大电路模块
放大电路我们采用的是LM324芯片,利用模拟电路,搭建成N级放大电路,这样使放大电路精确放大一千倍,从而产生比较容易检测的大电压信号,有利于信号的转换。
而且这种芯片比较常见,资料齐全,大部分实验室都有,且成本低廉。
1.3.5模数转换的电路模块
经放大产生的电压信号只有经过A/D转换模块,才能使被单片机识别。
我们所采用的是ARM单片机自带10位高精度的A/D芯片,这样转换的精度比普通的8位A/D芯片更加精确,芯片的转换速度更快,这样可以使表笔的显示更加快捷敏感。
1.3.6单片机的选择与确定
我们采用的ARM32位的单片机,采取此芯片的优点是他的运算速度比普通单片机速度高很多,这样使触摸板有足够高的灵敏度,更快的显示表笔所在的坐标,这样经过系统软件的优化,使表笔采集到的信号更连贯,更快的显示当前坐标,从而使显示的坐标更精确。
而采取此型单片机更大的优点是他具有更大的内存,可以驱动TFT触摸彩屏,并且可以存足够大的触摸板坐标库函数,而且可以用手触摸去控制此手写绘图板,使显示更具有可观测性。
1.3.7输出设备模块
我们采用的是TFT触摸彩屏,它的显示精度更高,更具有可观测性,而且他可以用手去控制,减少了其他按钮,而且界面做了更加人性化的处理,更方便了对可控触摸板的优化。
而6盏LED灯是我们的辅助输出设备,当电源开启时,L1灯亮;当表笔接触触摸屏时,L2灯亮;当表笔在触摸屏的第一象限时,L3灯亮;当表笔在触摸屏的第一象限时,L4灯亮;当表笔在触摸屏的第二象限时,L5灯亮;当表笔在触摸屏的第三象限时,L6灯亮;当表笔在触摸屏的第四象限时,F灯亮,这样我们就可以显示基本的信号。
2理论分析与计算
2.1系统的理论分析
用万用表测得覆铜板上每移动一毫米,电压变化为0.35mv/cm,这样经过平衡电桥,使测得的电压值更加灵敏。
这样经过1000倍的信号放大,使放大后的信号为0~3V,这样经过高精度A/D模块把信号转化为数字信号,数字信号传输到单片机上,当单片机检测到输入的信号时,调用触摸板坐标库函数,经过分析得到表笔的实际位置坐标,然后经过单片机输出在显示屏上显示表笔所在的象限位置与坐标,从而显示触摸板的位置,这样是具有可行性的。
2.2恒压源的计算
恒压源是由LM317经过放大组成。
LM317产生的电流为1.5A,输出电压可在1.7~37V之间连续调节其输出电压由两只外接电阻R1与R2决定,输出端与调整段之间的电压差为1.25V,这个电压产生1几毫安的电流,经R1与R2到地,为了得到稳定的输出电压,流经R1的电流小于3.5MA。
VD1为保护二极管,防止稳压器输入短路而损坏集成芯片。
计算公式为
U0=1.25*(R2/R1+1)
(图3)
2.4运算放大器的计算
对于1000倍的放大电路,我们采用的是LM324,采用的是3级放大,每级放大10倍,最终放大1000倍,使得放大的信号经转换后能被单片机检测。
(图4)
2.5触摸板坐标库函数的计算
如(图5)中接线所示,不断在X轴与Y轴改变电场方向分别检测X轴与Y轴所在位置。
由于覆铜板均匀且无噪点,如下图在AA与BB分别分别不同时刻加上1.4V和0V,以表笔作为检测电路,分别测得表笔与地之间的电压并记录。
要把测出的覆铜板位置的电压信号转换成覆铜板的坐标信号,因此要建立坐标库函数。
由与表笔所在覆铜板的位置不同,所对应的电压值也不同,所以根据测得的电压值能建立起库函数。
由于我们要知道表笔所在位置,所以必须检测到横坐标与纵坐标的位置,这样就建立起了纵横坐标对应的电压库函数。
分别先后在触摸板纵轴两端接1.4V电压,这样在平面的覆铜板上就可以实现两点定位了。
先在AA、BB与CC、DD分别接正1.4V与0V,然后沿着横轴每隔0.2cm用表笔测一次电压值,当示数稳定后,记录此点电压,经过多次测量求平均值,并经过线性化模拟出函数Vx=0.35mv/cm,建立起沿X轴电压变化的函数方程。
然后AA、CC与BB、DD分别接1.4V与0V,并沿着纵轴每隔0.2cm用表笔测一次电压值,当示数稳定后,记录此点电压,经过多次测量求平均值,经过多次测量求平均值,并经过线性化模拟出函数Vy=0.175mv/cm,建立起沿Y轴电压变化的函数方程。
这样在触摸板表的覆铜板上就可以实现两点定位了。
(图5)
2.6模拟信号的A/D转换计算
由于我们采用的是ARM片内A/D转换芯片,A/D通过采样、量化、编码,直接输出数字信号。
由于我们采用的是10位数模转换芯片,他的转换速度比普通8位芯片的精度更高,而40MS/S的速率也高于普通芯片,使转换速率更快。
从而保证了触摸板在电源上的显示速度同步化程度更高,延迟更小,并且保证了他的高精度要求。
3电路与程序设计
3.1电路的设计
3.1.1系统总体框图
本系统主要有检测模块、放大模块、A/D转换模块、显示模块与电源模块等组成。
(图6)
3.1.2放大器的子系统框图与电路原理图
(图7)
经过3个10级放大电路的的放大,使放大电路最终达到1000倍。
(图8)
3.1.3显示子系统框图
(图9)
当单片机判断出手写绘图板所在的具体坐标与位置时,把信息传输给显示屏进行显示。
同时也可以对触摸屏经行控制,使他手写板进行模式控制、系统的开关、由于本次设计不太完整,还有利于以后程序的优化。
3.1.4电源子系统框图
H78055V稳压模块
(图10)
5V稳压源负责给单片机最小系统板供电系统
(LM3171.4V稳压模块)
1、4V稳压源负责给单片覆铜板供电
4测试方案与测试结果
4.1测试方案
由于铜板通电会发热,而且天气温度的变化对电势也有影响,所以不同的温度测出的数据差距不同。
我们采用是固定温度法进行坐标测量,当每移动0.5mm,记下输出的数据。
而当在不同的温度下,测量电路的电压与电流,从而计算出电路的最小功率。
4.2测试条件与仪器
在温差不大于1摄氏度的条件下进行多温度下的测量
精确到0.1摄氏度的温度计一个,
毫米刻度尺两个,进行坐标定位
四个半的万用表一个
4.3测试结果及分析
进由于在温度不大于5摄氏度的情况下,最小误差为0.15mm,最大误差不大于0.45mm,所以测出的值还是比较稳定符合规定的要求,而我们的电路理论上功耗小于1.5W,但实际现象中却不能达到,是由于选择的芯片LM317发热比较严重,带来的热量损耗严重。
当上电启动时,我可以把我们的启动界面显示为“欢迎使用手写绘图板,请等待5S钟”,经过5S钟,系统有稳定的电压与电流信号,总体而言系统比较稳定,测量的精度会更高更有利于我们使用手写绘图板。
5结语
由于本方案可行性较高,低电压驱动,负载电流低于1A,功率消耗较低,采用ARMContex-M0LPC1114低功耗、高速率、使坐标显示更精确、误差更低,并且可以触屏操纵,从而使系统更加人性化。
通过本次大赛,我们学习到很多东西,深刻体会到了理论指导实践,但实践才是检验真理的唯一标准。
附录1:
源程序
#include"includes.h"
intmain()
{
GUI_BUTTONbn[10];
GUI_WINDOWwnd;
Target_Init();
LPC_SYSCON->SYSAHBCLKCTRL|=(1<<16);
LPC_IOCON->R_PIO1_0&=~0x07;
LPC_IOCON->R_PIO1_0|=0x01;
LPC_IOCON->R_PIO1_1&=~0x07;
LPC_IOCON->R_PIO1_1|=0x01;
LPC_SYSCON->SYSAHBCLKCTRL&=~(1<<16);
LPC_SYSCON->SYSAHBCLKCTRL|=(1<<6);
LPC_GPIO1->DIR|=(1<<0)|(1<<1);
LPC_GPIO1->DATA|=(1<<0)|(1<<1);
start:
GUI_Clear(BLACK);
GUI_DrawLoading(10);
GUI_DrawLoading(5);
GUI_DrawLoading(8);
wnd=GUI_CreateWindow(0,0,239,319,BLUE,WHITE,ORANGE,LGRAY,"NX0301-B");
bn[4]=GUI_DrawWindow(wnd);
bn[0]=GUI_CreateButton(10,60,110,90,RED,GREEN,"低功耗",UP);
bn[1]=GUI_CreateButton(10,95,110,125,RED,GREEN,"当前功率",UP);
bn[2]=GUI_CreateButton(10,130,110,160,RED,GREEN,"当前系统",UP);
bn[3]=GUI_CreateButton(10,165,110,195,RED,GREEN,"位置坐标",UP);
GUI_DrawButton(bn[0]);
GUI_DrawButton(bn[1]);
GUI_DrawButton(bn[2]);
GUI_DrawButton(bn[3]);
while
(1)
{
switch(GUI_CheckButtonMsg(bn))
{
case-1:
break;
case0:
LPC_GPIO1->DATA&=~(1<<0);
break;
case1:
LPC_GPIO1->DATA|=(1<<0);
break;
case2:
LPC_GPIO1->DATA&=~(1<<1);
break;
case3:
LPC_GPIO1->DATA|=(1<<1);
bn[5]=GUI_DrawWindow(GUI_CreateWindow(120,200,230,315,RED,GREEN,YELLOW,PINK,"坐标:
"));
ADC_Init(CH0);
while
(1)
{
GUI_SetColor(BLACK,YELLOW);
GUI_ShowStr(130,233,"象限:
1");
GUI_ShowStr(130,248,"横坐标:
");
GUI_ShowNum(130,263,ADC_Read(CH0),4);
GUI_ShowStr(130,278,"纵坐标:
");
GUI_ShowNum(130,293,ADC_Read(CH0),4);
switch(GUI_CheckButtonMsg(bn));
}
break;
case4:
gotostart;
case5:
GUI_FillRect(120,200,230,310,ORANGE);
bn[5]=GUI_FreeButton();
break;
}
}
return0;}
#ifndef__GUI_LIB_H__
#define__GUI_LIB_H__
#include"lpc11xx.h"
#include"delay.h"
#include"math.h"
#include"string.h"
#include"ili9325.h"
#include"w25x16.h"
#include"xpt2046.h"
#defineBLUE0x001F//蓝色
#defineBLACK0x0000//黑色
#defineBRED0xF81F
#defineBROWN0xBC40//棕色
#defineBRRED0xFC07//棕红色
#defineCYAN0x7FFF
#defineDARKBLUE0x01CF//深灰蓝色
#defineDARKGRAY0x8410//深灰色
#defineGRAY0x8430//灰色
#defineGRAYBLUE0x5458//灰蓝色
#defineGRED0xFFE0
#defineGREEN0x07E0//绿色
#defineGBLUE0x07FF
#defineLBBLUE0x2B12//浅棕蓝色(选择条目的反色)
#defineLIGHTBLUE0x7D7C//浅蓝色
#defineLIGHTGREEN0x841F//浅绿色
#defineLGRAY0xC618//浅灰色
#defineLGRAYBLUE0xA651//浅灰蓝色(中间层颜色)
#defineMAGENTA0xF81F
#defineORANGE0xFC08//橙色
#definePINK0xF81F//粉红色
#definePORPO0x801F//紫色
#defineRED0xF800//红色
#defineWHITE0xFFFF//白色
#defineYELLOW0xFFE0//黄色
#defineUPTRUE//按钮状态,未按下
#defineDOWNFALSE//按钮状态,已按下
#defineONTRUE//开显示
#defineOFFFALSE//关显示
#defineOPENTRUE//窗口打开状态
#defineCLOSEFALSE//窗口关闭窗口
#defineMAX_CHECK_BUTTON_NUM20//最大扫描按钮的个数(1~127个,0禁止发送消息)
typedefstruct
{
uint8xstart;
uint16ystart;
uint8xend;
uint16yend;
uint16textcolor;
uint16buttoncolor;
uint8*text;
uint8status;
}GUI_BUTTON;
typedefstruct
{
uint8xstart;
uint16ystart;
uint8xend;
uint16yend;
uint16titlecolor;
uint16titletextcolor;
uint16textcolor;
uint16bordercolor;
uint8*title;
GUI_BUTTONbn;
}GUI_WINDOW;
externvoidGUI_Init(void);//初始化液晶显示器
externvoidGUI_DisplayOn(void);//开显存
externvoidGUI_DisplayOff(void);//关显存
externvoidGUI_Display(uint8f);
externvoidGUI_XYRAM(uint8xstart,uint16ystart,uint8xend,uint16yend);
externvoidGUI_SetC(uint8x,uint16y);
externvoidGUI_Clear(uint16color);//整屏显示
externvoidGUI_SetPointColor(uint16point);//设置前景颜色
externvoidGUI_SetBackColor(uint16back);//设置后景颜色
externvoidGUI_SetColor(uint16point,uint16back);//设置前后景颜色
externvoidGUI_DrawPoint(uint8x,uint16y);//在屏上画一个像素的点
externuint16GUI_ReadPointColor(uint8x,uint16y);//读屏上某一点的颜色
externvoidGUI_DrawLine(uint8x1,uint16y1,uint8x2,uint16y2);//画一条直线
externvoidGUI_DrawRect(uint8xstart,uint16ystart,uint8xend,uint16yend,uint16color);//画矩形
externvoidGUI_FillRect(uint8xstart,uint16ystart,uint8xend,uint16yend,uint16color);//画带填充的矩形
externvoidGUI_DrawCircle(uint8x0,uint16y0,uint8r);//画一个圆
externvoidGUI_ShowNum(uint8x,uint16y,uint32num,uint8len);//显示数字
externvoidGUI_ShowChar(uint8x,uint16y,uint8num);//显示一个ascii码为0~94的字符
externvoidGUI_ShowHz(uint8x,uint16y,uint8*hz);//显示一个GBK汉字
externvoidGUI_ShowStr(uint8x,uint16y,uint8*p);//显示字符串(英文和中文都可以)
externvoidGUI_Draw5Point(uint8x,uint16y,uint16color);//画5个像素直径的圆点
externvoidGUI_Draw9Point(uint8x,uint16y,uint16color);//画9个像素直径的圆点
externGUI_BUTTONGUI_CreateButton(uint8xstart,uint16yst