ADC

虽然很多转换器具有三态输出/输入,但这些寄存器仍然在芯片上。它们使数据引脚信号能够耦合到敏感区域,因而隔离缓冲区依然是一种良好的设计方式。

某些情况下,甚至需要在模拟接地层上紧靠转换器输出提供额外的数据缓冲器,以提供更好的隔离。

将数据缓冲器放置在转换器旁不失为好办法,可将数字输出与数据总线噪声隔离开(如图 1 所示)。

数据缓冲器也有助于将转换器数字输出上的负载降至最低,同时提供数字输出与数据总线间的法拉第屏蔽(如图 2 所示)。


ADC 输出与缓冲寄存器输入间的串联电阻(图 1 中标示为“R”)有助于将数字瞬态电流降至最低,这些电流可能影响转换器性能。

电阻可将数字输出驱动器与缓冲寄存器输入的电容隔离开。此外,由串联电阻和缓冲寄存器输入电容构成的RC网络用作低通滤波器,以减缓快速边沿。

典型 CMOS 栅极与PCB走线和通孔结合在一起,将产生约 10 pF 的负载。如果无隔离电阻,1 V/ns的逻辑输出压摆率将产生10 mA的动态电流:

驱动10 pF 的寄存器输入电容时,500 Ω 串联电阻可将瞬态输出电流降至最低,并产生约 11 ns的上升和下降时间:

由于TTL寄存器具有较高输入电容,可明显增加动态开关电流,因此应避免使用。

缓冲寄存器和其他数字电路应接地并去耦至 PC 板的数字接地层。请注意,模拟与数字接地层间的任何噪声均可降低转换器数字接口上的噪声裕量。

由于数字噪声抗扰度在数百或数千毫伏水平,因此一般不太可能有问题。模拟接地层噪声通常不高,但如果数字接地层上的噪声(相对于模拟接地层)超过数百毫伏,则应采取措施减小数字接地层阻抗,以将数字噪声裕量保持在可接受的水平。

任何情况下,两个接地层之间的电压不得超过 300mV,否则 IC可能受损。

最好提供针对模拟电路和数字电路的独立电源。模拟电源应当用于为转换器供电。

如果转换器具有指定的数字电源引脚(VD),应采用独立模拟电源供电,或者如图 3 所示进行滤波。所有转换器电源引脚应去耦至模拟接地层,所有逻辑电路电源引脚应去耦至数字接地层,如图 3 所示。

如果数字电源相对安静,则可以使用它为模拟电路供电,但要特别小心。

某些情况下,不可能将 VD连接到模拟电源。一些高速IC 可能采用+5 V电源为其模拟电路供电,而采用+3.3 V或更小电源为数字接口供电,以便与外部逻辑接口。

这种情况下,IC 的 +3.3 V引脚应直接去耦至模拟接地层。另外建议将铁氧体磁珠与电源走线串联,以便将引脚连接到+3.3 V数字逻辑电源。

采样时钟产生电路应与模拟电路同样对待,也接地并深度去耦至模拟接地层。

针对高频工作的接地

一般提倡电源和信号电流最好通过“接地层”返回,而且该层还可为转换器、基准电压源和其它子电路提供参考节点。但是,即便广泛使用接地层也不能保证交流电路具有高质量接地参考。

图 4 所示的简单电路采用两层印刷电路板制造,顶层上有一个交直流电流源,其一端连到过孔 1,另一端通过一条 U 形铜走 线连到过孔2。

两个过孔均穿过电路板并连到接地层。理想情况下,顶端连接器以及过孔 1 和过孔2之间的接地回路中的阻抗为零,电流源上的电压为零。

这个简单原理图很难显示出内在的微妙之处,但了解电流如何在接地层中从过孔1流到过孔2,将有助于我们看清实际问题所在,并找到消除高频布局接地噪声的方法。

图 5 所示的直流电流的流动方式,选取了接地层中从过孔 1 至过孔 2 的电阻最小的路径。虽然会发生一些电流扩散,但基本上不会有电流实质性偏离这条路径。

相反,交流电流则选取阻抗最小的路径,而这要取决于电感。

电感与电流环路的面积成比例,二者之间的关系可以用图 6 所示的右手法则和磁场来说明。环路之内,沿着环路所有部分流动的电流所产生的磁场相互增强。

环路之外,不同部分所产生的磁场相互削弱。因此,磁场原则上被限制在环路以内。环路越大则电感越大,这意味着:对于给定的电流水平,它储存的磁能(Li2)更多,阻抗更高(XL = jωL),因而将在给定频率产生更大电压。

电流将在接地层中选取哪一条路径呢?自然是阻抗最低的路径。考虑 U 形表面引线和接地层所形成的环路,并忽略电阻,则高频交流电流将沿着阻抗最低,即所围面积最小的路径流动。

在图中所示的例子中,面积最小的环路显然是由 U 形顶部走线与其正下方的接地层部分所形成的环路。

图 5 显示了直流电 流路径,图 7 则显示了大多数交流电流在接地层中选取的路径,它所围成的面积最小,位于 U 形顶部走线正下方。

实际应用中,接地层电阻会导致低中频电流流向直接返回路径与顶部导线正下方之间的某处。不过,即使频率低至 1 MHz 或 2 MHz,返回路径也是接近顶部走线的下方。

采样时钟考量

在高性能采样数据系统中,应使用低相位噪声晶体振荡器产生 ADC(或 DAC)采样时钟,因为采样时钟抖动会调制模拟输入/输出信号,并提高噪声和失真底。

采样时钟发生器应与高噪声数字电路隔离开,同时接地并去耦至模拟接地层,与处理运算放大器和 ADC 一样。

采样时钟抖动对ADC信噪比(SNR)的影响可用以下公式近似计算:

其中,f 为模拟输入频率,SNR 为完美无限分辨率 ADC 的 SNR,此时唯一的噪声源来自 rms 采样时钟抖动 tj。

通过简单示例可知,如果 tj = 50 ps (rms),f = 100 kHz,则 SNR = 90 dB,相当于约 15 位的动态范围。

应注意,以上示例中的 tj 实际上是外部时钟抖动和内部 ADC 时钟抖动(称为孔径抖动)的方和根(rss)值。不过,在大多数高性能 ADC 中,内部孔径抖动与采样时钟上的抖动相比可以忽略。

由于信噪比(SNR)降低主要是由于外部时钟抖动导致的,因而必须采取措施,使采样时钟尽量无噪声,仅具有可能最低的相位抖动。

这就要求必须使用晶体振荡器。有多家制造商提供小型晶体振荡器,可产生低抖动(小于 5 ps rms)的 CMOS 兼容输出。

理想情况下,采样时钟晶体振荡器应参考分离接地系统中的模拟接地层。但是,系统限制可能导致这一点无法实现。

许多情况下,采样时钟必须从数字接地层上产生的更高频率、多用途系统时钟获得,接着必须从数字接地层上的原点传递至模拟接地层上的ADC。

两层之间的接地噪声直接添加到时钟信号,并产生过度抖动。抖动可造成信噪比降低,还会产生干扰谐波。

通过使用小型射频变压器(如图8所示)或高速差分驱动器和接收机,将采样时钟信号作为差分信号传输,可在一定程度上解决这个问题。

如果使用后者,应该选择ECL来最大程度地减小相位抖动。在单个+5 V电源系统中,ECL逻辑可在地面和+5 V(PECL)之间连接,输出端交流耦合到ADC采样时钟输入。

不管是哪种情况,原始主系统时钟必须从低相位噪声晶体振荡器产生。

来源:EDA365电子论坛

围观 16

作者: Miler Shao

来源:茶话MCU 微信号:stmcu832

所有的STM32芯片中都带有逐次逼近型ADC模块,关于它的应用非常广泛和频繁。不过,应用过程中时常也会遇到些问题,这尽力小结下,与大家分享出来算作一些提醒。

1、Vdda没有供电或没有正常供电;STM32系列众多,该参数不可一概而论,细节请参考各个芯片数据手册。



2、采样电阻取值不合适,跟采样时间不匹配,经常表现为输入电阻过大、配置的采样时间偏短。实际设计时可以参考下STM32官方各系列评估板的相关电路。另外可以参考ST官方的应用笔记AN2834。关于ADC 应用其它的应用笔记,可以去WWW.STMCU.COM.CN搜索ADC即可。


3、ADC上电开启到稳定需要一段时间,即Tstab,该参数在数据手册里有介绍。在使用寄存器操作时要特别注意这个时间。另外要注意给ADC外设上电、使能ADC功能、启动ADC转换、实质AD转换是不一样的动作和不同的时间点。


4、输入信号幅度超过ADC参考电压范围导致转换结果的数据错误。

5、芯片供电的波动尤其VREF的波动和外来干扰都会导致ADC转换值的异常。

6、在使用注入触发转换时,触发事件的时间间隔必须大于注入转换序列所需的转换时间。比方有两个注入通道所需转换时间为28 ADCLK,那触发事件的间隔必须大于28个ADCLK,比方29,30 个ADCLK等都可以。

7、大多数STM32的ADC模块在使用前需要校准。校准须在启动AD转换之前完成。原则上给ADC外设上电后校准一次就够,但当参考电压波动较大、温度变化较剧烈时需再次校准。

8、开启ADC的DMA功能,建议在ADC校准之后进行。换句话说校准ADC前不要使能其ADC的DMA功能。尤其涉及到多通道ADC DMA传输时要注意这个次序。

9、如果使用ADC的DMA传输,在启动AD转换时,DMA需配置好且被使能待命。

10、当使用内部SENSOR ADC通道时,注意这些通道从开启到稳定跟开启ADC模块一样都是需要时间的;针对这些特定传感器通道的AD采样时间,手册里往往有相关参数明确告知,请参照使用。比方内部温度传感器通道的采样时间推荐为17us.

11、ADC通道序列的修改应该保证在ADC的停止状态下进行。

12、在多通道ADC DMA传输时,经常出现因为缓冲区数据类型、源数据类型不一致导致的异常状况。这里主要是因为数据宽度不一致所导致的问题。

13、当外部信号被选择为注入转换的触发信号时,只有其上升沿才有效。

上面提到的都只是抛砖引玉的提醒, 设计应用时多留意下,特别是第7、8、9、12四点提醒。STM32的ADC外设在不同系列间也不完全相同,尤其涉及多个ADC模块配合采样转换的时候还是挺复杂的。任何时候都不忘多查看STM32英文参考手册和数据手册。

本文转自:茶话MCU(微信号:stmcu832),作者: Miler Shao,转载此文目的在于传递更多信息,版权归原作者所有。

围观 203

12位ADC满足未来测试、测量以及国防应用的严苛要求

TI最新ADC具有8-GHz带宽和10.4-GSPS采样率,覆盖了5G测试、示波器和雷达应用的最宽频谱

德州仪器(TI)于今日推出一款新型超高速模数转换器(ADC),具有业界较宽的带宽、领先的采样率和低功耗。ADC12DJ5200RF可以帮助工程师实现5G测试应用和示波器的高精度测量,以及雷达应用的直接x波段采样。有关更多信息,敬请访 www.ti.com/ADC12DJ5200RF-pr

TI将于2019年6月4日至6日在波士顿举行的国际微波研讨会(IMS)上的1272号展位上展示ADC12DJ5200RF。

在更宽的频谱范围内实现更快测量

  • 更宽频宽:在8 GHz频率下,ADC12DJ5200RF可以让工程师实现高达20%的模拟输入带宽,并且能够直接将非常高的频率数字化,而无需额外的功耗、成本和下变频尺寸。 
  • 更快的12ADC在双通道模式下,ADC12DJ5200RF采样速率为5.2 gigasamples / s(GSPS),并以12位分辨率捕获高达2.6 GHz的瞬时带宽(IBW)。在单通道模式下,新的超高速ADC采样速率为10.4 GSPS,可捕获高达5.2 GHz的IBW。 
  • 高效接口:作为第一款支持JESD204C标准接口的独立GSPS ADC,ADC12DJ5200RF有助于最大限度地减少向现场可编程门阵列(FPGA)输出数据所需的串行器/解串器通道数量,从而让设计人员能够实现更高的数据速率。 

在电源和温度变化范围内具有高性能和稳定性的设计

  • 高信号检测灵敏度:ADC12DJ5200RF在电源变化范围内具有最高的动态性能,即使在最低规格下也是如此,通过提供超高灵敏度的接收器,可以检测到是最小和最弱的信号,从而提高信号智能。此外,该器件还包括内部高频振动,可提高无杂波干扰性能。 
  • 高测量精度:TI的新型超高速ADC极大地降低了系统误差,偏移误差低至±300 µV,以及零点温度漂移。 
  • 更低的CER:设计测试和测量设备的工程师可以充分利用ADC12DJ5200RF的极低误码率(CER)实现高测量可重复性。

将解决方案尺寸减小30%,功耗降低20%

  • 更小的占用面积:ADC12DJ5200RF的尺寸为10 mm×10 mm,比离散的解决方案小30%,可帮助工程师节省电路板空间。这种新型超高速ADC还能够减少通道数量,有助于采用更小的印刷电路板设计。 
  • 降低功耗:ADC12DJ5200RF 4-W的低能耗可以帮助工程师最大限度地降低散热并简化设计中的整体热管理,在同类产品中表现突出。

加快设计的工具和支持

了解更多信息

关于德州仪器(TI)

德州仪器(TI)是一家全球性半导体设计制造公司,始终致力于模拟集成电路(IC)及嵌入式处理器开发。TI拥有全球顶尖人才,锐意创新,塑造技术行业未来。今天,TI正携手超过10万家客户打造更美好未来。更多详情,敬请查阅 www.ti.com

围观 298

单片机的基准电压一般为3.3V,如果外部信号超过了AD测量范围,可以采用电阻分压的方法,但是要注意阻抗匹配问题。比如,SMT32的模数输入阻抗约为10K,如果外接的分压电阻无法远小于该阻值,则会因为信号源输出阻抗较大,AD的输入阻抗较小,从而输入阻抗对信号源信号的电压造成分压,最终导致电压读取误差较大。

因此对于使用单片机读取外部信号电压,外接分压电阻必须选用较小的电阻,或者在对功耗有要求的情况下,可选用大阻值的电压分压后,使用电压跟随器进行阻抗匹配(电压跟随器输入阻抗可达到几兆欧姆,输出阻抗为几欧姆甚至更小)。如果信号源的输出阻抗较大,可采用电压跟随器匹配后再接电阻分压。

对于外置的ADC芯片,在选型时,要留意其类型(SAR型、开关电容型、FLASH型、双积分型、Sigma-Delta型),不同类型的ADC芯片输入阻抗不同——

1、SAR型:这种ADC内阻都很大,一般500K以上。即使阻抗小的ADC,阻抗也是固定的。所以即使只要被测源内阻稳定,只是相当于电阻分压,可以被校正;

2、开关电容型:如TLC2543之类,其要求很低的输入阻抗用于对内部采样电容快速充电。这时最好有低阻源,否则会引起误差。实在不行,可以外部并联一很大的电容,每次被取样后,大电容的电压下降不多。因此并联外部大电容后,开关电容输入可以等效为一个纯阻性阻抗,可以被校正;

3、FLASH型(直接比较型):大多高速ADC都是直接比较型,也称闪速型(FLASH),一般都是低阻抗的。要求低阻源。对外表现纯阻性,可以和运放直接连接;

4、双积分型:这种类型大多输入阻抗极高,几乎不用考虑阻抗问题;

5、Sigma-Delta型:这是目前精度最高的ADC类型,需要重点注意如下问题:

  • a. 测量范围问题:SigmaDelta型ADC属于开关电容型输入,必须有低阻源。所以为了简化外部设计,内部大多集成有缓冲器。缓冲器打开,则对外呈现高阻,使用方便。但要注意了,缓冲器实际是个运放。那么必然有上下轨的限制。大多数缓冲器都是下轨50mV,上轨AVCC-1.5V。在这种应用中,共莫输入范围大大的缩小,而且不能到测0V。一定要特别小心!一般用在电桥测量中,因为共模范围都在1/2VCC附近。不必过分担心缓冲器的零票,通过内部校零寄存器很容易校正的;
  • b. 输入端有RC滤波器的问题:SigmaDelta型ADC属于开关电容型输入,在低阻源上工作良好。但有时候为了抑制共模或抑制乃奎斯特频率外的信号,需要在输入端加RC滤波器,一般DATASHEET上会给一张最大允许输入阻抗和C和Gain的关系表。这时很奇怪的一个特性是,C越大,则最大输入阻抗必须随之减小!刚开始可能很多人不解,其实只要想一下电容充电特性久很容易明白的。还有一个折衷的办法是,把C取很大,远大于几百万倍的采样电容Cs(一般4~20PF),则输入等效纯电阻,分压误差可以用GainOffset寄存器校正。
  • c. 运放千万不能和SigmaDelta型ADC直连!前面说过,开关电容输入电路电路周期用采样电容从输入端采样,每次和运放并联的时候,会呈现低阻,和运放输出阻抗分压,造成电压下降,负反馈立刻开始校正,但运放压摆率(SlewRate)有限,不能立刻响应。于是造成瞬间电压跌落,取样接近完毕时,相当于高阻,运放输出电压上升,但压摆率使运放来不及校正,结果是过冲。而这时正是最关键的采样结束时刻。所以,运放和SD型ADC连接,必须通过一个电阻和电容连接(接成低通)。而RC的关系又必须服从datasheet所述规则。
  • d. 差分输入和双极性的问题:SD型ADC都可以差分输入,都支持双极性输入。但这里的双极性并不是指可以测负压,而是Vi+ Vi-两脚之间的电压。假设Vi-接AGND,那么负压测量范围不会超过-0.3V。正确的接法是Vi+ Vi- 共模都在-0.3~VCC之间差分输入。一个典型的例子是电桥。另一个例子是Vi-接Vref,Vi+对Vi-的电压允许双极性输入

来源:思考与实践并行

围观 682

前段时间有一个客户需要用到4线电阻触摸屏,为了节省一片触摸屏控制芯片,客户决定使用MCU直接控制4线电阻触摸屏,主要使用到了MM32的ADC外设资源,通过ADC采集触摸屏的X+\Y+的电压,算出相对应的坐标轴,并且显示在显示屏上。所以今天将结合该例程和大家一起熟悉、了解MM32的ADC配置流程。

一、触摸屏操作原理

电阻触摸屏利用压力感应进行控制。电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理、光滑防擦的塑料层,它的内表面也涂有一层涂层,在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把两层导电层隔开绝缘。当手指触摸屏幕时,两层导电层在触摸点位置就有了接触,电阻发生变化,在X和Y两个方向上产生信号,然后送触摸屏控制器。控制器侦测到这一接触并计算出(X,Y)的位置,再根据模拟鼠标的方式运作。这就是电阻技术触摸屏的最基本的原理。

二、MM32驱动电阻触摸屏的实现

MM32系列MCU的I/O口可以编程配置成带上拉电阻的模式,这个特点可以用来检测有无触摸。MM32的GPIO管脚连接触摸屏的Y+和X- ,连接Y+的管脚配置成内部电阻上拉模式,连接X-的管脚配置成推挽输出低电平。如果Y+为高电平,那么就是没有触摸。如果Y+为低电平,触摸屏被压下。从高到低电平的跳变可以检测触摸,可以用外部中断,在本例程中将使用ADC的单次扫描模式采集X+\Y+电压。

图1. 4线电阻触摸屏坐标读取

 MM32通过ADC控制4线电阻触摸屏

三、MM32 ADC介绍

12 位 ADC 是逐次逼近式的模拟-数字转换器(SAR A/D 转换器),且ADC转换数据分辨率可设置8-12位有效。

高达1Msps转换速率,有很多用户在计算采样频率设置时会觉得很难理解,在这里将为大家讲一下采样频率计算方法,ADC 的时钟 ADCLK 由 PCLK2 分频得到ADC 的输入时钟(不得超过 15MHz,它是由 PCLK2 经分频产生)。分频系数可通过设置 ADCFG 寄存器的 ADCPRE 位来确定,即 PCLK2/(N+1)/2 分频后作为 ADC 时钟。设置 ADC 分辨率为 n 位(n=8,9,10,11,12),每个通道采样时间为 m, Fsample = FADCLK/(m + n + 1.5)。假设分辨率配置为 12bit,每个通道采样时间为 1.5T, 则 Fsample =FADCLK/15。

例如:设置 ADC 分辨率为 n =12,每个通道采样时间m =1.5个周期,FADCLK=15MHz
Fsample = FADCLK/(m + n + 1.5)=15/(12+1.5+1.5)=1Msps

根据此配置可以得到1Msps转换速率,也就是转换时间为1us,用户可以根据项目的需求配置相对应的转换速率。

A/D 转换器支持多种工作模式:单次转换、单周期扫描模式和连续转换模式。
- 单次转换模式: A/D 转换在指定通道完成一次转换。
- 单周期扫描模式: A/D 转换在所有指定通道完成一个周期(从低序号通道到高序号通道)转换。

- 连续扫描模式: A/D 转换连续执行单周期扫描模式直到软件停止 A/D 转换。

支持DMA传输,单周期扫描和连续扫描时通道转换的值存储在各自通道的数据寄存(ADDRn)中,最近一次转换的结果也会保存在 ADDATA 寄存器中。DMA 传输时可以选择传输某个特定通道的数据,或者传输所有扫描通道的结果。

A/D 转换的启动方式有软件设定(即在配置相关寄存器时,直接开启采样)、外部引脚触发(例如定时器捕获,EXTI线)以及各个定时器启动(Timer1/2/3/4 匹配或者 TRGO 信号,在配置电机应用时需要使用定时器触发ADC采样)。

窗口比较器(模拟看门狗)允许应用程序检测输入电压是否超出了用户设定的高/低阀值值,转换结果可和指定的值相比较,当转换值和设定值相匹配时,用户可设定是否产生中断请求。

四、用MM32L373读触摸屏参数
在硬件中使用了MM32L373的ADC单周期扫描功能,使用到的GPIO分别是:PA1\PA3\PA4\PA5,分两步读取X,Y坐标值。

//测量X+电压的GPIO配置
void XP_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//将X+配置模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//将X-配置浮空模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//将Y+、Y-配置为通用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);//Y-输出低电平
GPIO_SetBits(GPIOA,GPIO_Pin_5); //Y+输出高电平
}
//测量Y+电压的GPIO配置
void YP_GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//将Y+ 配置模拟输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
//GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//将Y- 配置浮空模式
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//将X+、X-配置为通用推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);//X-输出低电平
GPIO_SetBits(GPIOA,GPIO_Pin_1); //X+输出高电平
}
第一步,驱动Y+为高电平,Y-为低电平,接X+管脚配置成AD输入模式,检测X+的电压,此电压与驱动电压的比例即Y坐标和整个屏的高度比率。
/***************************************************************************
** 函数信息:void XP_ADC1_SingleChannel(uint8_t ADC_Channel_x)
**功能描述:测量X+电压,配置ADC单次扫描通道
**输入函数:ADC_Channel_x , x为0~8
**输出函数:无
***************************************************************************/
void XP_ADC1_SingleChannel(uint8_t ADC_Channel_x)
{
ADC_InitTypeDef ADC_InitStructure;
XP_GPIO_Configuration();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC1时钟
/* Initialize the ADC_PRESCARE values */
ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16;//16分频
/* Initialize the ADC_Mode member */
ADC_InitStructure.ADC_Mode = ADC_Mode_Single;//配置单通道扫描模式
/* Initialize the ADC_ContinuousConvMode member */
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换模式
/* Initialize the ADC_DataAlign member */
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
/* Initialize the ADC_ExternalTrigConv member */
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1;//外部触发通道选择
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_x, 0, ADC_SampleTime_1_5Cycles); //设置换换顺序和采样时间
ADC_Cmd(ADC1, ENABLE); //使能ADC1
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件转换启动
if(ADC_Channel_x==ADC_Channel_8)
{
ADC1->ADCFG|=0x04;
}
}

第二步,驱动X+为高电平,X-为低电平,接Y+的管脚配置成AD输入模式,检测Y+的电压,此电压与驱动电压的比例即X坐标和整个屏的宽度比率。
/***************************************************************************
** 函数信息:void YP_ADC1_SingleChannel(uint8_t ADC_Channel_x)
**功能描述:测量Y+电压,配置ADC单次扫描通道
**输入函数:ADC_Channel_x , x为0~8
**输出函数:无
***************************************************************************/
void YP_ADC1_SingleChannel(uint8_t ADC_Channel_x)
{
ADC_InitTypeDef ADC_InitStructure;
YP_GPIO_Configuration();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1时钟
/* Initialize the ADC_PRESCARE values */
ADC_InitStructure.ADC_PRESCARE = ADC_PCLK2_PRESCARE_16; //16分频
/* Initialize the ADC_Mode member */
ADC_InitStructure.ADC_Mode = ADC_Mode_Single; //配置单通道扫描模式
/* Initialize the ADC_ContinuousConvMode member */
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //关闭连续转换模式
/* Initialize the ADC_DataAlign member */
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右对齐
/* Initialize the ADC_ExternalTrigConv member */
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1;//外部触发通道选择
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1,ADC_Channel_x,0,ADC_SampleTime_1_5Cycles); //设置换换顺序和采样时间
ADC_Cmd(ADC1, ENABLE); //使能ADC1
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件转换启动
if(ADC_Channel_x==ADC_Channel_8)
{
ADC1->ADCFG|=0x04;
}
}

第三步:根据ADC采集到的数据做校验算法,得到触摸点坐标,并且显示在显示屏对应的区域。

图2 实验效果

 MM32通过ADC控制4线电阻触摸屏

转自: 灵动微电子

围观 404

页面

订阅 RSS - ADC