单片机内部IO口保护电路及IO口电气特性以及为什么不同电压IO之间为什么串联一个电阻?

本文详细讲解了单片机IO口的二极管保护电路,阐述了当输入电压超过规定范围时,如5V或负电压,二极管如何限制IO口电压并保护内部电路。通过电压嵌位原理,解释了多余电压的承受者以及可能的电流限制。同时,提到了在不同电压芯片间通讯时,为何常需要串联电阻,并给出计算电阻值的例子。强调了电阻在保护IO口和防止过电流中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上图,这是华大的一个32位单片机IO口示意图,我们直接看框框里面的二级管,看看他们究竟是怎么保护的 

假设我们供电VDD = 3.3V

那么当我输入5V时候,是什么状态呢;当输入5V时,若果二极管压降是0.7V,那么IO肯定电压是嵌位在4V,当你输入4V时,IO电压就会被嵌位成3.3V

在假设当你输入负电压时,假设输入-5V时,IO就会被嵌位在-0.7V,如下图

那么看了上面解释,我们就在想不论是嵌位在4V或者嵌位在-0.7V,那它多余的电压被谁承受了呢?

比如实际5V信号输入嵌位成4V,那1V的电压谁在承受?我们都知道输入进来都是有内阻的,那么这剩余的1V电压疾苦是加在内阻上;如果要说我是理想的5V进来没有内阻,如果是这样5V输入进来,很有可能就会把二极管烧掉

所以经过上面解释我们就知道为什么所有单片机IO基本都是有着两个二极管保护电路了

下面我们在看下正常数据手册标写的电气极性

我们首显就看到VIN电压,它要求最大的是VCC+0.3 ,如果是3.3供电,那么最大的3.6V,那么我们就可以推算出他二极管的压降是0.3V不是0.7V;

当然现实很残酷,有时候电压就会有4V或者5V这种,所以厂家设计人员也很贴心,如果超过则合格电压那么也有挽留机会,就是输入电流就小一点,给点面子,到这里我们就很明白原来很多不同电压的芯片为啥IO之间通讯要加串联一个电阻来进行通讯,兄弟们这时候我们知道上面参数,那么电流是不是也知道最大不能超过5mA,那么这个电阻是不是也能选取了

eg:一个5V的测量芯片,现在3.3v供电的单片机要去读取IO数据获取数据,那么我们就要DATA交上串联一个电阻,避免烧坏我们的单片机IO口

那么我们就可以计算 R > (1.4v/5mA) = R > 280欧姆

那么到这里基本乐意知道为什么很多IO之间都串1K或者500欧姆了

 

 

 

 

### 使用STM32F103C8T6单片机IO测量电阻的方法 #### 通过ADC转换实现电阻测量 STM32F103C8T6具备内置的模数转换器(ADC),可以用于间接测量外部电阻。具体方法是构建分压电路,其中已知一个固定电阻R1和待测电阻Rx串联连接到电源电压Vcc之间,在这两者之间的节点接入ADC输入端子。 当电流流过这两个串联元件时,根据欧姆定律计算得出: \[ V_{out} = \frac{R_x}{R_1 + R_x} * V_{CC} \] 因此可以通过读取ADC值来获得\( V_{out} \),进而求解未知电阻Rx: \[ Rx = (\frac{V_{out}}{(V_{CC}-V_{out})}) * R_1 \] 为了提高精度,建议选择适当大小的标准电阻R1使得预期范围内的Rx能够使ADC采样得到中间区域的有效数值[^1]。 下面是简单的代码片段展示如何配置并使用ADC进行一次性的电阻测量操作(假设已经完成了必要的初始化工作): ```c #include "stm32f1xx_hal.h" // 定义使用的通道以及对应的GPIO引脚 #define ADC_CHANNEL GPIO_PIN_0 #define ADC_GPIO_PORT GPIOA void setup_adc(void){ __HAL_RCC_ADC1_CLK_ENABLE(); ADC_ChannelConfTypeDef sConfig; hadc.Instance=ADC1; HAL_ADC_Init(&hadc); sConfig.Channel = ADC_CHANNEL; sConfig.Rank = 1; sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES; if (HAL_ADC_ConfigChannel(&hadc, &sConfig) != HAL_OK){ Error_Handler(); } } uint16_t read_resistance(float known_resistor_value){ // 已知标准电阻值作为参数传入 uint32_t adc_raw_data; float voltage_ratio; float unknown_resistance; /* 开始AD转换 */ HAL_ADC_Start(&hadc); HAL_ADC_PollForConversion(&hadc, HAL_MAX_DELAY); adc_raw_data = HAL_ADC_GetValue(&hadc); HAL_ADC_Stop(&hadc); /* 计算实际电压比例 */ voltage_ratio=(float)(adc_raw_data)/4095*3.3; /* 根据公式计算目标电阻 */ unknown_resistance=voltage_ratio/(3.3-voltage_ratio)*known_resistor_value; return (uint16_t)unknown_resistance; } ``` 此程序段展示了基本框架,但在真实应用中还需要考虑更多细节比如噪声抑制、温度补偿等因素以提升准确性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值