STM32 ADC做触摸按键

一、12位逐次逼近型ADC转换原理
1、ADC原理
ADC中输入的模拟信号是连续的,而输出的数字信号是离散的,所以转换时必须对输入的模拟信号进行采样;然后再把采样值转换成为输出的数字信号;这个过程需要经过采样、保持、量化、编码。在这里插入图片描述
前置滤波器由于采样信号输出的是窄脉冲信号需要抗混叠滤波器来避免高频信号影响基带信号。
采样是将连续的模拟信号转换成时间上离散的采样信号;需要注意的是;根据奈奎斯特采样定理,采样频率必须大于或者等于2陪的采样信号的频率,才可以完整无失真的恢复被采样信号。
AD转换是通过量化这一步骤完成的,
量化器是将参考信号Vref分割成2N个子域,N是数字编码输出的位数。在2^N个子域中分别对应着不同的模拟输入量,量化则要找出不同的模拟量对应的子域,找到之后才可以允许编码器编码输出,这样输入信号某一段就会对应到同一个输出码字,是因为有了最小步长也就是精度,产生了一个码字到另一个码字的转换。因此在转换时间内,被采样的模拟输入信号被转换成等价的数子码输出。
分辨率是ADC可以识别的最小信号变化的能力,有数字和模拟之分。数字分辨是指输出码字的位数,位数越多,分辨率越高。模拟分辨率是指能识别的最小模拟增量。用满刻度表示也就是1bit表示的模拟量,比如:Verf/2^12,取Verf=3.3V,则1bit分辨就是0.8mV。
2、逐次逼近型ADC
逐次比较型A/D转换器,就是将输入模拟信号与不同的参考电压作多次比较,使转换所得的数字量在数值上逐次逼近输入模拟量对应值。
二、STM32F103RCT6 ADC正常工作配置
1、C语言常用位带操作符
(1)清零
若想对一个存储单元清零,即使其全部二进制位为0,只要找一个二进制数,其中各个位符合一下条件:
原来的数中为1的位,新数中相应位为0。然后使二者进行&运算,即可达到清零目的。
a 00101011
b 10010100
c 00000000 //c = a & b

(2)取一个数中某些指定位
若有一个整数a(2byte),想要取其中的低字节,只需要将a与8个1按位与即可。
a 00101100 10101100
b 00000000 11111111
c 00000000 10101100 //c = a & b

(3)保留指定位:
a 01010100
b 00111011
c 00010000 //c = a & b

2、| 按位或
两个相应的二进制位中只要有一个为1,该位的结果值为1。借用逻辑学中或运算的话来说就是,一真为真
应用:将一个数据的某些位定值为1
a 00110000
b 00001111
c 00111111 //c = a | b

3、^ 按位异或
若参加运算的两个二进制位值相同则为0,否则为1
应用:不用临时变量,交换两个值

计算前:
a=3,即011(2);b=4,即100(2)

计算过程:
a=a ^ b; //即111 = 011 ^ 100
b=b ^ a; //即011 = 100 ^ 111
a=a ^ b; //即100 = 111 ^ 011

计算后:
a=100(2)即 4 ;b = 011(2)即 3;

4、~ 取反
~是一元运算符,用来对一个二进制数按位取反,即将0变1,将1变0

5、<< 左移
用来将一个数的各二进制位全部左移N位,右补0

6、>> 右移
将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0
在这里插入图片描述
2、STM32 ADC模块框图
在这里插入图片描述
1) 开启 PA 口时钟,设置 PA1 为模拟输入。
STM32F103RCT6 的 ADC 通道 1 在 PA1 上,所以,我们先要使能 PORTA 的时钟,然后设
置 PA1 为模拟输入。
RCC->APB2ENR|=1<<2; //打开PA1的时钟
GPIOA->CRL&=0XFFFFFF0F; //设置成模拟输入
2) 使能 ADC1 时钟,并设置分频因子。
要使用 ADC1,第一步就是要使能 ADC1 的时钟,在使能完时钟之后,进行一次 ADC1 的
复位。接着我们就可以通过 RCC_CFGR 设置 ADC1 的分频因子。分频因子要确保 ADC1 的时
钟(ADCCLK)不要超过 14Mhz。
RCC->APB2ENR|=1<<9; //ADC1时钟使能
RCC->APB2RSTR|=1<<9; //ADC1复位
RCC->APB2RSTR&=~(1<<9); //ADC复位结束
RCC->CFGR&=~(3<<14); //分频因子设置
RCC->CFGR|=2<<14;
//SYSCLK/DIV2=12M ADC1设置成12M, ADC1不能超过14M!
//否则将导致ADC准确度下降
3) 设置 ADC1 的工作模式。
在设置完分频因子之后,我们就可以开始 ADC1 的模式配置了,设置单次转换模式、触发
方式选择、数据对齐方式等都在这一步实现。
ADC1->CR1&=0XF0FFFF; //工作模式清零
ADC1->CR1|=0<<16; //独立工作模式
ADC1->CR1&=~(1<<8); //非扫描模式
ADC1->CR2&=~(1<<1); //单次转换模式
ADC1->CR2&=~(7<<17);
ADC1->CR2|=7<<17; //软件控制转换
ADC1->CR2|=1<<20; //使用外部触发
ADC1->CR2&=~(1<<11); //右对齐
4) 设置 ADC1 规则序列的相关信息。
接下来我们要设置规则序列的相关信息,我们这里只有一个通道,并且是单次转换的,所
以设置规则序列中通道数为 1(ADC_SQR1[23:20]=0000),然后设置通道 1 的采样周期(通过
ADC_SMPR2[5:3]设置)。
ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=0<<20; //只转换在规则序列1
ADC1->SMPR2&=~(7<<3); //通道1采样时间清空
ADC1->SMPR2|=7<<3; //通道1 239.5周期,提高采样时间可以提高采样精确度。
5) 开启 AD 转换器,并校准。
在设置完了以上信息后,我们就开启 AD 转换器,执行复位校准和 AD 校准,注意这两步
是必须的!不校准将导致结果很不准确。
ADC1->CR2|=1<<0; //开启AD转换器
ADC1->CR2|=1<<3; //使能复位校准
while(ADC1->CR2&1<<3); //等待校准结束
//该位由软件复位,硬件自动清除
ADC1->CR2|=1<<2; //开启AD校准
while(ADC1->CR2&1<<2); //等待校准结束
//该位由软件设置,校准结束后并由硬件自动清除
6) 读取 ADC 值。
在上面的校准完成之后, ADC 就算准备好了。接下来我们要做的就是设置规则序列 1 里面
的通道(通过 ADC_SQR3[4:0]设置),然后启动 ADC 转换。在转换结束后,读取 ADC1_DR 里
面的值就是了。
u16 Get_Adc(u8 ch)
{
//设置转换序列
ADC1->SQR3&=0XFFFFFFE0; //规则序列1 通道ch
ADC1->SQR3|=ch;
ADC1->CR2|=1<<22; //启动规则转换通道
while(!(ADC1->SR&1<<1)); //等待转换结束
return ADC1->DR; //返回转换值
}
这里还需要说明一下 ADC 的参考电压, STM32F103RCT6,该芯片没有外部参考电压引脚, ADC 的参考电压直接取自 VDDA,也就是 3.3V。
三、ADC应用举例

1、ADC做触摸按键
2、ADC温度检测,NTC热敏电阻
四、参考文献

https://wenku.baidu.com/view/485726efeff9aef8951e064c.html
STM32 中文参考手册
正点原子 STM32寄存器版

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在STM32微控制器上,我们可以通过触摸屏虚拟按键来实现翻页功能。虚拟按键是在触摸屏上显示的一个图标,用户可以通过触摸屏幕上对应的位置进行操作,而无需使用物理按键。 要实现触摸屏虚拟按键翻页功能,我们可以按照以下步骤进行: 1. 首先,我们需要初始化并设置触摸屏的驱动程序。使用STM32的相应外设模块来读取触摸信息,如ADC或SPI。 2. 在虚拟按键的位置标定好按下的区域,并设定翻页动作的触发条件。可以通过坐标比较或者区域检测算法来完成。 3. 当用户通过触摸屏按下虚拟按键时,驱动程序会接收到触摸信息并进行处理。根据设定的触发条件,检测到用户按下了翻页的虚拟按键。 4. 一旦检测到翻页的触发条件,我们可以调用相应的翻页函数进行动作的实现。这个函数可以根据当前页面的状态进行翻页的处理,例如向前翻页或向后翻页。 5. 在翻页函数中,我们可以更新当前页面的显示内容,以及进行其他需要的操作。例如,可以更新显示的图片、改变文字的内容等。 6. 最后,我们需要将更新后的页面数据发送到显示屏上,让用户能够看到所翻页后的最新内容。 总之,通过合适的触摸屏驱动程序和翻页函数,以及在虚拟按键位置区域的设定和触发条件的判断,我们可以实现在STM32微控制器上使用触摸屏虚拟按键来进行翻页功能。 ### 回答2: STM32是一种嵌入式微控制器,在触摸屏上实现虚拟按键翻页功能是可行的。 首先,需要与触摸屏模块进行通信,这可以通过SPI、I2C或USART等接口实现。接下来,我们需要在STM32的固件中编写代码来处理触摸事件以及翻页功能。 在代码中,我们可以使用触摸屏驱动库来获取触摸事件的信息,如坐标、压力等。然后,我们可以将触摸事件与虚拟按键的位置进行比较,判断是否需要进行翻页操作。 例如,我们可以设置两个虚拟按键,一个是“上一页”按钮,另一个是“下一页”按钮。当用户点击“上一页”按钮时,我们可以将当前页数减一,并在屏幕上显示上一页的内容。反之,当用户点击“下一页”按钮时,我们可以将当前页数加一,并显示下一页的内容。 为了实现翻页功能的良好体验,我们可以添加一些额外的逻辑,例如限制滑动距离、增加触摸灵敏度、添加动画效果等。这些可以通过调整代码中的参数来实现。 总的来说,STM32可以通过与触摸屏模块的交互,实现触摸屏虚拟按键翻页功能。在编写代码时,我们需要处理触摸事件并与虚拟按键进行对比,以实现页面的翻转。此外,我们还可以添加一些额外的逻辑来改善用户体验。 ### 回答3: STM32是一款广泛应用于嵌入式系统的微控制器系列,它具有强大的性能和丰富的外设资源。在STM32触摸屏应用中,虚拟按键翻页是一种常见的操作方式。 通常情况下,触摸屏虚拟按键翻页可以通过以下步骤实现: 1. 英寸虚拟按键的布局:在屏幕上绘制两个矩形区域,分别表示上一页和下一页的虚拟按键。 2. 触摸触摸检测:通过STM32触摸屏外设模块,实时检测触摸屏的触摸事件。 3. 事件处理:当检测到触摸事件时,STM32会获取触摸点坐标,并判断该坐标是否在虚拟按键的矩形区域内。 4. 翻页操作:如果触摸点在上一页虚拟按键的矩形区域内,则执行上一页的翻页操作;如果在下一页虚拟按键的矩形区域内,则执行下一页的翻页操作。 5. 页面更新:翻页操作完成后,更新屏幕上显示的内容,使用户能够看到新的页面。 在上述步骤中,STM32触摸屏外设模块起着关键的作用。它能够实时检测触摸事件,并提供触摸点的坐标信息。通过编程将触摸点的坐标与虚拟按键的矩形区域进行比较,可以确定用户点击的是哪个虚拟按键,从而执行相应的翻页操作。 总之,STM32触摸屏虚拟按键翻页是一种方便实用的操作方式,通过编程实现触摸事件检测和翻页操作,能够提供良好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_38960013

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值