【嵌入式 - 输出驱动电路Open Drain (开漏)和Push-Pull (推挽)】

本文详细介绍了Opendrain和Push-Pull两种输出驱动电路在数字电子中的应用,包括它们的工作原理、电路示例和适用场景。开漏适合多路连接和电平转换,而推挽适合驱动负载和高速通信。在代码控制中,两者在设置和控制输出方面有所不同。
该文章已生成可运行项目,

定义

Open drain 和 push-pull 是两种常见的输出驱动电路。它们在数字电子电路中用于控制信号的输出。让我逐一解释它们:
在这里插入图片描述

1. Open Drain (开漏):

  • Open drain 输出端通常连接到地 (GND) 或者一个高电阻 (pull-up) 上。
  • 当输出信号为逻辑高电平时,输出端是高阻态,此时输出端相当于一个断路。
  • 当输出信号为逻辑低电平时,输出端接地,此时输出端相当于一个导通的电阻。
  • 这种结构允许多个开漏输出器件通过共享一个上拉电阻来实现多路连接。

2. Push-Pull (推挽):

  • Push-pull 输出端可以提供两种状态:高电平和低电平。
  • 当输出信号为逻辑高电平时,输出端提供正向电流,将输出端拉到高电平。
  • 当输出信号为逻辑低电平时,输出端提供反向电流,将输出端拉到低电平。
  • 这种结构能够提供更高的输出电流和更快的切换速度,适用于需要驱动负载的场景。

在选择开漏和推挽输出时,需要考虑电路设计的需求。开漏输出适合需要多个设备共享一个信号线的情况,而推挽输出则更适合需要驱动负载或需要高速切换的情况。

输出电路的示意图

Open Drain (开漏) 输出电路示意图:

          Vcc        R_pull-up
           |           |
           +-----------+--- Output (Open Drain)
           |
           +--- Signal

在这个示意图中,当输出为逻辑低电平时,Output 端将连接到地;当输出为逻辑高电平时,Output 端高阻态,相当于一个断路。

Push-Pull (推挽) 输出电路示意图:

          Vcc
           |
           +-------> Output (Push)
           |
           |
           +-------> Output (Pull)
           |
           +--- Signal

在这个示意图中,当输出为逻辑低电平时,Push 输出端提供正向电流,将输出端拉到低电平;当输出为逻辑高电平时,Pull 输出端提供反向电流,将输出端拉到高电平。

使用场景

当涉及到选择开漏 (open drain) 或者推挽 (push-pull) 输出电路时,通常需要考虑电路的具体要求以及所驱动的负载类型。

开漏 (Open Drain) 输出电路:

使用场景:

  1. 总线通信:开漏输出电路常用于串行通信总线,如 I2C 和 SMBus 等,因为多个设备可以共享同一信号线,并且可以通过上拉电阻来实现多路连接。
  2. 电平转换:当需要将逻辑电平从一个电压域转换到另一个电压域时,开漏输出可以通过外部上拉电阻来实现电平转换。
  3. 开关控制:开漏输出可以用于控制开关或驱动栅极控制器 (Gate Driver)。

案例:

  1. I2C 总线:在许多微控制器和传感器之间使用的 I2C 总线上,通常会使用开漏输出电路。
  2. 电源电池保护:在电池供电电路中,为了实现低功耗的电池保护电路,开漏输出可用于控制电源开关和警报。
  3. 舵机驱动:开漏输出可用于控制舵机的方向,通过外部电路来驱动舵机。

推挽 (Push-Pull) 输出电路:

使用场景:

  1. 驱动负载:推挽输出电路能够提供较大的输出电流,适合驱动需要较高电流的负载,如电机、LED 灯带等。
  2. 高速通信:推挽输出电路通常具有更快的切换速度,适合用于高速通信接口,如 UART、SPI 和 GPIO 等。
  3. 功率放大器:在音频放大器和功率放大器中,推挽输出电路可用于提供对地和对供电电压的输出。

案例:

  1. LED 控制:推挽输出电路可以直接驱动 LED 灯,控制 LED 的亮度和闪烁。
  2. 直流电机驱动:推挽输出电路可以用于控制直流电机的转向和速度。
  3. 蜂鸣器控制:推挽输出电路可以用于控制蜂鸣器的音调和持续时间。

在实际设计中,根据具体的需求和应用场景选择合适的输出电路是非常重要的。

代码控制区别

在代码控制中,使用开漏输出电路与使用推挽输出电路相比,可能会有一些不同之处,主要体现在输出状态的设置和控制上。

对于开漏输出 (Open Drain):

  1. 设置输出状态:在代码中,需要将输出引脚设置为开漏输出模式,通常通过对相应的寄存器或库函数进行配置来实现。例如,在许多微控制器中,可以使用特定的寄存器位或库函数来配置引脚为开漏输出模式。

  2. 控制输出电平:由于开漏输出只能拉低输出端,所以在代码中,要使输出端达到逻辑高电平时,需要通过将引脚配置为输入状态,外部上拉电阻会拉高输出电平;要使输出端达到逻辑低电平时,直接设置输出端为逻辑低电平即可。

  3. 处理输出冲突:在多个设备共享同一信号线的情况下,可能会发生输出冲突。在代码中,需要进行冲突检测和处理,例如等待其他设备释放信号线,或者在适当的时机重新配置输出模式。

对于推挽输出 (Push-Pull):

  1. 设置输出状态:与开漏输出相比,推挽输出的设置通常更直接,只需将输出引脚配置为推挽输出模式即可。

  2. 直接控制输出电平:推挽输出可以直接控制输出端的电平,无需额外的上拉电阻。

  3. 适用于单方向通信:推挽输出更适合单方向通信,因为它可以直接提供逻辑高和逻辑低电平。

总的来说,在代码控制中,开漏输出需要更多的额外设置来处理输出端的电平,而推挽输出相对更直接。因此,在选择输出模式时,需要根据具体的应用场景和需求来决定使用哪种输出电路。

英飞凌XMC代码示例

#include <xmc_gpio.h>

int main() {
    // 初始化 GPIO 模块
    XMC_GPIO_Init(XMC_GPIO_PORT1, 0, &((const XMC_GPIO_CONFIG_t){ .mode = XMC_GPIO_MODE_OUTPUT_OPEN_DRAIN }));

    while(1) {
        // 将 P1.0 输出置为逻辑低电平
        XMC_GPIO_SetOutputLow(XMC_GPIO_PORT1, 0);

        // 延时一段时间
        for (volatile uint32_t i = 0; i < 1000000; i++);

        // 将 P1.0 输出置为逻辑高电平
        XMC_GPIO_SetOutputHigh(XMC_GPIO_PORT1, 0);

        // 延时一段时间
        for (volatile uint32_t i = 0; i < 1000000; i++);
    }

    return 0;
}

这段代码首先初始化了 P1.0 引脚为开漏输出模式。然后进入一个无限循环,在循环中将 P1.0 输出置为逻辑低电平,延时一段时间,然后将 P1.0 输出置为逻辑高电平,再次延时。这样循环下去,就可以实现周期性地在 P1.0 引脚输出高低电平。

本文章已经生成可运行项目
### Open Drain 输出模式的工作原理 Open Drain输出模式是一种常见的GPIO配置方式,其核心特点在于**仅能下拉信号线至低电平,而无法主动驱动高电平**。具体来说,在Open Drain结构中,只有底部的晶体管(通常是NMOS)用于控制输出状态。当该晶体管导通时,输出为低电平;当晶体管关断时,输出端呈现高阻态,此时需要外部上拉电阻或内部集成的上拉电阻将信号线拉至高电平[^2]。 由于这种特性,Open Drain输出只能“吸收”电流(sink current),而不能“提供”电流(source current)。为了实现高电平输出,必须在电路设计中引入上拉电阻。若硬件IC内部已集成上拉电阻,则可通过寄存器配置启或关闭该功能;否则需在PCB设计中添加外部上拉电阻[^4]。 此外,多个Open Drain输出可以连接到同一根信号线上,并通过一个共用的上拉电阻实现“线与”逻辑(Wired-OR),即任意一个输出拉低即可使整个信号线处于低电平状态。这种机制广泛应用于I²C、SMBus等总线通信中,以实现多设备共享信号线的功能[^3]。 ### Open Drain 输出模式的配置方法 在嵌入式系统中,Open Drain模式通常通过配置GPIO控制寄存器中的特定位来启用。例如,在ARM架构的MCU中,可以通过修改GPIOx_MODERGPIOx_OTYPER寄存器来选择输出类型: ```c // 假设使用STM32系列MCU,设置PA0为Open Drain输出模式 GPIOA->MODER &= ~(0x3 << (0 * 2)); // 清除原有模式 GPIOA->MODER |= (0x1 << (0 * 2)); // 设置为通用输出模式 GPIOA->OTYPER |= (1 << 0); // 设置为Open Drain模式 ``` 在Linux用户空间,某些平台提供了sysfs接口用于动态更改GPIO配置,如: ```bash # 设置GPIO17为输出模式 echo out > /sys/class/gpio/gpio17/direction # 启用Open Drain模式(如果支持) echo open_drain > /sys/class/gpio/gpio17/drive_mode ``` 在FPGA发中,Xilinx Vivado工具链允许通过TCL脚本指定引脚的电气属性,包括输出类型: ```tcl set_property -dict {DRIVE_GROUP my_output_pin DRIVE_TYPE OPEN_DRAIN} [get_ports my_output] ``` 这些配置方式均依赖于具体的硬件平台是否支持Open Drain输出及其对应的寄存器或API接口。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

六月悉茗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值