关于开漏和推挽方式

本文详细介绍了漏开和推挽两种输出模式的工作原理及其应用场景。解释了如何通过配置寄存器来实现这两种模式,并强调了推挽模式适合输出而漏开模式需要配合上拉电阻使用的特点。

漏级开路即高阻状态,适用于输入/输出,其可独立输入/输出低电平和高阻状态,若需要产生高电平,则需使用外部上拉电阻或使用如LCX245等电平转换芯片。
有些朋友,尤其是未学过此方面知识的朋友,在实际工作中将I/O口设置为漏开,并想输出高电平,但向口线上写1后对方并未认出高电平,对于高阻状态来说,
正确的方法应是外加上拉电阻,上拉电阻的阻值=上拉电压/芯片引脚最大灌(拉)电流。

推挽方式可完全独立产生高低电平,推挽方式为低阻,这样,才能保证口线上不分走电压或分走极小的电压(可忽略),保证输出与电源相同的高电平,
推挽适用于输出而不适用于输入,因为若对推挽(低阻)加高电平后,I=U/R,I会很大,将造成口的烧毁。

对与C8051F的很多型号片子,将I/O口设置为推挽方式的做法为:

PnMDOUT=0xff,Pn=0x00,这样设置I/O口为推挽,并输出低电平(可降低功耗)
将I/O口设置为漏开方式的做法为:PnMDOUT=0x00,Pn=0xff,这样设置I/O口为漏开。
  
例外的情形是:连接到SDA,SCL,RX0(如果UART0工作
于方式0),RX1(如果UART1工作于方式0)的端口引脚总是被配置为漏极开漏方式,

而与PnMDOUT寄存器中对应位的设置值无关。
### 电路结构与工作原理 推挽输出由两个晶体管组成,分别是N沟道晶体管P沟道晶体管。当输入为高电平时,P沟道晶体管导通,N沟道晶体管截止,输出接近电源电压;当输入为低电平时,N沟道晶体管导通,P沟道晶体管截止,输出接近地线电平。这种结构使得推挽输出能够提供稳定的高低电平,适用于需要较强驱动能力的场合[^2]。 输出仅包含一个N沟道晶体管,其极直接作为输出端。当晶体管导通时,输出端接地,呈现低电平;当晶体管截止时,输出端悬空,需要外部上拉电阻连接到高电平,以确保输出端能够达到高电平状态。输出适合用于多设备共享同一总线的情况,如I2C通信协议中,通过外部上拉电阻实现信号传输[^3]。 ### 驱动能力与应用场景 推挽输出由于能够提供较强的驱动能力,因此适用于驱动大电流负载的应用,例如LED驱动、电机控制等。此外,推挽输出能够在高低电平之间快速切换,减少了信号延迟,适合高速应用。 相比之下,输出在输出高电平时依赖外部上拉电阻,因此输出电流能力较弱。然而,输出简化了驱动电路的设计,方便与不同电压等级的电路接口,广泛应用于需要电平转换或多主设备通信的总线系统中,如I2C总线通信中的SCLSDA引脚[^3]。 ### 噪声容限与功耗 推挽输出由于其结构特点,在高低电平之间切换时可能会产生较大的瞬态电流,从而增加功耗。不过,推挽输出具有较好的噪声抑制能力,因为其输出电平较为稳定。 输出在高电平时的电压水平取决于外部上拉电阻负载情况,因此可能不如推挽输出稳定,但在某些情况下可以通过选择合适的上拉电阻来优化噪声容限。此外,输出在低电平时晶体管导通,电流流过负载晶体管到地,此时功耗相对较低。 ### 代码示例 以下是一个简单的Python模拟推挽输出输出的逻辑行为示例: ```python class OutputDriver: def __init__(self, output_type): self.output_type = output_type self.high_voltage = 5.0 # 假设电源电压为5V self.low_voltage = 0.0 # 地电压为0V self.pull_up_resistor = 10000 # 上拉电阻值,单位欧姆 def set_output(self, state): if self.output_type == 'push-pull': if state == 'high': return self.high_voltage else: return self.low_voltage elif self.output_type == 'open-drain': if state == 'high': # 模拟外部上拉电阻的影响 return self.high_voltage * (self.pull_up_resistor / (self.pull_up_resistor + 1)) else: return self.low_voltage # 创建推挽输出实例 push_pull_driver = OutputDriver('push-pull') print("Push-Pull Output High:", push_pull_driver.set_output('high')) print("Push-Pull Output Low:", push_pull_driver.set_output('low')) # 创建输出实例 open_drain_driver = OutputDriver('open-drain') print("Open-Drain Output High:", open_drain_driver.set_output('high')) print("Open-Drain Output Low:", open_drain_driver.set_output('low')) ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值