上拉/下拉电阻 和 开漏/推挽输出 之间的关系
文章目录
- [`上拉/下拉电阻 和 开漏/推挽输出 之间的关系`](#
上拉/下拉电阻 和 开漏/推挽输出 之间的关系
) -
- [`上拉电阻 & 下拉电阻`](#
上拉电阻 & 下拉电阻
) - [`开漏输出 & 推挽输出`](#
开漏输出 & 推挽输出
) -
- `推挽输出`
-
- [`什么是 " 推挽 "?`](#
什么是 “ 推挽 ”?
)
- [`什么是 " 推挽 "?`](#
- `开漏输出`
-
- [`什么是 " 开漏 "`](#
什么是 “ 开漏 ”
) - `什么情况下使用开漏模式?`
- `开漏输出的应用`
- [`什么是 " 开漏 "`](#
- [`上拉电阻 & 下拉电阻`](#
- `如果对你有帮助,就点赞收藏把!(。・ω・。)ノ♡`
很常见的一个GPIO口配置
c
GPIO_InitTypeDef gpio_init_struct; /* 初始化结构体 */
__HAL_RCC_GPIOB_CLK_ENABLE(); /* GPIOB时钟使能 */
gpio_init_struct.Pin = GPIO_PIN_5; /* PB5引脚 */
gpio_init_struct.Mode = GPIO_MODE_OUTPUT_PP; /* 推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
HAL_GPIO_Init(GPIOB, &gpio_init_struct); /* 初始化LED0引脚 */
gpio_init_struct.Pin = GPIO_PIN_6; /* PB6引脚 */
HAL_GPIO_Init(GPIOB, &gpio_init_struct); /* 初始化LED1引脚 */
GPIO八种模式 | 特点及应用 |
---|---|
输入浮空 | 输入用,完全浮空,状态不定 |
输入上拉 | 输入用,用内部上拉,默认是高电平 |
输入下拉 | 输入用,用内部下拉,默认是低电平 |
模拟功能 | ADC、DAC |
开漏输出 | 软件IIC的SDA、SCL等 |
推挽输出 | 驱动能力强,25mA(max),通用输出 |
开漏式复用功能 | 片上外设功能(硬件IIC的SDA、SCL引脚等) |
推挽式复用功能 | 片上外设功能(SPI的SCK、MISO、MOSI引脚等) |
上拉电阻 & 下拉电阻
STM32 F1的IO结构图
STM32 F4/F7/H7的IO结构图
上拉电阻
上拉电阻作用:解决浮空状态的不确定性,将输出压钳位高电平
上拉电阻原理
芯片内部可以简略等效成mos管(Q1)表示输出
Q1 | 输出 |
---|---|
打开 | 低电平 |
关闭 | 浮空/高阻态 |
也就是当mos管(Q1)关闭时,输出是不知道,相当于什么都没接(浮空/高阻态)
这就相当于是一个未知不可控的因素,这是让人不能接受。
所以我们需要接上拉电阻
Q1 | 输出 |
---|---|
打开 | 低电平 |
关闭 | 高电平 |
如此当mos管(Q1)关闭时,输出就被钳位在高电平
也可以这么理解
并联电阻使得上半部分阻值减少
而下半部分阻值无穷大
故而5V电压全加在下半部分
由此将输出电压拉高
上拉电阻如何取值?
最靠谱的做法就是,用示波器来看,找打合适的阻值
应用 | 取值 |
---|---|
只用作控制开关 | 取10K-100K |
驱动PWM / IIC等通讯 | R1取1K-10K |
阻值 | 优点 | 缺点 |
---|---|---|
上拉电阻小 | 驱动能力强 | 漏电流大 |
上拉电阻大 | 漏电流小 | 驱动能力弱 |
PS:漏电流 & 驱动能力
漏电流
MOS管打开时,就会产生如图的漏电流
这部分电流不仅会浪费掉,还会产生热量
电阻越小漏电流越大,发热越厉害
驱动能力
两个器件之间电平传输,一般会有寄生电容
当电平跳变的时候,例如低电平跳变成高电平
你以为的电平跳变
实际上的电平跳变
这就是寄生电容充电的过程,上拉电阻越大,充电越慢,驱动能力越弱
下拉电阻
下拉电阻作用:同样是解决浮空状态的不确定性,将输入电压钳位低电平
我们先将芯片内部等效成一个mos管(实际上应该是一个触发器)
虽然接的是5V电源,但由于N半导体和P半导体组成的PN结阻值太大,跟断开没什么区别
由于存在扩散电流,漂移电流,信号干扰等诸多因素
导致P半导体的电压漂浮不定,也就是输入电压不确定
对于一个精益求精的工程师来说,这怎么能忍,必须要排除一切不确定因素
当外接一个与地相连的电阻(下拉电阻),此时输入电压就是低电平了
那为什么不直接接地?
如果直接接地,也是将输入电压钳位在低电平
但是这样的话,就无法输入高电平了!!
默认情况,输入低电平
当有高电平连接时,输入高电平
开漏输出 & 推挽输出
一个GPIO口有可能的几种输出
状态 | Q1 | Q2 | 输出 |
---|---|---|---|
状态1 | 打开 | 关闭 | 高电平 |
状态2 | 关闭 | 打开 | 低电平 |
状态3 | 关闭 | 关闭 | 浮空/高阻态 |
状态4 | 打开 | 打开 | (短路烧毁) |
推挽输出
将 状态1 和 状态2 拿出来研究
什么是 " 推挽 "?
当Q1打开,Q2关闭时,输出高电平,如下图这个过程叫做推
当Q1关闭,Q2打开时,输出地电平,如下图这个过程叫做挽
开漏输出
什么是 " 开漏 "
将 状态2 和 状态3 拿出来看,可以发现,Q1都是关闭的,就可以等效成下图
只剩下Q2,而且Q2的漏极什么都没接,处于开路状态,这就是你为什么叫 " 开漏输出 "
什么情况下使用开漏模式?
GPIO需要给一个外部芯片输出一个高信号时
当GPIO输出的是5V,而外部芯片的使能电压是3.3V时
如果使用开漏输出,外部芯片就有可能会倍烧毁
此时就应该使用开漏输出
并且要接一个上拉电阻
这样高电平电压就由上拉电阻的电压决定了
Q2关闭时,输出高电平
Q2打开时,输出低电平
所以现在知道,为什么配置IO的时候,开漏输出要加上拉电阻的吧!!!
开漏输出的应用
多个IO口控制一个输出
Q2和Q4任意一个打开,都输出低电平
只有Q2和Q4都关闭,才输出高电平
Q2 | Q4 | 输出 |
---|---|---|
打开 | 关闭 | 低电平 |
关闭 | 打开 | 低电平 |
打开 | 打开 | 低电平 |
关闭 | 关闭 | 高电平 |
(1)、
(2)、
(3)、
(4)、
┈┈┈┈▕▔╲┈┈┈┈┈┈┈ ┈┈┈┈▕▔╲┈┈┈┈┈┈┈ ┈┈┈┈▕▔╲┈┈┈┈┈┈┈┈
┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈
┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈
▂▂▂▂╱┈┈▕▂▂▂▂▏┈ ▂▂▂▂╱┈┈▕▂▂▂▂▏┈ ▂▂▂▂╱┈┈▕▂▂▂▂▏┈┈
▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈
▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈
▔▔▔▔╲▂▂▕▂▂▂▂▏┈ ▔▔▔▔╲▂▂▕▂▂▂▂▏┈ ▔▔▔▔╲▂▂▕▂▂▂▂▏┈┈