利用光电开关,控制LED亮灭
1. 任务分析
光电开关如何工作
开发板上的光电开关
有外部上拉电阻,这里GPIO配置的是浮空输入
PE15——PB2
此部分就是光电开关,当没有物体遮挡时,该点为低电平。
无遮挡时,LED灯点亮
有遮挡时,LED灯熄灭。
2. GPIO硬件框架
保护二极管
此处的两个二极管为保护二极管,上方VDD_FT的电位为3.3V(FT代表5V容忍),下方的VSS电位为0V。
以输入状态为例,我们可以分析一下保护二极管的具体效果。
1. 当I/O引脚输入5V时,会经过上方的保护二极管,由于电流过大,会将该二极管烧毁,烧毁后无法起到保护效果,5V就会将内部电路烧毁,因此,在输入引脚前需要接入一个电阻以减小电流。
2. 此时再次输入带有电阻减小电流后的5V时,由于5V大于3.3V,此时上方的保护二极管导通(二极管单向导电性:正极电压 > 负极电压,导通,负极电压 > 正极电压,截止),导通时,二极管两端的电压会被“钳位”,所谓钳位,就是限制电压不超过VDD(导通压降0.3V),因此交点处输入的电压就被限制在3.3V。
3. 当输入小于0V时,由于输入电压小于VSS,下方的保护二极管会导通,也会起到钳位作用,限制电压不低于VSS(导通压降0.3V),因此交点处输入的电压就限制在0V。
简单来说,两个保护二极管的作用就是将输入的电压稳定在3.3V~0V之间。
保护二极管是一种弱保护,不能完全依赖。
上拉电阻与下拉电阻
上下拉电阻的阻值在30K~50KΩ之间,我们一般称之为弱上下拉电阻。
由欧姆定律可知,如果想使用这个VDD(3.3V)和上拉电阻(40K),最后得到的电流在0.0825mA左右,由于电流过小,因此被叫做弱上下拉电阻。
上拉电阻也有一定的钳位作用,同时上拉电阻可以将电路的输入或输出保持在一个特定的电平,增强输出引脚的驱动能力。
上拉电阻提升电路驱动能力原因
由上图可见,接入上拉电阻后该点电压反而增加,这是因为在单片机内部,可以简化为下图状态:
接入上拉电阻后,由于连接的都是5V,所以可以视为两个电阻并联,并联后他们的总电阻会减小,根据分压原理,上面的电阻小了,下面的电阻就能分到更大的电压。
本质上说,其增强能力就是让上拉电阻与单片机内的内阻并联,减小这部分整体阻值。
下拉电阻同样具有钳位作用,也可以让信号稳定在0V,同时可以更方便的更改输入的高低电平。
下拉电阻稳定信号、便捷更改电平原因
内部结构可以简化为上图,当不使用下拉电阻直接接地时,也可以稳定为低电平,但此时如果想输出一个高电平,就无法实现。
当接入了下拉电阻后,由于三极管内部阻值过大,接入的电阻根据串联分压原理,电阻大小可以忽略不计,同时电压也基本趋近于0。
此时按键不按下,信号稳定在0V低电平,按键按下接入5V输入时,也可以起到钳位高电平的作用。可以让信号在高低电平间切换。
施密特触发器
施密特触发器可以将一个模拟信号波形整型为数字电路能处理的方波波形。(整形)
施密特触发器和一般比较器不同的点在于,它可以有两个参考电压,分别是正向阈值电压和反向阈值电压。
1. 输入电压 > 正向阈值电压(0.7*VDD),输出高电平;
2. 输入电压 < 负向阈值电压(0.3*VDD),输出低电平;
3. 负向阈值电压 < 输入电压 < 正向阈值电压,输出不变。
经过处理后可以得到0101的信息,将该信息存入输入数据寄存器,就可以使用CPU进行读出。
输入模式
浮空输入
IO端口 - 施密特触发器 - 输入数据寄存器 - 读
通俗讲就是让管脚什么都不接,悬空着。
此时VDD和VSS所在路径的两个开关同时断开。因为没有上拉和下拉,所以当IO口没有接输入的时候,此时的电平状态会是一个不确定的值,完全由外部输入决定。
由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的,易受干扰。
优势:
这一种输入模式的电平会完全取决于外部电路而与内部电路无关。
缺点:
在没有外部电路接入的时候,IO脚浮空会使得电平不确定
应用:
该模式是STM32复位之后的默认模式,一般用作对开关按键的读取或用于标准的通讯协议,比如IIC、USART的等。
上拉输入
IO端口 - 上拉电阻 - 施密特触发器 - 输入数据寄存器 - 读
输入的电平不会因上下浮动而导致输入信号不稳定,当外部没有信号输入时,上拉电阻会将输入信号钳在高电平,此时引脚始终读到高电平信号。
注意:上拉和下拉电阻电路的开关在实际应用中一般使用MOS管来代替开关。
MOS管一般又叫场效应管,与二极管和三极管不同,二极管只能通过正向电流,反向截止,不能控制,三极管通俗讲就是小电流放大成受控的大电流,MOS管是小电压控制电流的。
MOS管(金属氧化物半导体场效应晶体管)是一种三端设备,由源极、栅极和漏极组成。MOS管的导电性主要由栅极上的电场控制。当栅极和源极之间的电压增加时,栅极和漏极之间的电场会改变,从而调节了漏极和源极之间的电流流动。
由于栅极与源极之间的氧化层非常薄,因此栅极上的电场可以很容易地改变氧化层下方的导电层的电荷密度,进而控制MOS管的导通与截止状态。当栅极电压高于阈值电压时,MOS管处于导通状态,漏极和源极之间可以流动电流。而当栅极电压低于阈值电压时,MOS管处于截止状态,电流无法流过。
因此,MOS管可以通过调节栅极电压来控制漏极和源极之间的电流,从而实现小电压控制电流的功能。这使得MOS管在许多应用中非常有用,例如数字电路和功率放大器等。
下拉输入
IO端口 - 下拉电阻 - 施密特触发器 - 输入数据寄存器 - 读
输入的电平不会因上下浮动而导致输入信号不稳定,当外部没有信号输入时,下拉电阻会将输入信号钳在低电平,此时引脚始终读到低电平信号。
模拟输入
IO端口 - 片上外设模块(电压信号)
信号进入后不经过上拉电阻或者下拉电阻,关闭施密特触发器,经由另一线路把电压信号传送到片上外设模块。 所以可以理解为模拟输入的信号是未经处理的信号,是原汁原味的信号。
应用:当 GPIO 引脚用于 ADC 采集电压的输入通道时,则需要选择“模拟输入”功能,因为经过施密特触发器后信号只有 0、1 两种状态,所以 ADC 外设要采集到原始的模拟信号,信号源输入必须在施密特触发器之前。
3. 任务实现
PB2
STM32CubeMX
keil
/* USER CODE BEGIN 3 */
SwitchStatus=HAL_GPIO_ReadPin(switch_GPIO_Port,switch_Pin);
if(SwitchStatus==0)
{
HAL_Delay(100);//100MS
if(SwitchStatus==0)
{
HAL_GPIO_WritePin(Status_GPIO_Port,Status_Pin,GPIO_PIN_SET);
}
}
else
{
HAL_GPIO_WritePin(Status_GPIO_Port,Status_Pin,GPIO_PIN_RESET);
}
}
/* USER CODE END 3 */
拓展
扩展板:使用按钮控制风扇旋转