0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于XPT2046芯片的电位器AD转换装置设计

CHANBAEK 来源:博客园-立冬以东 作者:博客园-立冬以东 2023-02-15 13:52 次阅读

XPT2046是一款四线制电阻触摸屏控制芯片,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器,支持从1.5V到5.25V的低电压I/O接口

所谓逐步逼近型,就是输入一个模拟量,其与1000 0000 0000 对应的模拟量进行比较,大则高位取1,小则高位取0。 这种思想相当于折半查询,所以可以依次从高位到低位确定所有值,以此来确定模拟量对应的数字量。

我们该如何去用这个芯片,来完成将一个模拟量转换成数字量呢?

初学者确实有很大的困难,我们需要学会怎么去看它的芯片手册。

上图是它的一个封装图,是不是看得很乱?

别急,这时候还要看看它每个管脚的功能描述

如下图

这时候,我们可以大致了解这是一个串行输入输出的芯片。

串行数据输出是DOUT(16管脚),也就是我们最终的数字量。

串行数据输入是DIN(2管脚),你会想,我们不是输入的是模拟量,怎么会要串行输入呢?

确实,你会看到6、7、8、9管脚都是输入管脚,它们就不是串行输入的,所以我们可以推测它们是不同的模拟量输入口。 其实DIN管脚是模式控制输入口,就好比我们去操作寄存器一样,要写进去一个数字量,来控制寄存器的运行模式,芯片也是这样。

再看DCLK管脚,这是外部时钟输入口,既然是串行输入输出,就要有拍子来控制一个一个字节输入输出,所以这个管脚就是起到这个作用。

然后我们一定要看时序图

通过看时序图,才能了解芯片的工作方式。

首先,CS是片选,低电平有效。

首先输入一个DIN,但是由于是串行输入,所以这里就要用位运算来一位一位提取后输入到DIN管脚,而输进去的时候是发生在时钟上升沿,时钟下降沿结束输入。

所以我们可以将模式输入程序写成这样的格式:

1、获得char 型模式数字量

2、DCLK = 0.

3、提取高位并将其赋值给DIN

4、DCLK = 1.锁存当前值。

循环8次。

之后我们发现芯片进入busy阶段,我们需要给它一个小延时,让它进行AD转换,然后我们还需要再给一个时钟脉冲,清除busy.

接下来就是读取DOUT的值,原理同DIN输入。

而模式的选择需要看你的板子上是怎么外接的

我们需要用电位器来实现AD转换,所以模拟量输入接口应该选择X+(6管脚)

再看芯片手册的模式说明

所以我们模式选择为0x94,读者可以自行对照每一位看看。

综上,我就可以给出完整代码了

1 #include 52.h>
  2 #include
  3 
  4 #define uint unsigned int 
  5 #define uchar unsigned char
  6 #define GPIO_DUAN P0
  7 
  8 uchar table[]={
  9     0x3f, 0x06, 0x5b, 0x4f,
 10     0x66, 0x6d, 0x7d, 0x07,
 11     0x7f, 0x6f, 0x77, 0x7c,
 12     0x39, 0x5e, 0x79, 0x71
 13 };
 14 
 15 uchar DisplayData[5];
 16 sbit HCA = P2^2;//HCA,HCB,HCC是利用了74HC138译码器来进行位选,我们动态位选了417 sbit HCB = P2^3;
 18 sbit HCC = P2^4;
 19 sbit CLK  = P1^0;
 20 sbit CS   = P1^1;
 21 sbit DIN  = P1^2;
 22 sbit DOUT = P1^3;
 23 
 24 void DisplayDS();
 25 void delayms(uint xms);
 26 uint Read_AD_Data(uchar moshi);
 27 void SPI_Write(uchar moshi);
 28 uint GetValue();
 29 
 30 void main()
 31 {
 32     uint temp, cnt = 50;
 33     while(1){
 34         if(cnt == 50){//每50下读取转换值,避免数字跳动太快
 35             temp = Read_AD_Data(0x94);
 36             cnt = 0;
 37         }
 38         cnt++;
 39         
 40         DisplayData[0] = table[temp%10000/1000];
 41         DisplayData[1] = table[temp%1000/100];
 42         DisplayData[2] = table[temp%100/10];
 43         DisplayData[3] = table[temp%10/1];
 44         
 45         DisplayDS();
 46     }
 47 }
 48 
 49 void DisplayDS()
 50 {//动态扫描函数
 51     uint i;
 52     for(i = 0; i < 4; i++){
 53         GPIO_DUAN = 0x00;
 54         switch(i)
 55         {
 56             case 0 : HCC = 0; HCB = 0; HCA = 0; break;
 57             case 1 : HCC = 0; HCB = 0; HCA = 1; break;
 58             case 2 : HCC = 0; HCB = 1; HCA = 0; break;
 59             case 3 : HCC = 0; HCB = 1; HCA = 1; break;
 60         }    
 61         GPIO_DUAN = DisplayData[i];
 62         delayms(1);
 63     }
 64 }
 65 
 66 void delayms(uint xms)
 67 {
 68     uint i, j;
 69     for(i = 0; i < xms; i++)
 70         for(j = 0; j < 110; j++);
 71 }
 72 
 73 uint Read_AD_Data(uchar moshi)
 74 {//读取最终的数字量函数
 75     uint i, ans;
 76     SPI_Write(moshi);    
 77     for(i = 0; i < 5; i++);
 78     
 79     CLK = 1;
 80     _nop_();
 81     _nop_();
 82     CLK = 0;
 83     _nop_();
 84     _nop_();
 85     
 86     ans = GetValue();
 87     CS = 1;
 88     return ans;
 89 }
 90 
 91 void SPI_Write(uchar moshi)
 92 {//写模式函数
 93     uint i;
 94     CS = 0;
 95     for(i = 0; i < 8; i++){    
 96         CLK = 0;
 97         DIN = moshi>>7;
 98         CLK = 1;
 99         moshi <<= 1;
100     }
101     CLK = 0;
102 }
103 
104 uint GetValue()
105 {//读取DOUT管脚,得到最终数字量函数
106     uint i, ans = 0;
107     for(i = 0; i < 12; i++){
108         CLK = 0;
109         ans <<= 1;
110         ans |= DOUT;
111         CLK = 1;
112     }
113     CLK = 0;
114     return ans;
115 }
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 电位器
    +关注

    关注

    14

    文章

    964

    浏览量

    66047
  • 触摸屏
    +关注

    关注

    42

    文章

    2131

    浏览量

    113683
  • 模拟量
    +关注

    关注

    5

    文章

    437

    浏览量

    25082
  • AD转换
    +关注

    关注

    3

    文章

    166

    浏览量

    44992
  • XPT2046
    +关注

    关注

    0

    文章

    18

    浏览量

    18106
收藏 人收藏

    评论

    相关推荐

    xpt2046中文资料

    xpt2046中文
    发表于 10-07 14:02

    通用触摸驱动程序作为XPT2046驱动程序的起点?

    嗨,我有一个触摸显示与SSD1963和XPT2046控制上。现在我需要一个司机的XPT2046与SPI通信。什么是最好的起点,司机使用ARI?谢谢! 以上来自于百度翻译 以下为原
    发表于 11-01 10:14

    详解FPGA XPT2046触摸控制设计

    获取。XPT2046是一款设计用于移动电话、个人数字助理、便携式一起、付款中断设备、触摸屏显示等设备的4线制电阻触摸屏控制。该芯片实质为一个多通道ADC+电压输出
    发表于 02-20 06:35

    xpt2046的DLCK管脚应该与51单片机的哪个管脚相连?

    xpt2046的DLCK管脚应该与51单片机的哪个管脚相连?(XPT2046的DLCK管脚是时钟管脚)
    发表于 04-06 10:21

    在TFTlcd实验中 XPT2046 的作用是什么 ?

    在TFTlcd实验中 XPT2046 的作用是什么 ??
    发表于 05-29 10:14

    如何用XPT2046芯片实现AD数模转换

    普中51开发板,用XPT2046芯片实现AD数模转换:让8个动态数码管,第一二位显示AD,后3位转换的数字量,最后3位显示对应电压值XPT2046
    发表于 12-09 07:19

    XPT2046是什么?有何作用

    XPT2046是一种可以做触摸(压力)感应,热感应,光感应,烟雾感应等的对模拟信号转换成数字信号的芯片芯片模型图控制寄存模式选择A2—A
    发表于 01-17 07:20

    XPT2046有哪些功能?

    XPT2046有哪些功能?
    发表于 02-17 06:58

    XPT2046可以当做普通的ADC芯片使用吗

    一、环境介绍单片机采用: STM32F103ZET6编程软件: keil5编程语言: C语言编程风格: 寄存开发.目标芯片: XPT2046---标准SPI接口时序二、XPT2046
    发表于 03-02 06:21

    XPT2046触摸屏控制器

    XPT2046触摸屏控制器
    发表于 02-15 22:45 19次下载

    触摸屏控制器XPT2046数据手册下载

    触摸屏控制器XPT2046数据手册下载
    发表于 07-05 10:20 25次下载

    51单片机实验16:A/D模数转换XPT2046

    51单片机实验16:A/D模数转换XPT2046
    发表于 11-23 16:36 26次下载
    51单片机实验16:A/D模数<b class='flag-5'>转换</b>(<b class='flag-5'>XPT2046</b>)

    普中51开发板,用XPT2046芯片实现AD数模转换。protues仿真用ADC0808实现AD数模转化

    普中51开发板,用XPT2046芯片实现AD数模转换:让8个动态数码管,第一二位显示AD,后3位转换的数字量,最后3位显示对应电压值XPT2046
    发表于 11-26 11:21 55次下载
    普中51开发板,用<b class='flag-5'>XPT2046</b><b class='flag-5'>芯片</b>实现AD数模<b class='flag-5'>转换</b>。protues仿真用ADC0808实现AD数模转化

    单片机之XPT2046

    XPT2046是一种可以做触摸(压力)感应,热感应,光感应,烟雾感应等的对模拟信号转换成数字信号的芯片芯片模型图控制寄存器模式选择A2—A1— A0模式0 0 1
    发表于 01-18 10:16 5次下载
    单片机之<b class='flag-5'>XPT2046</b>

    XPT2046芯片功能介绍

    电子发烧友网站提供《XPT2046芯片功能介绍.pdf》资料免费下载
    发表于 03-26 09:10 0次下载