单片机软件开关(三极管)

实现一个可以软件控制的开关

背景:
之前做东西的时候会碰到这样的需求:用单片机去控制一些东西,如风扇和电机等,当然,现在大部分时候直接买一个驱动芯片就可以解决问题,但是为了节约成本,画pcb的时候,我们可以自己搭建一个电路。

想要用单片机的io口去控制一个东西,最关键的问题是我们单片机提供的电压和电流足不足以驱动负载,我们就需要使用三极管进行放大。先来看一下常识:

传统单片机一般为10ma左右,现在的单片机一般20-25ma
我的cpu风扇驱动的电流为0.18A,远远超过了单片机能够提供的电流,这时候就需要接一个外部的电源,但是电源的开关我们如果想用软件去操作,就离不开使用三极管。

在这里我推荐两个电路,一个是单个NPN的开关,另一个是一个NPN加一个PNP的开关:

单个NPN的开关
需要注意的是,负载接入NPN三级管中,负载应该接在集电极(就是上面),因为发射极(下面)的电压与集电极相比较小,相差的值是三极管的本身压降,即硅管0.7V,锗管0.3V。发射极电流是基级电流与集电极电流之和。
其中V3是单片机的io口,V1是电源,R2是负载(风扇)。
在这里插入图片描述
同样的如果手上没有NPN只有PNP的,将负载接在发射极就可以了。

一个NPN加一个PNP
下图中V4作为单片机的io口,V2作为电源,R5作为负载。
选用NPN(左边三极管)作为电路的开关,PNP来放大电流,当NPN导通时,R6接地,PNP(右边三极管)导通。R3应该要比R6大一些,因为R3直接接电源电流大放热更高,为了减小电流接一个相对大的电阻。
在这里插入图片描述
第二个电路是当时老师做实验给我们的,做出来的实物没有问题,当时单片机的io口是pwm输出口,pwm输出没有问题。这两个方案都可以解决软件控制开关的问题。
笔者在此记录一下,方便下次直接抄。

### 单片机控制NPN三极管开关电路原理及实现 #### 一、基本原理 单片机通过其I/O口输出高低电平信号,可以用来控制NPN三极管的工作状态。当单片机的I/O口输出高电平时,NPN三极管进入导通状态;而当I/O口输出低电平时,NPN三极管截止[^1]。 具体来说,在NPN三极管中,基极(B)、集电极(C)和发射极(E)之间的关系决定了它的开关特性。如果基极相对于发射极为正电压,并且该电压超过了开启电压(通常约为0.7V),则会有足够的电流流入基极使三极管导通,从而允许较大的电流流过集电极到发射极之间。此时,连接在集电极上的负载会被激活[^2]。 #### 二、典型应用电路设计 以下是利用单片机控制的一个简单NPN三极管开关电路实例: ```circuitikz \begin{circuitikz} \draw (0,0) node[nmos](nmos){} (nmos.G) -- ++(-1,0) coordinate(io); % Label IO pin of MCU ($(io)+(0,-0.5)$) node[below]{MCU I/O}; % Resistor from base to ground (io) to[R=$R_b$, *-*] (-1,-2) node[ground]{}; % Load connected between collector and Vcc (nmos.D) -- ++(0,2) node[vcc,label=above:$V_{CC}$]{} to[R=$R_L$,*-o] (nmos.S); end{circuitikz} ``` 在这个例子中: - **MCU I/O** 是指单片机的通用输入/输出端口。 - $ R_b $ 表示用于限流的基础电阻,防止过多电流损坏单片机三极管。 - 负载 ($ R_L $) 连接到三极管的集电极端子上,另一端接至电源正极。 #### 三、注意事项 1. 需要合理选择基础电阻($ R_b $),以确保有足够的驱动能力让三极管完全打开而不至于过度耗散功率于电阻之上[^4]。 2. 如果供电电压较高,则需特别注意保护措施以免超出单片机所能承受的最大额定值造成损害。 #### 四、实际案例分析 考虑这样一个场景:假设我们希望点亮LED灯泡并通过程序设定时间间隔闪烁效果。那么就可以按照上述方法构建硬件平台并编写相应固件代码如下所示: ```python import machine from time import sleep_ms # Define GPIO Pin Number For Controlling Transistor Base Current. pin_num = const(5) def init(): global led_pin # Initialize Digital Output On Specified Port With Initial State Low. led_pin = machine.Pin(pin_num,machine.Pin.OUT,value=False) if __name__ == '__main__': try: init() while True: # Turn ON LED By Setting High Level To The Base Of An NPN Bipolar Junction Transistors(BJT). led_pin.value(True) sleep_ms(500) # Turn OFF Again After Half A Second Delay Period Has Passed. led_pin.value(False) sleep_ms(500) except Exception as e: print(e) ``` 此脚本初始化指定编号的数据引脚为数字量输出模式,默认状态下保持关闭。接着在一个无限循环里交替改变这个引脚的状态——先是将其设置成逻辑‘1’使得对应的BJT处于饱和区进而连带触发外部设备动作;稍作停顿后再恢复原状即回到截止区域停止任何进一步操作直到下一次轮询到来为止。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

伤病不可救药

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

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

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

打赏作者

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

抵扣说明:

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

余额充值