为什么单片机接地电阻都是10千欧

本文探讨了大公司为何倾向于使用10K或4.7K电阻,涉及成本、功耗、内阻对单片机IO的影响,以及datasheet和设计工具的推荐。以STM32为例,解释了电阻在驱动电流和启动模式中的关键作用,并总结了4.7K-10K电阻在工程实践中的优选理由。

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

经验分析:

1.大公司有自己的物料库,考虑成本问题,直接统一用了10K或者4.7k

2.功耗问题,STM32系列单片机为例,驱动电流也就100ma多一点,3.3V上拉或者下拉,实际电阻耗费的电流也就0.3ma那样

3.内阻问题,单片机IO是有内阻的,所以上拉还是下拉都会起到分压作用。举个例子,boot引脚,如果分得的电压过高或者低,就会导致启动模式错误

4.datasheet或者设计者工具推荐阻值

5.还有一些其他的协议里 握手部分 注明了阻值

总结:工程经验推荐:4.7k-10k之间选择

<think>根据用户反馈,参考电阻R_REF为100千欧(之前代码中为10.0f,需要修改为100.0f)。同时,电阻表单位已经是千欧,因此无需转换。 另外,用户要求使用中文回答问题,并在最后提出3-5个相关问题。 修改点: 1. 将R_REF从10.0f改为100.0f 2. 注意电阻表是0~90度,共91个点 3. 在查表时,由于电阻表是单调递减的,所以当电阻值rt大于等于表头(0度对应的电阻)时,返回0度;当rt小于等于表尾(90度对应的电阻)时,返回90度。 4. 线性插值部分:在相邻两个温度点之间进行线性插值,温度间隔为1°C。 由于用户提到参考电阻100千欧,所以修改代码中的R_REF为100.0f。 重新编写代码并注意上述问题。</think>根据您提供的信息(参考电阻100千欧),更新后的温度转换代码如下: ```c #include <stdio.h> #include <stdint.h> // 电阻表 (单位: kΩ, 0°C ~ 90°C) const float resistance_table[91] = { 315.68, 302.706, 288.37, 274.773, 261.872, 249.63, 238.009, 226.976, 216.498, 206.545, 195.29, 188.105, 179.566, 171.449, 163.732, 156.394, 149.415, 142.776, 136.461, 130.451, 124.733, 119.289, 114.107, 109.173, 104.475, 100.0, 95.736, 91.674, 87.803, 84.114, 80.597, 77.243, 74.045, 70.994, 68.083, 65.306, 62.655, 60.125, 57.708, 55.401, 53.196, 51.09, 49.078, 47.154, 45.315, 43.556, 41.874, 40.264, 38.724, 37.251, 35.84, 34.488, 33.194, 31.955, 30.767, 29.629, 28.537, 27.491, 26.488, 25.525, 24.602, 23.716, 22.866, 22.049, 21.265, 20.513, 19.789, 19.095, 18.427, 17.785, 17.168, 16.575, 16.005, 15.456, 14.929, 14.421, 13.932, 13.462, 13.009, 12.573, 12.154, 12.154, 11.36, 10.985, 10.624, 10.035, 9.94, 9.616, 9.304, 9.003, 8.713 }; // 参数配置 #define V_REF 3.3f // 参考电压 (V) #define R_REF 100.0f // 参考电阻 (kΩ) 修改为100kΩ #define ADC_RES 4095 // ADC分辨率 (12位) // ADC值转温度函数 float adc_to_temperature(uint16_t adc_value) { // 1. ADC转电压 float voltage = (adc_value / (float)ADC_RES) * V_REF; // 2. 电压转电阻 (使用分压公式) if (voltage <= 0 || voltage >= V_REF) return -99; // 避免无效值 float rt = (R_REF * voltage) / (V_REF - voltage); // 热敏电阻阻值(kΩ) // 3. 查表找温度区间 if (rt >= resistance_table[0]) return 0.0f; // 低于量程下限 if (rt <= resistance_table[90]) return 90.0f; // 超过量程上限 // 查找电阻所在区间 (电阻表单调递减) for (int i = 0; i < 90; i++) { if (rt <= resistance_table[i] && rt >= resistance_table[i+1]) { // 4. 线性插值计算温度 float r_low = resistance_table[i]; float r_high = resistance_table[i+1]; return i + ((r_low - rt) / (r_low - r_high)); } } return -99; // 未找到匹配区间 } // 测试示例 int main() { // 测试点:25°C对应的电阻值约100kΩ // 计算对应电压:V = V_ref * (R_ref / (R_ref + Rt)) = 3.3 * (100/(100+100)) = 1.65V // ADC值 = (1.65 / 3.3) * 4095 ≈ 2047.5 uint16_t test_adc = 2048; float temp = adc_to_temperature(test_adc); printf("ADC值: %d\n", test_adc); printf("计算温度: %.2f °C\n", temp); return 0; } ``` ### 主要修改说明: 1. **参考电阻更新**: ```c #define R_REF 100.0f // 参考电阻设为100kΩ ``` 2. **电阻计算公式修正**: ```c float rt = (R_REF * voltage) / (V_REF - voltage); ``` 使用正确的分压公式计算热敏电阻值 3. **边界处理优化**: ```c if (voltage <= 0 || voltage >= V_REF) return -99; ``` 增加电压有效性检查 4. **线性插值简化**: ```c return i + ((r_low - rt) / (r_low - r_high)); ``` 由于温度间隔为1°C,插值系数直接作为温度增量 ### 电路连接示意图: ``` V_ref (3.3V) │ │ ├───[参考电阻 R_ref=100kΩ]─── ADC引脚 (测量点) │ │ │ │ └───[热敏电阻 Rt]─────────────┘ │ GND ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

姜浩鑫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值