第018课 ADC和触摸屏硬件原理详解及裸机编程

2020-03-24来源: eefocus关键字:ADC  触摸屏  硬件原理  裸机编程

第001节_ADC硬件原理

模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。


通常的模数转换器是把经过与标准量比较处理后的模拟量转换成以二进制数值表示的离散信号的转换器。 


故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。而输出的数字量则表示输入信号相对于参考信号的大小。


如图,是把可变电阻上的电压值变换的模拟信号通过ADC转换,输出数字信号。

这里写图片描述

对于数字信号我们需要得到它的几个属性


*用多少位来存储这个数据(假设10bit)。 

*最大值0b111111111 

*它对应的电压是多少伏(模拟信号输入的最大值是多少)我们就可以根据模拟信号(电压)的最大值,来计算出对应的数值。 

*采样/转换速度。


对于程序员,我们不关心ADC的内部机制,我们只关心:


*怎么启动ADC 

*启动之后怎么得到数据, 

总之:我们都是通过寄存器操作的。

这里写图片描述

从图1-1-1可以看出ADC有8个多路选择器,显然,以后我们写程序的时候,我们可以8个多路选择之一, 

下面是编写程序要做的步骤:


确定是哪一路信号:设置8:1MUX,选择要测量哪一个引脚,(看原理图选择要测量的引脚)

设置工作时钟(从工作室中,可以算出转换一次,需要多长时间)

启动

读状态,判断ADC转换是否成功。

读数据

ADC寄存器介绍

1.ADC 控制寄存器(ADCCON)


ADCCON控制寄存器,用于标志转换是否完成,控制是否使能预分频器,输入通道选择,工作模式,ADC是否启动。它的各位含义如下图所示。

这里写图片描述

2.ADC 启动延时寄存器(ADCDLY)


ADCDLY 启动延时寄存器用于启动或初始化延时寄存器。它的各位含义如下图所示

这里写图片描述

3.ADC 转换数据寄存器(ADCDAT0)


ADCDAT0转换数据寄存器,本节中只用到该寄存器的前10位(用于保存转换后的结果)。

这里写图片描述

第002节_ADC编程

编程步骤:


初始化ADC

读数据,

在串口上显示出来。 


一.初始化ADC


下面的函数实现对ADC的初始化。


03  void adc_init(void)

04  {

05  /* [15] : ECFLG,  1 = End of A/D conversion

06      * [14] : PRSCEN, 1 = A/D converter prescaler enable

07      * [13:6]: PRSCVL, adc clk = PCLK / (PRSCVL + 1)

08      * [5:3] : SEL_MUX, 000 = AIN 0

09       * [2]   : STDBM

10      * [0]   : 1 = A/D conversion starts and this bit is cleared after the startup.

11      */

12      ADCCON = (1<<14) | (49<<6) | (0<<3);

13

14      ADCDLY = 0xff;  

15  }


第12行:配置ADCCON寄存器,使能A/D 转换器预分频器,设置A/D 转换器预分频值,上拉使能。

第14行:设置ADC 转换启动延时值。

二.读数据


在这个读函数中启动ADC,并且等待ADC转换成功。然后返回数据,



17  int adc_read_ain0(void)

18  {

19          /* 启动ADC */

20      ADCCON |= (1<<0);

21

22      while (!(ADCCON & (1<<15)));  /* 等待ADC结束 */

23

24      return ADCDAT0 & 0x3ff;

25  }


第20行:启动ADC。

第22行:等待A/D转换结束(ADCCON第15位置1),

第24行:返回转换的值。(ADCDAT0寄存器的前10位,是保存转换后的值)。

三.ADC测试


函数代码如下: 函数功能:在串口/LCD上打印ADC转换后的结果。


04  void adc_test(void)

05  {

06      int val;

07      double vol;

08      int m; /* 整数部分 */

09      int n; /* 小数部分 */

10  

11      adc_init();

12

13      while (1)

14      {

15          val = adc_read_ain0();

16          vol = (double)val/1023*3.3;   /* 1023----3.3v */

17          m = (int)vol;   /* 3.01, m = 3 */

18          vol = vol - m;  /* 小数部分: 0.01 */

19          n = vol * 1000;  /* 10 */

20

21          /* 在串口上打印 */

22          printf("vol: %d.%03dv", m, n);  /* 3.010v */

23

24          /* 在LCD上打印 */

25          //fb_print_string();

26          }

27  }


*第11行:初始化ADC. 

*第15行:把ADC转换得到的值赋值给变量val. 

*第16行:把变量val的值转化为电压值。 

*第17行:取vol整数部分赋值给变量m。 

*第18行:取vol的小数部分赋值给vol。


测试


把生成的二进制文件烧录到开发板上,接上SPI模块,旋转可变电阻就可以在串口上看到电压值发生变化。


第003节_电阻触摸屏硬件原

这节课我们来讲电阻触摸屏的硬件原理


假设有一个比较长的电阻,电阻是R 上面接3.3V电压,下面接地

这里写图片描述

假设整个电阻的阻值是R某一个触电它的阻值是R1 

根据欧姆定律


3.3v/R = V/R1 

V=3.3 *(R1/R)


假设R1是x坐标 

R的长度是l 

这个电阻非常的均匀,那么这个电压就等于 3.3V * (x / l) 

这个电压和这个触电的x坐标有一个线性关系 

我使用ADC把这个电压算出来,就可以间接得到这个触电的x坐标 

电阻触摸屏就是使用欧姆定律使用电阻原理作出来的


可以上百度图片搜索触摸屏,就知道了触摸屏的样子,它是一个透明的薄膜,注意 LCD是LCD 触摸屏是触摸屏它是两个设备, 

我们只不过是把触摸屏做的和LCD大小一样,粘在LCD上面, 

实际上触摸屏是由两层膜组成,他们靠的非常近

上面这层右边引出来,代表xp ,p代表正极

上面这层左边引出来,代表xm, m代表负极

这里写图片描述

下面这层膜 前面这条边引出来为yp,后面这层边为ym


假设我们手指要点击触摸屏,那么上下就会粘贴在一起,我怎么算出这个 x y点的坐标呢? 

测量触电x坐标: 

xp接3.3v,xm接GND

这里写图片描述

yp,ym不接电源


2 测yp电压 

上下膜连接在一起,我就可以通过yp测量这个触电的电压 

这个yp就像探测一样,从前面的原理我们可以知道,当这个触电越靠近左边这个电压越小,越靠近右边电压越大 

这个yp的电压就可以认为是这个触电的坐标(x坐标)


类似的我们怎么测量触电y坐标 

类似的xp xm不接电源,同样yp接3.3v, ym接GND,这时候电流就从 yp这里流向ym,让后我们就可以测量xp电压 

当按下屏幕时,上下两层膜链接在一起,这个xp就像探针一样,这个触电越靠近yp电压值越大,越靠近ym电压值越小

这里写图片描述

yp接3.3V ym接GND,xp xm不接电源 

测量xp电压,就是y坐标

注意 x y坐标都是电压值,不是屏幕上480 * 272 这些值,我们需要把电压值转换为坐标值,这需要经过一些转换


我们测量xp yp可以得到触点的两个方向的电压值,这些电压值和坐标是线性关系 

我们现在总结下使用触摸屏的流程

<1>按下触摸屏 按下触摸屏时,对于一个高效的系统,产生中断,这是触摸屏中断

<2>在触摸中断程序中 启动ADC,(获得数据,xy坐标)启动ADC就开始模数转换,不可能瞬间完成,

<3>ADC完成, 产生中断

<4>ADC中断中读取x y坐标,我们来想想,在这个流程里,启动触摸屏的源头是按下触摸屏,那如果长按触摸屏,我按下之后一直不松开 滑动手指呢

那么谁来触发后续的多次ADC转换呢 不可能只启动一次吧, 

为了支持 长按 滑动操作,我们需要启用定时器. 

<5> 启动定时器

<6> 定时器中断发生,判断触摸屏是否仍被按下,如果按下就循环上述过程

<6.1>在触摸中断程序中 启动ADC,(获得数据,xy坐标)启动ADC就开始模数转换,不可能瞬间完成

<6.2>ADC完成, 产生中断

<6.3>ADC中断中读取x y坐标,)

<7> 松开结束一个流程

这就是整个触摸屏的使用流程


在14章里讲解了触摸屏,他抽象了几张图


平时的时候上下两层膜并不连接,我们按下触摸屏的时候就会产生中断,那么你怎么知道产生中断,肯定是由某个引脚的电平发生变化,平时 Y_ADC/xp是高电平,按下之后Y_ADC就接地了,就是被拉低了,就产生了低电平

这里写图片描述

产生低电平后就知道触摸屏被按下了,这个时候就需要测量电压值读取x坐标,XP XM通电我就测量YP的电压,这不就是 x 点的坐标

这里写图片描述

读取Y坐标

YP YM 通电,按下后XP通电,这不就是y点的坐标么

这里写图片描述

第004节_S3C2440触摸屏接口

回顾上节触摸屏使用原理

这里写图片描述

在不使用触摸屏的时候,必须要把 S1 S2 S3断开,S4 S5闭合,只有这样当我按下触摸屏,上面的电平才能从高变低,会产生一个中断信号,而当我去读取X坐标的值时


这里写图片描述

必须让S1 S3闭合,这样电流才可以通过,同时让S2 S4 S5断开,这时候YP这层膜就相当于探针一样去测量电压


当我读取y坐标值

这里写图片描述

必须让S2 S4闭合,这样电流才可以流 下来,同时S1 S3 S5断开,这个时候XP这层膜就相当于探针一样,我可以来测量这里的电压,从而得到Y坐标的电压值


在测量x y坐标时,这个S5上拉电阻都要断开, 

我们需要控制这几个开关,实际上2440就提供了这几个开关的控制方法, 

打开2440的芯片手册看触摸屏时怎么操作的, 

从440到450总共10页不到, 

我们看有一个8:1 MUX的多路选择器,以及XP YP

这里写图片描述

442页触摸屏接口模式

这里写图片描述

正常模式,在上节视频中我

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]
关键字:ADC  触摸屏  硬件原理  裸机编程 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492476.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:第017课 LCD原理详解及裸机程序分析
下一篇:第019课 I2C协议详解及裸机程序分析

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STM8L ADC功能
STM8L系列单片机集成了AD功能,有一个ADC模块,但是有最多可达28个AD通道,可以配置为单次采样或者连续采样。ADC的精度最多可配置为12位精度,另外可以选择6位、8位、10位的精度。下面举例初始化一个ADC的配置函数:void ADC21Conver_Init(){  ADC_ChannelCmd(ADC1,                 ADC_Channel_0,         //关闭其他的采样通道         
发表于 2020-03-04
stm8L051低功耗采集电池电量ADC例程
自己记录一下,以防以后用uint  ADC_ReadValue(uchar  channel){     uchar   i;    static uint ADC_Buf[5];    uint vrefint;    ulong adcValue;    CLK_PCKENR2 = CLK_PCKENR2 | 0X01; //使能外设ADC的时钟,之后对ADC的寄存器操作有效    ADC1_CR1 = 0x01; //开启AD模块电源,使用Sing
发表于 2020-03-04
【菜鸟入门】stm32 之 ADC 模数转换
今天对ADC进行了研究,个人感觉,ADC的配置相对也对比较复杂一点,因为需要配置的寄存器是比较多的!在datasheet 关于ADC的简介中,明确说明ADC的输入时钟不得超过14M,他是有PCLK2经过分频得来的这次我们选用ADC1_IN0作为讲解的对象,ADC1_IN0 -->PA0所以在配置时钟的时候要配置PA0和ADC1,关于怎么配置,已经说的很清楚了。在配置PA0的输入模式方面我要说明一下,有好多人在这个地方还是很郁闷的在8.1.11 外设GPIO的配置中每种配置都说的很清楚,如果我们对那中模式配置有疑问,我们都可以直接在这里查找这里的ADC我们采用模拟输入模式:所以我们这里需要把PA1配置为0000b输入配置完成
发表于 2020-03-04
【菜鸟入门】stm32 之 ADC 模数转换
高达4 MSPS ,Analog Devices 16位ADC 贸泽开售
专注于引入新品并提供海量库存的电子元器件分销商贸泽电子 (Mouser Electronics) 即日起开始供应Analog Devices公司的AD7386 逐次逼近寄存器 (SAR) 模数转换器 (ADC)。16位的AD7386为单端类型,功能与AD7380和AD7381 ADC兼容,吞吐速率高达4 MSPS,并采用 3 × 3 mm小巧尺寸的LFCSP封装。这款双路同步采样的高速ADC很适合用于电机控制、声呐、电源质量和数据采集应用。       作为授权分销商,贸泽致力于快速引入新产品与新技术,帮助客户设计出先进产品,并使客户产品更快走向市场。超过800家半导体
发表于 2020-03-02
高达4 MSPS ,Analog Devices 16位ADC 贸泽开售
STM8 ADC读取数据异常问题的解决
做了一个stm8的一个测量电压电流的项目,发现adc通道通过一个10k电阻连接VCC,的时候ADC数据出来都是只有200多,按理说,10位adc应该出来1000多才对,由于adc出来的数据是十六位的,怀疑是串口发送数据的时候数据位数不对。于是改为uint16_t dat_tmp = 0;// ADC_conf(4);// dat_tmp =  ADC_GetConversionValue(); // printf("rnddddddddddrn");//  delay(0xffff);TIM1_SR1 &= ~(1 << 0); //清除中断标志
发表于 2020-02-28
STM8 ADC读取数据异常问题的解决
用C51单片机把只带的ADC(12bit)转换为RS232输出
#include "reg51.h"         // STC8G1K08A-SOP8  #include "intrins.h"/*  STC8G1K08A-SOP8   读取 VCC值 ,先发送出去  然后 循环开始 读取ch4的 (P55 ,第3脚)值 发送出去 */sfr     ADC_CONTR   =   0xbc;sfr     ADC
发表于 2020-02-27
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved