2021-10-27 STM32F103 AD独立模式单通道采集 与LCD触摸 波形显示

内容涉及 :
内容涉及对 AD 的处理以及 LCD波形输出 模仿示波器的原理
LCD触摸画板的控制
SRAM 内存扩展管理
FatFs 文件系统移植
SPI函数移植过程
SPI字节数据模拟输出独写 缓存读写
USART串口的识别
IO口输入输出
按键的外部中断处理
32位数据通讯,字符串通讯,单字符通讯

完整代码 :源代码代码

Ad采集与stm32触摸显示

文章目录

  • 前言
  • 一、 编程要点
  • 二、使用步骤
    • (注意)Keil 配置状态
    • 建立主程序 main.c
    • 建立ADC采集驱动文件ADC_book.h
    • 建立ADC采集程序ADC_book.c
    • 建立波形显示的LCD驱动文件XPT2046_LCD_GridDiagram_book.h
    • 建立波形显示的LCD程序文件XPT2046_LCD_GridDiagram_book.c
    • 建立XPT2046驱动文件XPT2046_LCD_Device_book.h
    • 建立XPT2046程序文件XPT2046_LCD_Device_book.c
    • 建立XPT2046驱动文件XPT2046_LCD_book.h
    • 建立XPT2046驱动文件XPT2046_LCD_book.c
    • 建立XPT2046驱动文件XPT2046_LCD_Function_book.h
    • 建立XPT2046驱动文件XPT2046_LCD_Function_book.c
    • 建立 LCD驱动 管理文件LCD_book.h
    • 建立 LCD驱动 管理文件LCD_book.c
    • 建立 LCD 绘制函数文件LCD_Draw_book.h
    • 建立 LCD 绘制文件LCD_Draw_book.c
    • 建立 LCD页面绘制 文件LCD_PageHtml_book.h
    • 建立 LCD页面绘制 文件LCD_PageHtml_book.c
    • 建立 LCD 文字库 内存管理文件fonts.h
    • 建立 LCD 文字库 内存管理文件fonts.c
    • 建立 SRAM 内存管理文件SRAM_book.h
    • 建立 SRAM 内存管理文件SRAM_book.c

前言

STM32f103 系列有 3 个 ADC,精度为 12 位,每个 ADC 最多有 16 个外部通道。其中ADC1 和 ADC2 都有 16 个外部通道,ADC3 根据 CPU 引脚的不同通道数也不同,一般都有8 个外部通道。ADC 的模式非常多,功能非常强大,具体的我们在功能框图中分析每个部分的功能。
触摸检测的主体是型 为 XPT2046 的芯片,它接收触摸屏的 X+/X-/Y+/Y-信 进行处理,把触摸信息使用 SPI接口输出到 STM32等控制器,注意,由于控制 XPT2046 芯片的并不是 STM32 专用的硬件 SPI 接口,所以在编写程序时,需要使用软件模拟 SPI 时序与触摸芯片进行通讯。

电压输入范围:
ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由 VREF-、VREF+ 、VDDA 、VSSA、这四个外部引脚决定。 我们在设计原理图的时候一般把VSSA和VREF-接地,把VREF+和VDDA 接3V3,得到ADC的输入电压范围为:0~3.3V。如果我们想让输入的电压范围变宽,去到可以测试负电压或者更高的正电压,我们可以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到 0~3.3V,这样 ADC 就可以测量了。 输入通道:
我们确定好 ADC 输入电压之后,那么电压怎么输入到 ADC里我们引入通道的概念,STM32 的 ADC 多达 18 个通道,其中外部的 16 个通道就是框图中的 ADCx_IN0、ADCx_IN1…ADCx_IN5。这 16 个通道对应着不同的 IO 口,具体是哪一个 IO 口可以从手册查询到。其中ADC1/2/3还有内部通道:ADC1的通道16连接到了芯片内部的温度传感器, Vrefint 连接到了通道 17。ADC2 的模拟通道 16 和 17 连接到了内部的 VSS。ADC3 的模拟通道 9、14、15、16 和 17 连接到了内部的 VSS。

2021-10-27 STM32F103 AD独立模式单通道采集 与LCD触摸 波形显示

触发源
通道选好了,转换的顺序也设置好了,那接下来就该开始转换了。ADC 转换可以由ADC 控制寄存器 2: ADC_CR2 的 ADON 这个位来控制,写 1 的时候开始转换,写 0 的时候停止转换,这个是最简单也是最好理解的开启 ADC 转换的控制方式,理解起来没啥技术含量。除了这种庶民式的控制方法,ADC 还支持触发转换,这个触发包括内部定时器触发和外部 IO 触发。触发源有很多,具体选择哪一种触发源,由 ADC 控制寄存器 2:ADC_CR2 的 EXTSEL[2:0]和 JEXTSEL[2:0]位来控制。EXTSEL[2:0]用于选择规则通道的触发源,JEXTSEL[2:0]用于选择注入通道的触发源。选定好触发源之后,触发源是否要激活,则由ADC 控制寄存器 2:ADC_CR2 的 EXTTRIG 和 JEXTTRIG 这两位来激活。其中 ADC3 的规则转换和注入转换的触发源与 ADC1/2 的有所不同,在框图上已经表示出来。

转换时间
ADC转换时间: ─ STM32F103xx增强型产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)
─ STM32F101xx基本型产品:时钟为28MHz时为1μs(时钟为36MHz为1.55μs)
─ STM32F102xxUSB型产品:时钟为48MHz时为1.2μs
─ STM32F105xx和STM32F107xx产品:时钟为56MHz时为1μs(时钟为72MHz为1.17μs)

ADC 时钟ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大是 14M,分频因子由 RCC 时钟配置寄存器 RCC_CFGR 的位 15:14 DCPRE[1:0]设置,可以是 2/4/6/8 分频,注意这里没有 1 分频。一般我们设置 PCLK2=HCLK=72M。采样时间ADC 使用若干个 ADC_CLK 周期对输入的电压进行采样,采样的周期数可通过 ADC 采样时间寄存器 ADC_SMPR1 和 ADC_SMPR2 中的 SMP[2:0]位设置,ADC_SMPR2 控制的是通道 0~9,ADC_SMPR1 控制的是通道 10~17。每个通道可以分别用不同的时间采样。其 中采样周期最小是 1.5 个,即如果我们要达到最快的采样,那么应该设置采样周期为 1.5 个周期,这里说的周期就是 1/ADC_CLK。
ADC 的转换时间跟 ADC 的输入时钟和采样时间有关,公式为:Tconv = 采样时间 + 12.5 个周期。当 ADCLK = 14MHZ (最高),采样时间设置为 1.5 周期(最快),那么总的转换时间(最短)Tconv = 1.5 周期 + 12.5 周期 = 14 周期 = 1us。一般我们设置 PCLK2=72M,经过 ADC 预分频器能分频到最大的时钟只能是 12M,采样周期设置为 1.5 个周期,算出最短的转换时间为 1.17us,这个才是最常用的。

数据寄存器
一切准备就绪后,ADC 转换后的数据根据转换组的不同,规则组的数据放在 ADC_DR寄存器,注入组的数据放在 JDRx。
规则数据寄存器
ADC 规则组数据寄存器 ADC_DR 只有一个,是一个 32 位的寄存器,低 16 位在单 ADC时使用,高 16 位是在 ADC1 中双模式下保存 ADC2 转换的规则数据,双模式就是 ADC1 和ADC2 同时使用。在单模式下,ADC1/2/3 都不使用高 16 位。因为 ADC 的精度是 12 位,无论 ADC_DR 的高 16 或者低 16 位都放不满,只能左对齐或者右对齐,具体是以哪一种方式 存放,由 ADC_CR2 的 11 位 ALIGN 设置。规则通道可以有 16 个这么多,可规则数据寄存器只有一个,如果使用多通道转换,那转换的数据就全部都挤在了 DR 里面,前一个时间点转换的通道数据,就会被下一个时间点的另外一个通道转换的数据覆盖掉,所以当通道转换完成后就应该把数据取走,或者开启 DMA 模式,把数据传输到内存里面,不然就会造成数据的覆盖。最常用的做法就是开启 DMA 传输。

注入数据寄存器
ADC 注入组最多有 4 个通道,刚好注入数据寄存器也有 4 个,每个通道对应着自己的寄存器,不会跟规则寄存器那样产生数据覆盖的问题。ADC_JDRx 是 32 位的,低 16 位有效,高 16 位保留,数据同样分为左对齐和右对齐,具体是以哪一种方式存放,由ADC_CR2 的 11 位 ALIGN 设置。

一、 编程要点

1) 初始 ADC 用到的 GPIO;
2) 设置 ADC 的工作参数并初始化;
3) 设置 ADC 工作时钟;
4) 设置 ADC 转换通道顺序及采样时间;
5) 配置使能 ADC 转换完成中断,在中断内读取转换完数据;
6) 使能 ADC
7) 使能软件触发 ADC 转换。
ADC 转换结果数据使用中断方式读取,这里没有使用 DMA 进行数据传输。

二、使用步骤

(注意)Keil 配置状态

我的博客这里有项目配置 设计;
点击链接
(https://blog.csdn.net/u012651389/article/details/119189949)

建立主程序 main.c

代码如下 :

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年9月23日
下一篇 2021年9月23日

相关推荐