pcb定位系统技术报告 电子设计大赛模拟题.docx
《pcb定位系统技术报告 电子设计大赛模拟题.docx》由会员分享,可在线阅读,更多相关《pcb定位系统技术报告 电子设计大赛模拟题.docx(18页珍藏版)》请在冰点文库上搜索。
pcb定位系统技术报告电子设计大赛模拟题
全国大学生电子设计竞赛模拟题
PCB坐标定位系统
PCB板坐标定位系统
任务:
在一个10cm(长)×6cm(宽)的PCB覆铜板上,制作一个PCB坐标定位系统,要求如下:
基本要求:
1、当用信号笔点击PCB板平面上的任何位置,可以在LCD上的相应位置显示坐标点;
2、当用信号笔在PCB板平面上绘制简单图形时,能够在LCD上显示所绘制的图形;
3、要求坐标识别精度<=2mm,并尽可能的提高系统分辨率。
提高要求:
1、提高绘制速度,实现即绘制即显示,减小延迟;
2、能够实现图形存储,回放功能。
摘要
本系统以飞思卡尔半导体公司的16位MC9S12XS128单片机为核心,采用数字式CMOS图像传感器OV7620进行数据采集,设计并制作了一个分辨率为64×32的PCB坐标定位系统。
该定位系统可以快速实现坐标显示,图形绘制,图形存储及回放。
将10×6cm的PCB板相对应的像素点显示在龙丘生产的Oled12864迷你型液晶上,并且具有高分辨率。
并且通过按键可以实现不同功能之间的切换。
通过单片机的控制实现各种显示存储功能.
关键词:
MC9S12XS128OV7620PCBOled12864
目录
第一章系统方案比较与选择3
1.1总实现方案3
1.2主控制器方案比较与选择3
1.3液晶模块的选取3
第二章理论分析与计算3
2.1画线算法设计3
2.2画圆算法设计3
2.3描点.划线.简单图形算法设计3
第三章系统电路设计3
3.1系统主板工作原理3
第四章系统程序设计3
4.1系统总流程图3
4.2系统总体模块图3
第五章系统测试与结果3
5.1描点,坐标确定,划线,画圆,图形存储与回放的测试和结果3
5.2表笔的测试结果3
第六章结论3
参考文献3
附1:
系统主板原理图3
附2:
完整的测试结果3
附3:
部分核心源代码3
第一章系统方案比较与选择
1.1总实现方案
方案一:
采用电阻屏的原理,电阻式触摸屏是一种压力传感器,基本上是薄膜加上玻璃的结构,薄膜和玻璃相邻的一面上均涂有ITO(纳米铟锡金属氧化物)涂层,ITO具有很好的导电性和透明性。
当触摸操作时,薄膜下层的ITO会接触到玻璃上层的ITO,经由感应器传出相应的电信号,经过转换电路送到处理器,通过运算转化为屏幕上的X、Y值,而完成点选的动作,并呈现在屏幕上。
考虑电容屏原理,在10×6cm的PCB板做到识别精度<=2mm,我们目标精度是在板上做到64×32个像素点的精度,采用板上层64列,下层32行,组成64×32阵列!
分别扫描行和列以确定坐标点。
然后通过显示在Oled12864型液晶上,做到高精度的显示。
方案二:
采用电容屏的原理,电容技术触摸屏CTP(CapacityTouchPanel)是利用人体的电流感应进行工作的。
电容屏是一块四层复合玻璃屏,玻璃屏的内表面和夹层各涂一层ITO(纳米铟锡金属氧化物),最外层是只有0.0015mm厚的矽土玻璃保护层,夹层ITO涂层作工作面,四个角引出四个电极,内层ITO为屏层以保证工作环境。
当用户触摸电容屏时,由于人体电场,用户手指和工作面形成一个耦合电容,因为工作面上接有高频信号,于是手指吸收走一个很小的电流,这个电流分别从屏的四个角上的电极中流出,且理论上流经四个电极的电流与手指头到四角的距离成比例,控制器通过对四个电流比例的精密计算,得出位置。
可以达到99%的精确度,具备小于3ms的响应速度。
通过电流大小与触点到电极的距离成正比就可以确定触点的坐标。
确定坐标后就可以通过液晶来进行显示。
方案三:
采用OV7620是CMOS彩色/黑白图像传感器。
它支持连续和隔行两种扫描方式,VGA与QVGA两种图像格式;最高像素为664492,帧速率为30fp8;能够满足一般图像采集系统的要求。
利用OV7620摄像头采集图像数据并对其进行二值化,分离出图像信号将10×6cm的PCB板二值化为白,在其周围贴上黑色胶带并通过程序处理二值化为黑。
然后用黑色的表笔靠近PCB板时形成黑白信号,即可设为高低电平。
然后通过行列扫描就可以确定PCB板上的坐标XY并通过液晶对其进行显示。
通过对三个方案的对比选择,方案一由于要做到64×32个那就要最少考虑到2048个点就要2048个电阻器件,将如此数量器件焊接在10×6cm的PCB板上将是极大焊接工程,考虑到时间的限制,及人工焊接的不稳定性,放弃此方案。
在方案二中测量及数据采集要求极高,在比赛中条件限制。
因此最后我们采用了方案三。
1.2主控制器方案比较与选择
为了完成在短时间快速扫描全屏和存储图形,主控器件必须有较高的CPU工作频率和存储空间。
方案一:
采用51系列加强型STC12C5A60S2作为主控器件,用来实现题目所要求的各种功能。
此方案最大的特点是系统规模可以做得很小,成本较低。
操作控制简单。
但是,我们在利用单片机处理高速信号快速扫描及存储图形时显得吃力,且题目中要求要求坐标识别精度<=2mm,并尽可能的提高系统分辨率,并要做到图形的存储与回放,51系列单片机很难实现这一要求。
方案二:
采用飞思卡尔半导体公司16位MC9S12XS128单片机为核心控制器件,由16位中央处理单元(CPU12X)、128KB程序Flash(P-lash)、8KB RAM、8KB数据Flash(D-lash)组成片内存储器,指令系统与S12兼容CPU工作频率最高可达80MHz,16通道高达12位精度A/D采集模块,7级中断嵌套和7个中断优先级,CRG模块,COP看门狗,实时中断及时钟监视器。
如此能够实现快速扫描和数据处理!
按照题目的要求,综合考虑我们最终选择了方案二,采用16位MC9S12XS128单片机为核心控制器件。
1.3液晶模块的选取
方案一:
采用1602液晶模块程序简单,成本较低,但是局限于其无法对汉字进行显示,及显示的点阵像素有限,并且题目要求功能较多,存在多个功能间的切换,图形的绘制,为了满足各功能间的切换及操作的简单就需要文字性的说明,而1602就无法满足这点
方案二:
采用Oled12864液晶模块,OLED12864是128×64行点阵的OLED单色、字符、图形显示模块。
模块内藏64×64的显示数据RAM,其中的每位数据都对应于OLED屏上一个点的亮、暗状态;其接口电路和操作指令简单,具有8位并行数据接口,读写时序适配6800系列时序强大的显示功能,可以满足题目的所有要求。
综合考虑之后我们决定采用12864液晶模块做为显示模块
第二章理论分析与计算
2.1画线算法设计
通过对摄像头信号的分离,二值化,并对整屏进行行列扫描得到了点的坐标值,而划线要求刚好需要点的坐标。
大家都知道,两点确定一条直线。
高中数学中,我们就知道直线方程有点斜式,截距式,两点式。
用其中任意一个公式我们都能得到一个正确的直线方程。
设计中,先点亮一个点再点亮另外一个点来确定直线,这正好满足两点式的要求。
算法中首先通过起点坐标(X1,Y1)和终点坐标(X2,Y2)来确定线段的方程,然后比较X2-X1与Y2-Y1的大小,若X2-X1>Y2-Y1,则通过X1+1,X1+2…X1+n来确定对应Y的坐标,直到X1+n=Y为止,同理若X2-X1,这样我们就得到了起点到终点的所有坐标,再将对应的坐标全部显示出来就实现了两点画线功能。
2.2画圆算法设计
有了两点画线算法,那么两点画圆算法也就简单了,首先通过前后画的2点坐标求出2点的距离,也就是圆的半径R,而我们都知道圆的方程为X*X+Y*Y=R*R,这样一来我们就确定了圆的方程式,然后比较X2-X1与Y2-Y1的大小,若X2-X1>Y2-Y1,则通过X1+1,X1+2…X1+n来确定对应Y的坐标,直到X1+n=Y为止,同理若X2-X1如果我们将对应的坐标直接显示时会忽略一个问题,那就是对应坐标的点是否超过了点阵屏幕的范围,因此在显示时我们要进行判断,若超出了范围那么对应的点也就不显示。
这样我们就得到了起点到终点的所有有效坐标,再将对应的坐标全部显示出来就实现了两点画圆功能。
2.3描点.划线.简单图形算法设计
通过信号的采集,二值化,确定表笔笔尖为接触点并并通过扫描确定其在PCB板上XY的坐标位置。
通过对点的保持,笔尖滑动就可以确定其他点从而由点连成线。
同理,其他图形的算法原理一样。
第三章系统电路设计
3.1系统主板工作原理
系统主板主要由5V电源模块,3.3V电源模块,按键部分,液晶显示模块,蜂鸣器模块,以及以飞思卡尔半导体公司16位MC9S12XS128单片机为核心控制模块。
5V电源模块:
此设计采用7.2V电池供电,通过稳压芯片LM2940一脚输入三脚输出将7.2V输入转变为5V输出,来给单片机供电。
3.3V电源模块:
3.3V电源输出是由AM1117稳压芯片三脚输入5V二脚输出来进行转换
按键模块:
本系统板中设计了四个按键,通过按键来对不同功能来进行切换演示。
液晶模块:
液晶模块采用龙丘生产的Oled12864液晶来显示,Oled12864液晶具有功能强大,连接简单等优势。
蜂鸣器模块:
蜂鸣器模块主要是用来作为指示作用,当表笔接触到PCB板时蜂鸣器发出接触警报,
图3-1系统主板工作原理图
第四章系统程序设计
4.1系统总流程图
4.2系统总体模块图
第五章系统测试与结果
5.1描点,坐标确定,划线,画圆,图形存储与回放的测试和结果
各模块均调通,将调好的模块连在一起,打开电源,启动进行系统初始化。
按键进入描点模式,用表笔在PCB板上书写,可以看到接触的点点亮,并在OLED12864液晶上显示亮点的精确坐标。
按下按键,进行划线的测试,将表笔在PCB板上任意确定起点滑动在液晶上将显示表笔划过的轨迹,划线测试成功。
按下按键进入画圆功能,通过功能切换很好的实现了画圆的高阶功能!
按键切换进入图形绘制与存储的功能,在PCB上画任意图形,在液晶上显示相应图形断电后再次进入之前图形被保持。
因此实现了功能的存储与回放。
最后经过反复的测试,所有的功能都能很好的实现,系统正常工作。
5.2表笔的测试结果
因为是采用分离摄像头的黑白信号来进行坐标的确定,因此我们选择了黑色表笔,并从黑色表笔笔尖引出导线,链接到128单片机的PB2口,上拉接高电平,并且将PCB铜板接地,如此当表笔接触到铜板时给单片机发送信号,确认进行扫描。
这样就将黑色表笔刚靠近PCB板时的干扰完美去除。
第六章结论
本作品完成了题目的基本要求和发挥部分的全部要求,系统性能良好。
通过对作品的各项进行优化,使系统的性能有了提高。
飞思卡尔半导体公司的16位MC9S12XS128单片机拥有强大的数据处理能力和理想的运行速度,并且使电路简单。
同时也提高了系统的集成度和可靠性。
参考文献
《电子设计制作基础》,王港元,江西科学技术出版社,2011年;
《模拟技术基础》,康华光,高等教育出版社,1998年;
《数字电子技术基础》,阎石著,高等教育出版社,1997年;
《高频电子线路》,张肃文,高等教育出版社,2009;
《嵌入式系统设计实践》,王宜怀,曹金华,北京航空航天大学出版社;2011年;
《电子设计与制版》,赵景波,徐江伟,人民邮电出版社,2009年;
附录
附1:
系统主板原理图
附2:
完整的测试结果
附2—1画圆实物图
附2—2划线实物图
附3:
部分核心源代码
#include/*commondefinesandmacros*/
#include"derivative.h"/*derivative-specificdefinitions*/
#include
#include"LQ12864.h"
#include"displaydata.h"
#include"moduleinit.h"
#include"ledfuncdis.h"
#include"key.h"
#include"DP_Flash.h"
#definerow_start20
#definerow_max40
#defineline_max72
#defineinterval5
#definepenPORTB_PB4
uintArr[4]={0x5555,0x2222,0x3333,0x4444};
uintArr0[4];
ulongaddress=0x007E0000;
uintaddr=0x0000;
byterow_image;
byterow_count,c_flag=0,h_flag=0,cc=0,g_SampleMFlag=0;
byteimage_data[row_max][line_max];
byteY_XLen[row_max][2];
byteX_YLen[line_max][2];
byteX_YDis[2][5]=
{
{"X:
55"},
{"Y:
55"}
};
byteshu[]={"0123456789"};
byteg_Orig=0;//起点原点左标是否以确定
voidLED_ON()
{
DDRE=0x40;
PORTE=0x00;
}
voidLED_OFF()
{
DDRE=0x20;
PORTE=0x00;
}
voidImageDeal();
voidDisUpdataData();
voidLedDis(ucharkeypos);
voiddelay_s(ucharx)
{
unsignedinti,j,z;
for(i=0;i<5000;i++)
for(j=0;j<1000;j++)
for(z=x;z>0;z--)
asmnop;
}
voiddelay(intz){
intx,y;
for(x=10000;x>0;x--)
for(y=z;y>0;y--);
}
voidGetImage()
{
cc++;
while(h_flag!
=1);
if(0==pen){
ImageDeal();
DisUpdataData();
LedDisDataBase();
}
h_flag=0;
}
voiddelay1(unsignedintz)
{
while(z--)
asmnop;
}
voidmain(void){
/*putyourowncodehere*/
unsignedchariii,jjj;
DisableInterrupts;
init_SCI();
init_PLL();
Flash_Init();
delay_s
(2);
Time_Init();
delay(10);
TIE=0x00;
EnableInterrupts;
delay(100);
DDR1AD0=0xaa;
ATD0DIENL=0xff;
DDRB=0x00;
DDRA=0x00;//cameraGPIOINIT
LCD_Init();
DisDataInit(0xff);
//LinePrintf(0,TitleDis,1);
LedDis(0);
delay_s
(2);
TIE=0x05;
GetImage();
for(iii=0;iiifor(jjj=0;jjjimage_data[iii][jjj]=255;
for(;;){
//TIE=0x05;
GetImage();
while(c_flag==1);
//TIE=0x00;
c_flag=1;
TIE=0x01;
if(0==key_flag)
{
ScanKey();
LedDis(keypos);
}
}
}
voidImageDeal()
{
uchari,j,temp;
for(j=1;jfor(i=2;i{
if(255==image_data[j][i])
{
for(i;i{
if((0==image_data[j][i])&&(0==image_data[j][i+1]))
{
temp=i;
for(i;iif((255==image_data[j][i])&&(255==image_data[j][i+1])){
CurrentPoint.x=temp;
CurrentPoint.y=j;
X_YDis[0][2]=shu[CurrentPoint.x/10];
X_YDis[0][3]=shu[CurrentPoint.x%10];
X_YDis[1][2]=shu[CurrentPoint.y/10];
X_YDis[1][3]=shu[CurrentPoint.y%10];
return;
}
}
}
}
}
}
}
}
voidLedDis(ucharkeypos)
{
if(0==keypos)
{
LinePrintf(0,funsdis1,1);
LinePrintf(2,funsdis2,1);
LinePrintf(4,funsdis3,1);
LinePrintf(6,funsdis4,1);
}
if(1==keypos)
{
LinePrintf(0,funsdis2,1);
LinePrintf(2,funsdis3,1);
LinePrintf(4,funsdis4,1);
LinePrintf(6,funsdis5,1);
}
else
{
LinePrintf(0,funsdis3,1);
LinePrintf(2,funsdis4,1);
LinePrintf(4,funsdis5,1);
LinePrintf(6,funsdis6,1);}