OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4219|回复: 12

XPT2046 5.0" 校準不正確

[复制链接]

11

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
537
金钱
537
注册时间
2012-5-25
在线时间
44 小时
发表于 2014-2-26 16:27:16 | 显示全部楼层 |阅读模式
各位板大,小弟有一個問題,小弟用原子哥的觸控屏去修改成5" 480x272.
    但校準完,Y軸就是272還算可以,X軸兩測算還可接受,但中間就誤差很大,
         請教各位板大,是X軸的換算式會隨屏慕變大而要修改嗎?
            不然問題可能出在那?可否請各位板大不吝賜教嗎?
                  謝謝!!

//觸摸屏校準代碼

//得到四個校準參數
void Touch_Adjust(void)
{
signed short pos_temp[4][2];//坐標緩存值
u8 cnt=0;
u16 d1,d2;
u32 tem1,tem2;
float fac;     
cnt=0;
POINT_COLOR=BLUE;
BACK_COLOR =WHITE;
LCD_Clear(WHITE);//清屏   
POINT_COLOR=RED;//紅色 
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,20);//畫點1 
Pen_Point.Key_Sta=Key_Up;//消除觸發信號 
Pen_Point.xfac=0;//xfac用來標記是否校準過,所以校準之前必須清掉!以免錯誤  
while(1)
{
     // Pen_Int_Set(0);//關閉中斷 
if(Pen_Point.Key_Sta==Key_Down)//按鍵按下了
{
if(Read_TP_Once())//得到單次按鍵值
{      
pos_temp[cnt][0]=Pen_Point.X;
pos_temp[cnt][1]=Pen_Point.Y;
cnt++;
}
    LCD_Num(150,20,cnt,2,WHITE,BLUE);
    LCD_Num(50,70,Pen_Point.X,4,WHITE,BLUE);
  LCD_Num(50,100,Pen_Point.Y,4,WHITE,BLUE);
switch(cnt)
{
case 1:
// LCD_Clear(WHITE);//清屏  
Drow_Touch_Point(460,20);//畫點2
        en_Int_Set(0);//關閉中斷
        en_Point.Key_Sta=Key_Up;
        delay_ms(500);
        en_Int_Set(1);//開啟中斷
break;
case 2:
// LCD_Clear(WHITE);//清屏  
Drow_Touch_Point(20,252);//畫點3
        en_Int_Set(0);//關閉中斷
        en_Point.Key_Sta=Key_Up;
        delay_ms(500);
        en_Int_Set(1);//開啟中斷
break;
case 3:
// LCD_Clear(WHITE);//清屏  
Drow_Touch_Point(460,252);//畫點4
        en_Int_Set(0);//關閉中斷
        en_Point.Key_Sta=Key_Up;
        delay_ms(500);
        en_Int_Set(1);//開啟中斷
break;
case 4: //全部四個點已經得到 
         //對邊相等
tem1=abs(pos_temp[0][0]-pos_temp[1][0]);//x1-x2
tem2=abs(pos_temp[0][1]-pos_temp[1][1]);//y1-y2
tem1*=tem1;
tem2*=tem2;
d1=sqrt(tem1+tem2);//得到1,2的距離
tem1=abs(pos_temp[2][0]-pos_temp[3][0]);//x3-x4
tem2=abs(pos_temp[2][1]-pos_temp[3][1]);//y3-y4
tem1*=tem1;
tem2*=tem2;
d2=sqrt(tem1+tem2);//得到3,4的距離
          fac=(float)d1/d2;
if( fac<(float)0.90 || fac>(float)1.00 )//不合格
{
cnt=0;
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,20);
ADJ_INFO_SHOW("hor fac is:"); 
LCD_Num(80,35,pos_temp[0][0],4,WHITE,BLUE);  //顯示數值   
LCD_Num(80+160,35,pos_temp[0][1],4,WHITE,BLUE); //顯示數值
LCD_Num(80,55,pos_temp[1][0],4,WHITE,BLUE);  //顯示數值   
LCD_Num(80+160,55,pos_temp[1][1],4,WHITE,BLUE); //顯示數值 
LCD_Num(80,75,pos_temp[2][0],4,WHITE,BLUE);  //顯示數值   
LCD_Num(80+160,75,pos_temp[2][1],4,WHITE,BLUE); //顯示數值
LCD_Num(80,95,pos_temp[3][0],4,WHITE,BLUE); //顯示數值
LCD_Num(80+160,95,pos_temp[3][1],4,WHITE,BLUE); //顯示數值 
//擴大100倍顯示
LCD_Num(220,120,fac*100,3,WHITE,BLUE); //顯示數值,該數值必須在95~105範圍之內.
          en_Int_Set(0);//關閉中斷
          Pen_Point.Key_Sta=Key_Up;
          delay_ms(500);
          Pen_Int_Set(1);//開啟中斷
continue;
}
tem1=abs(pos_temp[0][0]-pos_temp[2][0]);//x1-x3
tem2=abs(pos_temp[0][1]-pos_temp[2][1]);//y1-y3
tem1*=tem1;
tem2*=tem2;
d1=sqrt(tem1+tem2);//得到1,3的距離
tem1=abs(pos_temp[1][0]-pos_temp[3][0]);//x2-x4
tem2=abs(pos_temp[1][1]-pos_temp[3][1]);//y2-y4
tem1*=tem1;
tem2*=tem2;
d2=sqrt(tem1+tem2);//得到2,4的距離
fac=(float)d1/d2;
if(fac<(float)0.90||fac>(float)1.00)//不合格
{
cnt=0;
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,20);
ADJ_INFO_SHOW("hor fac is:");   
LCD_Num(80,35,pos_temp[0][0],4,WHITE,BLUE);  //顯示數值   
LCD_Num(80+160,35,pos_temp[0][1],4,WHITE,BLUE); //顯示數值
LCD_Num(80,55,pos_temp[1][0],4,WHITE,BLUE);  //顯示數值   
LCD_Num(80+160,55,pos_temp[1][1],4,WHITE,BLUE); //顯示數值 
LCD_Num(80,75,pos_temp[2][0],4,WHITE,BLUE);  //顯示數值   
LCD_Num(80+160,75,pos_temp[2][1],4,WHITE,BLUE); //顯示數值
LCD_Num(80,95,pos_temp[3][0],4,WHITE,BLUE); //顯示數值
LCD_Num(80+160,95,pos_temp[3][1],4,WHITE,BLUE); //顯示數值 
//擴大100倍顯示
LCD_Num(220,120,fac*100,3,WHITE,BLUE); //顯示數值,該數值必須在95~105範圍之內.
          Pen_Int_Set(0);//關閉中斷
          Pen_Point.Key_Sta=Key_Up;
          delay_ms(500);
          Pen_Int_Set(1);//開啟中斷
  continue;
}//正確了
   
//對角線相等
tem1=abs(pos_temp[1][0]-pos_temp[2][0]);//x1-x3
tem2=abs(pos_temp[1][1]-pos_temp[2][1]);//y1-y3
tem1*=tem1;
tem2*=tem2;
d1=sqrt(tem1+tem2);//得到1,4的距離
tem1=abs(pos_temp[0][0]-pos_temp[3][0]);//x2-x4
tem2=abs(pos_temp[0][1]-pos_temp[3][1]);//y2-y4
tem1*=tem1;
tem2*=tem2;
d2=sqrt(tem1+tem2);//得到2,3的距離
fac=(float)d1/d2;
if(fac<(float)0.90||fac>(float)1.00)//不合格
{
cnt=0;
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,20);
          Pen_Point.Key_Sta=Key_Up;
ADJ_INFO_SHOW("dia fac is:");   
LCD_Num(80,35,pos_temp[0][0],4,WHITE,BLUE);  //顯示數值   
LCD_Num(80+160,35,pos_temp[0][1],4,WHITE,BLUE); //顯示數值
LCD_Num(80,55,pos_temp[1][0],4,WHITE,BLUE);  //顯示數值   
LCD_Num(80+160,55,pos_temp[1][1],4,WHITE,BLUE); //顯示數值 
LCD_Num(80,75,pos_temp[2][0],4,WHITE,BLUE);  //顯示數值   
LCD_Num(80+160,75,pos_temp[2][1],4,WHITE,BLUE); //顯示數值
LCD_Num(80,95,pos_temp[3][0],4,WHITE,BLUE); //顯示數值
LCD_Num(80+160,95,pos_temp[3][1],4,WHITE,BLUE); //顯示數值 
//擴大100倍顯示
LCD_Num(220,120,fac*100,3,WHITE,BLUE); //顯示數值,該數值必須在95~105範圍之內.
continue;
}//正確了
//計算結果
Pen_Point.xfac=(float)440/(pos_temp[1][0]-pos_temp[0][0]);//得到xfac  
Pen_Point.xoff=(480-Pen_Point.xfac*(pos_temp[1][0]+pos_temp[0][0]))/2;//得到xoff
  
Pen_Point.yfac=(float)232/(pos_temp[2][1]-pos_temp[0][1]);//得到yfac
Pen_Point.yoff=(272-Pen_Point.yfac*(pos_temp[2][1]+pos_temp[0][1]))/2;//得到yoff  

      LCD_Num(50,140,????Pen_Point.xfac*100000,6,WHITE,BLUE);
    LCD_Num(50,180,Pen_Point.xoff,6,WHITE,BLUE);
      LCD_Num(50,210,Pen_Point.yfac*100000,6,WHITE,BLUE);
    LCD_Num(50,240,Pen_Point.yoff,6,WHITE,BLUE);
if(abs(Pen_Point.xfac)>2||abs(Pen_Point.yfac)>2)//觸屏和預設的相反了.
{
cnt=0;
LCD_Clear(WHITE);//清屏 
Drow_Touch_Point(20,20);
    // LCD_Num(150,50,abs(Pen_Point.xfac),4,WHITE,BLUE);
   // LCD_Num(150,80,abs(Pen_Point.yfac),4,WHITE,BLUE);
          LCD_String(35,110,"TP Need readjust!",GREEN,WHITE);
Pen_Point.touchtype=!Pen_Point.touchtype;//修改觸屏類型.
if(Pen_Point.touchtype)//X,Y方向與屏幕相反
{
CMD_RDX=0X90;
CMD_RDY=0XD0;  
}else   //X,Y方向與屏幕相同   
{
CMD_RDX=0XD0;
CMD_RDY=0X90;  
}
delay_ms(500);
          Pen_Int_Set(0);//關閉中斷
          Pen_Point.Key_Sta=Key_Up;
          delay_ms(500);
          Pen_Int_Set(1);//開啟中斷
continue;
}
POINT_COLOR=BLUE;
// LCD_Clear(WHITE);//清屏 
        LCD_String(35,110,"Touch Screen Adjust OK!",GREEN,WHITE);//校正完成
delay_ms(500);
LCD_Clear(WHITE);//清屏   
return;//校正完成  
// break; 
}
    }
  }
}
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
537
金钱
537
注册时间
2012-5-25
在线时间
44 小时
 楼主| 发表于 2014-2-28 18:24:25 | 显示全部楼层
所以沒人知道原因了喔!好吧再自己努力看看了喔!謝謝各位版大
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-2-28 21:43:00 | 显示全部楼层
有可能是你这个电阻屏质量不行。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
537
金钱
537
注册时间
2012-5-25
在线时间
44 小时
 楼主| 发表于 2014-3-1 00:28:25 | 显示全部楼层
謝謝原子哥,我換過兩三個屏,結果都一樣,請問原子哥除了這問題,還有甚麼需注意呢?非常謝謝原子哥回答.
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-1 14:35:18 | 显示全部楼层
回复【4楼】frank504:
---------------------------------
你可以直接输出XPT2046读取到的物理坐标值,看看变化是不是线性的?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
537
金钱
537
注册时间
2012-5-25
在线时间
44 小时
 楼主| 发表于 2014-3-1 20:38:34 | 显示全部楼层
恩,如果不是呈線性,那就要自己看怎樣變化了喔,對嗎
回复 支持 反对

使用道具 举报

11

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
537
金钱
537
注册时间
2012-5-25
在线时间
44 小时
 楼主| 发表于 2014-3-3 10:18:26 | 显示全部楼层
這應該要五點定位,好像不能線性,不知原子哥有沒有五點定位的範例.謝謝!!
回复 支持 反对

使用道具 举报

93

主题

746

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2012-9-16
在线时间
286 小时
发表于 2014-3-3 11:04:42 | 显示全部楼层
回复【7楼】frank504:
---------------------------------
好奇的问一下,你的怎么是繁体字呢?
纵浪大化中,不喜亦不惧;应尽便须尽,无复独多虑!
回复 支持 反对

使用道具 举报

11

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
537
金钱
537
注册时间
2012-5-25
在线时间
44 小时
 楼主| 发表于 2014-3-3 11:55:11 | 显示全部楼层
小弟我是來自台灣,所以學的是繁體,謝謝各位的指教.
    這觸屏讀到X軸開頭值為150左右,尾端3100,但中間值為1300所以應該要五點調校才可以,
          換屏都差不多,如果原子哥沒有五點調校,小弟只有自己加油,謝謝各位大哥幫忙!!
回复 支持 反对

使用道具 举报

11

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
537
金钱
537
注册时间
2012-5-25
在线时间
44 小时
 楼主| 发表于 2014-3-3 20:37:09 | 显示全部楼层
解決這問題,又出現問題,原子哥有遇到讀初都沒有處理的植0x780就直接跳到0x800,其餘都正常,不知哪出問題DOUT有pull high 10K歐姆,接腳從PC2改PC15,結果都一樣,/PENIRQ都有pull low訊號,就是此段會沒值.各位版大有遇到過嗎?謝謝
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-3 20:46:38 | 显示全部楼层
回复【9楼】frank504:
---------------------------------
那你找下5点校准的代码,应该网上有的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

65

帖子

0

精华

高级会员

Rank: 4

积分
537
金钱
537
注册时间
2012-5-25
在线时间
44 小时
 楼主| 发表于 2014-3-4 11:41:55 | 显示全部楼层
感謝原子哥,問題解決了,小弟按照XPT2046 Spec上,Sensor都加一顆0.1uf電容,小弟後來把它拿掉能線性了!
     值在一區間會讀錯誤則是因為STM32F407速度較快,導致觸發偏移所以讀不到資料,
              加delay就解決了,非常謝謝原子哥幫忙!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-3-4 17:05:50 | 显示全部楼层
回复【12楼】frank504:
---------------------------------
哦,恭喜
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 13:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表