野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9134|回复: 0

采集ADC数据跳变,有时ADC数据与当前位置差距很大,求解惑

[复制链接]
发表于 2022-2-16 17:13:02 | 显示全部楼层 |阅读模式
就是在使用XPT2046,其ADC数据突然跳变,获取到的ADC数据不对该怎么解决?读ADC数据的函数:
  1. /***********************************
  2. *函数名称:XPT2046_Rread_adc
  3. *函数功能:XPT2046读adc数据
  4. *输入:uint8_t cmd
  5. *输出:uint16_t temp
  6. ************************************/
  7. uint16_t XPT2046_Rread_adc(uint8_t cmd)
  8. {
  9.         uint16_t temp;
  10.        
  11. XPT2046_SPI_CS_LOW();
  12.        
  13.         XPT2046_Write_Bite(cmd);
  14.        
  15.         temp=XPT2046_Rread_CMD();
  16.        
  17. XPT2046_SPI_CS_HIGH();
  18.        
  19.         return temp;
  20. }
复制代码
将ADC数据转换为坐标:

  1. /***********************************
  2. *函数名称:XPT2046_Original_COORD
  3. *函数功能:XPT20462.8寸屏读触摸位置
  4. *输入:
  5. *输出:COORD coordinate
  6. ************************************/
  7. COORD XPT2046_Original_COORD(void)
  8. {
  9. COORD coordinate;
  10. uint16_t adc_x,adc_y,i;
  11. uint16_t sum_x=0,sum_y=0;
  12. uint16_t ave_x,ave_y;
  13. for(i=0;i<CHECK;i++)       
  14.         {

  15.                 /************************/
  16.                 //求x,y方向上的adc数据
  17.         adc_x=XPT2046_Rread_adc(XPT2046_CHANEL_X);
  18.         adc_y=XPT2046_Rread_adc(XPT2046_CHANEL_Y);
  19.        
  20.                 sum_x+=adc_x;
  21.             sum_y+=adc_y;
  22.         }
  23.         ave_x=sum_x/CHECK;
  24.         ave_y=sum_y/CHECK;
  25. if(XPT2046_SPI_INT()==PRESS)
  26. printf("adc_x:%d adc_y:%d\n",ave_x,ave_y);//测试,输出的ADC数据
  27.        
  28. coordinate.x=ave_x*X_LENGTH/ADC_MAX;
  29. coordinate.y=Y_LENGTH-ave_y*Y_LENGTH/ADC_MAX;
  30.        
  31.         return coordinate;
  32. }
复制代码
检测是否有触摸:
  1. /***********************************
  2. *函数名称:Check_Press
  3. *函数功能:检测是否按下
  4. *输入:uint16_t lx 检测范围左上角x坐标
  5.        uint16_t ly 检测范围左上角y坐标
  6.        uint16_t rx 检测范围右下角x坐标
  7.        uint16_t ry 检测范围右下角y坐标
  8. *输出:PRESS/UNPRESS
  9. ************************************/
  10. uint16_t Check_Press(uint16_t lx,uint16_t ly,uint16_t rx,uint16_t ry)
  11. {
  12. COORD coordinate={0,0};
  13.         coordinate=XPT2046_REALLY_COORD();
  14. if(XPT2046_SPI_INT()==PRESS)
  15. printf("x:%d y:%d\n",coordinate.x,coordinate.y);//测试,输出的真实坐标

  16. if((coordinate.x>lx)&&(coordinate.x<rx)&&(coordinate.y>ly)&&(coordinate.y<ry))
  17. {

  18.         return PRESS;
  19. }
  20. return UNPRESS;
  21.                

  22. }
复制代码
这是串口测试结果:

这是串口测试结果

这是串口测试结果

本来adc_x,与adc_y一次只能输出检测位置只能输出一次,但却输出了两次,且差距较大。求解惑!
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 04:59 , Processed in 0.041336 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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