STM32-GPIO输入(四)

GPIO输入

分别是光敏电阻传感器、热敏电阻传感器、对射式红外传感器、反射式红外传感器

电阻会随外界的模拟量变化而变化。比如光线越强,光敏电阻的阻值就越小。温度越高,热敏电阻的阻值就越小。红外光线越强,红外接收管的阻值就越小。但是电阻的变化不容易直接被观察,所以我们通常将传感器元件与定值电阻进行串联分压,这样就可以得到模拟电压的输出了。对电路来说,检测电压就非常容易了。另外这个模块还可以通过电压比较器来对这个模拟电压进行二值化,这样就可以得到数字电压输出了。

那我们看一下下面这个电路图,这个就是传感器模块的基本电路。我们先看一下这个部分,这个 N1 就是传感器元件所代表的可变电阻,它的阻值可以根据环境的光线温度等模拟量进行变化。上面这个 R1 是和 N1 进行分压的定值电阻, R1 和 N1 串联,一端接在 VCC 正极,一端接在接地负极,这就构成了基本的分压电路。左边这个 C2 是一个滤波电容啊,它是为了给中间的电压输出进行滤波的,用来滤除一些干扰,保证输出电压波形的平滑。一般我们在电路里遇到这种一端接在电路中,另一端接地的电容,都可以考虑一下这个是不是滤波电容的作用。如果是滤波电容的作用,那这个电容就是用来保证电路稳定的,并不是电路的主要框架。

这时候我们在分析电路的时候,就可以先把这个电容给抹掉,这样就可以使我们的电路分析更加简单。那我们把这个电容抹掉,整个电路的主要框架就是定值电阻和传感器电阻的分压电路了。

在这里可以用分压定理来分析一下传感器电阻的阻值变化对输出电压的影响。当然我们还可以用上下拉电阻的思维来分析,当这个 N1 阻值变小时,下拉作用就会增强,中间的 AO 端的电压就会拉低。极端情况下, N1 阻值为 0, AO 输出被完全下拉,输出 0 伏。当 N1 阻值变大,下拉作用就会减弱,中间的引脚由于 R1 的上拉作用,电压就会升高。极端情况下, N1 阻值无穷大,相当于断路,输出电压被 R1 拉高至 VCC。

这是用上下拉电阻来分析电路的,我可以举个例子来说明上下拉电阻的工作逻辑哈。 AO 这个输出端,你可以把它想象成一个放在屋里的水平杆子, R1 上拉电阻相当于拴在屋顶的弹簧,将杆子往上拉。 N1 下拉电阻相当于拴在地面的弹簧,将杆子往下拉。这个电阻的阻值越小,弹簧的拉力就越强哈。这个杆子的高度就相当于电路中的电压。如果只有上拉弹簧或者下拉弹簧,那杆子肯定被拉到了屋顶或者地面,在电路中就相当于中间点的电压为 VCC 或者接地。那当两个弹簧相互拉扯的时候,中间的输出端就会像拉力强的一端偏移。至于偏移多少,就取决于两个弹簧的弹力之差了。如果上下拉弹簧的弹力一致,则杆子会处于居中的位置,也就是电路输出二分之 VCC 的电压。

如果上面的阻值小,拉力强,那输出电压就会变高,反之下面的阻值小,输出电压就会变低。如果阻值为 0,在电路中就是短接的状态,那就相当于拉力无穷大了。如果上下拉电阻的阻值都为 0,就是两个无穷大的力在对抗,在电路中呈现的状态就是电源短路啊,所以这种情况应该避免。

这个上拉电阻和下拉电阻在单片机电路中会经常出现哈,比如弱上拉 、弱下拉,强上拉、强下拉的。这里强和弱就指电阻阻值的大小,也就是这个弹簧弹力的大小。上拉和下拉就指是接到 VCC 还是接地,也就是这个杆子是拉向屋顶还是拉向地面。最终的输出电压就是在弹簧拉扯下最终杆子的高低。那大家以后再遇到上拉电阻和下拉电阻的分析,就可以尝试一下用我这个杆子和弹簧的模型来分析一下

那我们回到这个电路,继续来看,在这两个电阻的分压下, AO 就是我们想要的模拟电压输出了。所以这里可以看到,这个 AO 电压就直接通过这个排针输出了,这就是 AO 电压的由来,仅需两个电阻分压即可得到。

那接下来这个模块还支持有数字输出,这个数字输出就是对 AO 进行二值化的输出,这里二值化是通过这个芯片 LM393 来完成的。这个 LM393 是一个电压比较器芯片,里面有两个独立的电压比较器电路。然后剩下的是 VCC 和接地供电。那我们 VCC 就接到电路的 VCC, 接地也接到了电路的接地。这里有个电容,是一个电源供电的滤波电容。这个电压比较器其实就是一个运算放大器啊。有关运算放大器的知识,我在 51 单片机视频的 ADD A 那一集有讲过啊。

那我画一下这个运算放大器当做比较器的情况。当这个同相输入端的电压大于反相输入端的电压时,输出就会瞬间升为最大值,也就是输出接 VCC。

反之,当同相输入端的电压小于反相输入端的电压时,输出就会瞬间降为最小值,也就是输出接接地。

这样就可以对一个模拟电压进行二值化了。我们看一下实际的应用啊,这里同样输入端, IN 正接到了 AO 这里,就是模拟电压端, IN 负呢接了一个电位器,这个电位器的接法也是分压电阻的原理哈,拧动电位器, N 负就会升在一个课调的阈值电压

两个电压进行比较,最终输出结果就是 DO 数字电压输出, DO 最终就接到了引脚的输出端,这就是数字电压的由来。

然后右边这里还有两个指示灯电路,左边的是电源指示灯,通电就亮啊,右边的是 DO 输出指示灯,它可以指示 DO 的输出电平,低电平点亮,高电平熄灭。

那右边 DO 这里还多了个 R5 上拉电阻啊,这个是为了保证默认输出为高电平的。然后就是 P1 的排针。分别是 VCC、 GND、 DO 和 AO。

那右上角这个图就是四个传感器模块了。对于光敏电阻传感器来说,这个 N1 就是光敏电阻。对于热敏电阻传感器来说,这个 N1 就是热敏电阻。对于这个红外传感器来说,这个 N1 就是一个红外接收管。当然对应还会多一个点亮红外发射管的电路在这里

发射管发射红外光,接收管接收红外光,模拟电压就表示的是接收光的强度。那这个模块的这里啊,电位器是直接换成了两个电阻进行分压啊,这样数字输出就是固定阈值的二值化了。这个模块通常用来检测通断啊,所以阈值也不需要过多的调整。

那最后一个模块也是一个红外发射管和接收管啊,只不过它是向下发射红外光,然后检测反射光的。这个可以用来做寻迹小车。

接下来我们就来看一下按键和传感器模块的硬件电路吧。

接下来我们就来看一下按键和传感器模块的硬件电路吧。首先按键这里我给了四种接法,上面两个是下接按键的方式,下面两个是上接按键的方式。

一般来说我们的按键都是用上两种方式啊,也就是下接的方式。这个原因跟 LED 的接法类似啊,是电路设计的习惯和规范。那我们先来看一下第一个图。这种接法是按键的最常用的接法了。在这里随便选取一个 GPIO 口,比如 PA0,然后通过 K1 接到地。当按键按下时, PA0 被直接下拉到 GND, 此时读取 PA0 口的电压就是低电平。当按键松手时, PA0 被悬空,悬空会出现什么情况呢?就是引脚的电压不确定,对吧?所以在这种接法下,必须要求 PA0 是上拉输入的模式,否则就会出现引脚电压不确定的错误现象。如果 PA0 是上拉输入的模式,那我们之前讲了,引脚在悬空, PA0 就是高电平。所以这种方式下,按下按键引脚为低电平,松手引脚为高电平。

接着再看一下第二个图,相比较第一个图,在这里外部接了一个上拉电路,这个意思大家就清楚了吧?这个上拉大家可以想象成一个弹簧,把这个端口往屋顶上拉。当按键松手时,引脚由于上拉作用自然保持为高电平。当按键按下时,引脚直接接到 GND,也就是一股无穷大的力把这个引脚往下拉,那弹簧肯定对抗不了无穷大的力啊,所以引脚就为低电平。这种状态下,引脚不会出现悬空状态,所所以此时 PA0 引脚可以配置为浮空输入或者上拉输入。如果是上拉输入,那就是内外两个上拉电阻共同作用了啊,这时高电平就会更强一些,对应高电平就更加稳定啊。当然那这样的话,当引脚被强行拉到低时,损耗也就会大一些哈。

那接着第三个图, PA0 通过按键接到 3.3 伏,这样也是可以的哈,不过要求 PA0 必须要配置成下拉输入的模式。当按键按下时,引脚为高电平,松手时引脚回到默认值低电平。这要求单片机的引脚可以配置为下拉输入的模式啊,一般单片机可能不一定有下拉输入的模式,所以最好还是用上面的接法

那最后一种接法呢,就是在刚才的这种接法下面,再外接一个下拉电阻。这个接法 PA0 需要配作为下拉输入模式或者浮空输入模式,至于分析大家应该已经清楚了哈,我就不再细讲了。

那总结一下就是,上面这两种接法,按键按下时引脚是低电平,松手是高电平。

下面这两种接法,按键按下时是高电平,松手是低电平。

左边两种接法必须要求引脚是上拉或者下拉输入的模式,右边两种接法可以允许引脚是浮空输入的模式,因为已经外置了上拉电阻和下拉电阻啊。

一般我们都用上面两种接法哈,下面两种接法用的比较少。那到这里按键的硬件电路就介绍完了。

再看一下右边的传感器模块的电路。因为是使用模块的方案,所以电路还是非常简单的。这里 VCC 接 3.3 伏, GND 接 GND 用于供电。 DO 数字输出随便接一个端口啊,比如 PA0 用于读取数字量。 AO 模拟输出呢,我们之后学 ADC 模数转换器的时候再讲,现在还是不用接它哈。好那

51单片机中int占16位,stm32占32位

然后我们看一下右边,在这里写的是 C 语言, stdio 点 h 文件和 ST 对这些变量的重命名啊。因为左边这些名字比较长,而且这个 int 的位数根据系统的不同还有可能不一样。还有个就是这些名字有时候会名不对题哈,比如这个 char 本意是字符型数据的意思,按名字来说它就应该存放字符的啊,但是我们单片机通常用它来存放整数而不是字符。所以综上各种原因吧, C 语言和 ST 就给这些变变量换了个名字。

C 语言提供的有 stdint 这个头文件,使用了新的名字。比如 int 8 杠 t 就是 char 的新名字,表示的意思就是 8 位整形数据。右边加个杠 t 表示这是用 typedef 重新命名的变量类型。 typedef 是用来给变量类型重命名的。然后这里 unsigned char 的新名字就是 uint 8_ t 意思是无符号 8 位整形数据。然后 int 16_ t、 uint 16_ t、 int 32_ t、 uint 32_ t、 int 64_ t、 uint 64_ t 这些通过名字就知道意思了,就是 16 位整形、 32 位整形、 64 位整形的意思。那我们以后在写程序的时候就会按照他的推荐啊使用这些新的名字。那大家要知道他们代表的就是前面的这些数据类型。就是换个名字而已,我们打开这个程序来

相关推荐
我在人间贩卖青春2 小时前
ADC采集
stm32·adc
西城微科方案开发3 小时前
华润微(SEMICO)高速度低功耗的8位MCU——CS98P171 SOP8
单片机·嵌入式硬件
青鱼294 小时前
SysTick_Handler在裸机和RTOS中的区别
单片机·嵌入式硬件·rtos·systick_handler
我在人间贩卖青春4 小时前
SPI总线
stm32·spi
波特率1152005 小时前
单片机启动流程以STM32举例
stm32·单片机·嵌入式硬件·嵌入式·嵌入式软件
WeeJot嵌入式5 小时前
【串口】STM32串口DMA模式与收发不定长数据
stm32·单片机·嵌入式硬件
LCG元5 小时前
STM32实战:基于STM32F103的看门狗(IWDG/WWDG)应用与系统复位
stm32·单片机·嵌入式硬件
ytttr8735 小时前
STM32 USB HID 源码方案
stm32·单片机·嵌入式硬件
2502_911679146 小时前
是德科技N9000A CXA信号分析仪:经济型测试的性价比之选
单片机·嵌入式硬件