资讯动态

STM32F103C8T6土壤湿度传感器原理图与ADC采样调试

发布时间:2026/9/18 3:06:37 来源:尧图企业网站定制
简介这份土壤湿度传感器原理图PDF面向嵌入式入门者、STM32课程设计及电子竞赛参与者用于理解基于介电常数变化的土壤湿度采集电路硬件连接与系统构成。文件以STM32F103C8T6为核心涵盖传感器信号输入、GPIO分配、VCC/3V3/GND供电、复位与BOOT配置以及0.96英寸OLED显示、LED状态指示和ST-Link调试接口等模块适合对照原理图完成电路搭建与功能验证。资源包仅1个PDF文件约61KB体量轻便便于快速查阅与打印。已有671人学习下载说明该图在STM32土壤湿度检测类项目中具有一定参考价值。读者可从中梳理传感器到微控制器的引脚对应关系分析上拉电阻、去耦与晶振等外围电路排查供电、复位和下载异常也可作为课程设计、毕业设计或DIY灌溉系统的硬件设计底稿。1. 一张 OCR 糊掉的土壤湿度传感器原理图里到底有什么一份标着《土壤湿度传感器原理图》的 PDF 到手第一眼往往是懵的OCR 把管脚名和网络标号搅在一起VDD_2、PPPPP、PB0TPB、100K、22pf 混成一锅位号 U1 到 U4 都得靠坐标去猜。把噪声拨开骨架其实很清楚——核心是一颗 STM32F103C8T6左侧一路土壤湿度探头接口VCC、GND、DO、AO 四个焊盘右侧挂 0.96 寸 OLED、蜂鸣器和状态 LED中间是最小系统该有的那套8MHz 主晶振配两颗 22pF、32.768kHz 低速晶振、NRST 复位网络、BOOT0/BOOT1 启动选择、SWD 调试口以及成排的 100nF 去耦电容。图纸要解决的不是测湿度这三个字而是把探头的模拟电压、比较器的数字阈值输出、一块显示读数的屏和一只离线报警的蜂鸣器收进一颗 48 脚单片机里。适合两类人手上有 F103C8T6 核心板、想照着复刻一版 PCB 的硬件新手和已经会点灯、想把 ADC 采样与 I2C 显示串成完整链路的嵌入式开发者。2. 探头模拟前端与 ADC1 采样链路2.1 电容式探头与电阻式探头的取舍土壤湿度的测量基础是介电常数纯水的相对介电常数约 80干燥土壤只有 3 到 5电极之间等效电容随含水量单调上升。原理图左侧那组 VCC、GND、DO、AO 焊盘对应的是市面上最常见的模块化探头——振荡检波电路做在探头上直接吐出一路 0~3V 的模拟电压同时用一颗比较器给出数字阈值输出。电阻式探头便宜但电极长期通电会电解腐蚀埋土几十小时就能看到明显锈斑而且它测的是离子导电率施肥之后读数会整体漂移。图纸上探头供的是 3.3V 而不是 5V这也侧面说明设计者没打算用 5V 的电阻式模块——那类模块 AO 满量程接近 5V直接怼进 STM32 的引脚会触发钳位二极管轻则读数失真重则烧脚。我一般优先用 3.3V 供电的电容式探头代价是它对土壤盐分和温度仍然敏感后面必须做校准。2.2 AO 进 ADC1_IN0源阻抗决定采样时间STM32F103C8T6 的 ADC 是 12 位逐次逼近型参考电压取 VDDA3.3V 时1 LSB 约等于 0.806mV。换算成湿度分辨率得先知道探头的输出摆幅多数电容式模块在空气里输出 2.8V 左右、插进水里掉到 1.0V 上下摆幅约 1.8V对应约 2200 个码值分辨率够用。真正容易翻车的是采样时间。STM32F1 的 ADC 输入可以建模成一个采样电容 C_adc约 8pF加一串开关电阻外部源阻抗越大采样电容充满所需时间越长。数据手册给出的对应关系是这样的采样周期数采样时间 ADCCLK14MHz允许最大源阻抗1.50.107 µs1.2 kΩ7.50.536 µs5.9 kΩ41.52.96 µs11.4 kΩ239.517.1 µs50 kΩ探头模块内部的运放输出阻抗通常标几十千欧如果按默认的 1.5 周期去采STM32 采到的是没充满的电压表现就是读数整体偏低、抖动大、手指碰一下引脚数值乱跳。稳妥做法是把采样时间拉到 239.5 周期并且在 AO 与 ADC 引脚之间串一颗 100Ω 电阻、并一颗 100nF 到地做 RC 低通既降源阻抗又滤掉探头振荡电路带出来的高频纹波。/* ADC1_IN0(PA0) 单通道软件触发采样时间取最大档 */ static void SoilAdc_Init(void) { ADC_ChannelConfTypeDef ch {0}; hadc1.Init.ScanConvMode ADC_SCAN_DISABLE; hadc1.Init.ContinuousConvMode DISABLE; hadc1.Init.ExternalTrigConv ADC_SOFTWARE_START; hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT; HAL_ADC_Init(hadc1); ch.Channel ADC_CHANNEL_0; /* PA0 - ADC1_IN0 */ ch.Rank ADC_REGULAR_RANK_1; ch.SamplingTime ADC_SAMPLETIME_239CYCLES_5; /* 高源阻抗必选最大档 */ HAL_ADC_ConfigChannel(hadc1, ch); } static uint16_t SoilAdc_ReadOnce(void) { HAL_ADC_Start(hadc1); HAL_ADC_PollForConversion(hadc1, 10); uint16_t v HAL_ADC_GetValue(hadc1); /* 0..4095 对应 0..3.3V */ HAL_ADC_Stop(hadc1); return v; }ADC_SAMPLETIME_239CYCLES_5是这颗芯片能配的最长采样窗口代价是单次转换耗时约 17µs 加逐次逼近的 12.5 个周期一次完整转换约 18µs。要做 10Hz 采样完全无压力但如果后面想加 DMA 连续扫多路就得重新核算总时间。2.3 DO 通道比较器阈值电位器怎么调探头上那颗比较器把 AO 电压和电位器分压出来的参考电平做比较结果送到 DO 脚。图纸里 DO 接到 STM32 的某个 GPIO 上作中断输入逻辑很直接湿度高于阈值时 DO 翻转触发外部中断把 MCU 从停机模式里叫醒。这是低功耗节点最省电的做法——CPU 平时睡着只有土壤真的变干才醒来做事。调阈值的时候别用万用表盯着 DO 灯正确姿势是先把探头插进目标土壤的该浇水状态一边旋电位器一边看 DO 灯刚好点亮的那个临界点然后再往回旋一点点留死区。没有死区的话湿度卡在阈值附近时 DO 会高频抖动中断被反复触发功耗直接失控。2.4 两点校准与中值滤波探头个体差异很大同型号两块板子在同样的土里能差十几个百分点所以固件里必须放校准系数而不是写死映射公式。工程上通常做两点校准探头悬空在空气里记下ADC_DRY探头浸入水中只淹到刻度线记下ADC_WET然后线性映射。/* 中值滤波9 次采样去掉最大最小各 3 个剩下取平均 */ static uint16_t SoilAdc_ReadFiltered(void) { uint16_t s[9]; for (int i 0; i 9; i) { s[i] SoilAdc_ReadOnce(); } /* 简单冒泡排序样本少开销可忽略 */ for (int i 0; i 8; i) for (int j 0; j 8 - i; j) if (s[j] s[j 1]) { uint16_t t s[j]; s[j] s[j 1]; s[j 1] t; } uint32_t sum 0; for (int i 3; i 6; i) { sum s[i]; } /* 只取中间 3 个 */ return (uint16_t)(sum / 3); } /* 两点线性映射结果限幅到 0~100 */ static uint8_t SoilToPercent(uint16_t raw, uint16_t dry, uint16_t wet) { if (dry wet) { return 0; } /* 接反了直接判无效 */ int32_t p (int32_t)(dry - raw) * 100 / (int32_t)(dry - wet); if (p 0) { p 0; } if (p 100) { p 100; } return (uint8_t)p; }中值滤波比纯平均更抗脉冲干扰探头插拔瞬间的尖峰、附近继电器的开关噪声都会被排序过程直接扔到两端丢掉。校准值建议放在 Flash 的最后一个页做参数区出厂时通过串口命令写入免得每换一批探头就重烧固件。3. STM32F103C8T6 最小系统与关键网络3.1 8MHz HSE 与 22pF 负载电容的取值F103C8T6 内部有 8MHz 的 HSI但出厂精度只有 ±1% 量级跑 UART 和长时间计时会飘所以图纸上老老实实放了外部晶振。选它的另一个原因是 PLL8MHz 经 9 倍频正好 72MHz是这颗芯片的主频上限不用做任何小数分频。两颗 22pF 是负载电容取值不是拍脑袋来的。晶振手册给的负载电容 CL 是串联谐振条件下的等效值两端电容 C1、C2 要满足CL C1*C2/(C1C2) CstrayCstray 是 PCB 走线和引脚寄生电容通常估 3~5pF。C1C2 时公式简化成C1 2*(CL - Cstray)。# 计算 HSE 晶振两端负载电容的常用取值 def load_cap(cl_crystal, c_stray5.0): cl_crystal: 晶振手册标称负载电容(pF); c_stray: 寄生电容(pF) if cl_crystal c_stray: raise ValueError(标称负载电容小于寄生电容参数不合理) c1 2 * (cl_crystal - c_stray) # 两端相同取值的解 return round(c1, 1) for cl in (10, 12, 15, 20): print(fCL{cl}pF - C1C2{load_cap(cl)}pF) # CL10pF - 10.0pF ; CL20pF - 30.0pF注意如果板子上焊的是 CL20pF 的晶振而电容配 22pF等效负载只有 16pF频偏会在几十 ppm 量级UART 波特率误差可能逼近 3%长时间通信会偶发误码反过来电容过大则起振困难冷启动失败的板子十有八九是这里偏了。3.2 NRST、BOOT0/BOOT1 与启动模式NRST 脚在芯片内部已经有约 40kΩ 上拉图纸上再并一颗 10kΩ 上拉到 3.3V、加一颗 100nF 到地是很标准的做法10kΩ 保证上拉够硬100nF 把按键抖动和电源上电的毛刺滤掉同时不会因为电容太大导致复位释放过慢。BOOT0 和 BOOT1复用为 PB2决定上电后从哪块存储区取指令这颗芯片的模式组合不能记错BOOT0BOOT1启动区域典型用途0X主 Flash正常跑程序10系统存储器串口 ISP 下载11内嵌 SRAM调试特殊场景图纸里 BOOT0 通过 100kΩ 下拉到地、BOOT1 也是 100kΩ 下拉属于量产配置。要留调试余地的话把 BOOT0 那个下拉改成跳线帽或者接到一个空 GPIO 上将来救砖时不用动烙铁。3.3 SWD 调试口与 ST-Link 接线F103C8T6 上电默认把 PA13 配成 SWDIO、PA14 配成 SWCLK这是 JTAG/SWD 复用功能里唯一保留的一组。接线只需要五根3.3V、GND、SWDIO、SWCLK再加一根 NRST 更稳——ST-Link 可以通过拉低 NRST 强行把跑飞或者一上电就进停机模式的芯片按在复位态连上。一个高频坑固件里如果把 PA13/PA14 当普通 GPIO 用了或者进了 Standby 模式调试器就连不上。解决办法是把 SWD 引脚在初始化时不要碰或者进低功耗前先把调试器断开。板子上至少要留一排 4pin 或 5pin 的排针别省这点面积。3.4 去耦、VBAT 与 VSSA 的处理细节图纸上那些成排的 100nF 不是装饰。每对 VDD/VSS 就近放一颗 100nF整板再并一颗 10µF 钽电容做低频储能VDDA 单独走一根线到 3.3V中间串一颗磁珠或者 10Ω 电阻再配 1µF 加 100nF 到 VSSA。ADC 的精度非常吃这块VDDA 上多 10mV 纹波满量程读数就能晃十几个码值。VBAT 接 3.3V 或接纽扣电池都行接电池时 RTC 和后备寄存器能在主电断掉后继续跑接主电则省一颗电池。走线上 VBAT 和 VDD 之间不要共用地回路否则主电上的开关噪声会串进 RTC 域。4. OLED、LED 与蜂鸣器的人机交互电路4.1 SSD1306 OLED 的 I2C 地址与上拉电阻0.96 寸 OLED 基本都是 SSD1306 驱动四线 I2C 版本只有 VCC、GND、SCL、SDA 四个脚。图纸上接的是 PB6/PB7也就是 STM32F1 的 I2C1 复用引脚。这两个脚是开漏结构必须外接上拉电阻阻值按总线速率选标准模式 100kHz 用 4.7kΩ快速模式 400kHz 用 2.2kΩ。图里如果只画了一对 4.7kΩ是给 100kHz 准备的。SSD1306 的从机地址是 7 位 0x3C 或 0x3D由模块背面那颗电阻决定。上电第一件事不是初始化屏幕而是扫一遍总线确认地址/* I2C 地址扫描确认 OLED 到底挂在 0x3C 还是 0x3D */ void I2C_Scan(I2C_HandleTypeDef *hi2c) { for (uint8_t addr 0x08; addr 0x78; addr) { /* HAL 的地址参数要左移一位这是最常见的笔误来源 */ if (HAL_I2C_IsDeviceReady(hi2c, addr 1, 2, 5) HAL_OK) { printf(found device at 0x%02X\r\n, addr); } } }HAL_I2C_IsDeviceReady的第二个参数是 8 位地址含读写位所以要左移一位。这一步如果扫不到任何设备先量 SCL/SDA 的静态电平——开漏加正确上拉时应该都在 3.3V 附近如果有一根是 0V就是总线被拉死了。4.2 PC13 驱动 LED 的电流上限原理图里 PC13 挂了一颗 LED 串 1kΩ 限流电阻。这颗脚不能按普通 GPIO 对待F103 数据手册明确写了 PC13、PC14、PC15 三个脚的总输出电流限制在 3mA 以内而且不能同时用于两个以上的负载。按 1kΩ 算LED 压降 2V 时电流只有 1.3mA亮度偏暗但绝对安全。如果确实需要更亮的指示正确做法是换成三极管或者 MOS 驱动让 PC13 只出控制信号。LT 系列的 LED 压降差异很大红色 1.8V、绿色 2.1V、蓝色和白色 3.0V 以上用蓝色 LED 配 1kΩ 时电流会掉到 0.3mA基本看不见这时候要考虑换成红色或者把限流电阻降到 470Ω——前提是先确认总电流不超 3mA。4.3 蜂鸣器的三极管驱动与续流二极管原理图上的蜂鸣器没有直接接 GPIO中间多了一颗 NPN 三极管和一颗 1kΩ 基极电阻这是标准接法。有源蜂鸣器工作电流通常 20~30mA已经超过单脚 20mA 的灌电流上限而且感性负载断电瞬间会产生反电动势能把 IO 打穿。完整电路是GPIO 串 1kΩ 到基极发射极接地集电极接蜂鸣器负极蜂鸣器正极接 3.3V蜂鸣器两端并一颗 1N4148 做续流方向与电源相反。1kΩ 基极电阻在 3.3V 下给三极管约 2.6mA 基极电流按 β100 算能驱动 260mA余量充足如果换成 MOS 管这颗电阻可以省掉但要确认栅极阈值电压低于 3.3V。网络引脚方向说明SOIL_AOPA0模拟输入ADC1_IN0串 100Ω 并 100nFSOIL_DOPA1输入上拉输入下降沿触发中断OLED_SCLPB6复用开漏I2C1_SCL外部 4.7kΩ 上拉OLED_SDAPB7复用开漏I2C1_SDA外部 4.7kΩ 上拉LED_STATUSPC13推挽输出串 1kΩ总电流控制在 3mA 内BUZZERPB0推挽输出经 NPN 驱动勿直连SWDIOPA13复用调试口固件中勿改配置SWCLKPA14复用调试口固件中勿改配置5. 上电验证与常见故障定位拿到板子先别急着烧程序按顺序量三个点一是 3.3V 稳压输出空载应在 3.25~3.35V二是每对 VDD 引脚对地电压任何一脚掉到 3.1V 以下说明去耦或者走线有问题三是 VDDA它和 VDD 之间不应有超过 30mV 的偏差否则 ADC 基准就偏了。这三步做完再接调试器能省掉大量连不上芯片的无效排查。然后用 STM32CubeProgrammer 的命令行模式做连接确认和读保护检查比图形界面快得多# 读取芯片信息确认 SWD 连得上、读出 Device ID STM32_Programmer_CLI -c portSWD modeUR resetHWrst -ob displ # 读保护状态为 0xAA 表示未加锁为 0xCC 需要先解保护会全片擦除 STM32_Programmer_CLI -c portSWD -ob RDP0xAA # 烧写并复位运行 STM32_Programmer_CLI -c portSWD -w build/soil.hex -v -rstresetHWrst让调试器通过 NRST 做硬件复位对付跑飞进停机模式的芯片最有效-ob displ把选项字节整块打出来除了 RDP还要看nWRP写保护和用户选项位是不是被误改过。如果 CLI 报 No STM32 target found先确认 BOOT0 是低电平——BOOT0 悬空时芯片行为不确定这是自研板最常见的低级错误。调传感器读数时我习惯先不接屏直接用 SWD 挂上去在线看变量把SoilAdc_ReadFiltered()的结果和SoilToPercent()的输出都放在volatile全局变量里调试器实时刷新插拔探头看数值变化范围。如果 ADC 读数卡在 0 或 4095 不动八成是 AO 那一路某个脚虚焊或者探头的 VCC 没接如果读数在几十个码值范围内无规律跳动先看 ADCCLK 是不是被配到 14MHz 以上——超频会让逐次逼近逻辑出错读数看上去像随机数。现象优先排查点调试器连不上BOOT0 电平、PA13/PA14 是否被复用、NRST 是否被按住ADC 恒为 0 或 4095探头供电、AO 走线虚焊、采样时间是否够长读数抖动大ADCCLK 分频、VDDA 纹波、是否漏了 RC 滤波OLED 不亮从机地址 0x3C/0x3D、上拉电阻、模块背面 CS 跳线蜂鸣器一响就复位是否漏了续流二极管、蜂鸣器是否误接 5V冷启动偶发失败22pF 负载电容与晶振 CL 是否匹配、起振余量最后一个实用技巧把 BOOT0 在板子上留成可跳线的形式配合系统存储器的内建引导程序即使 SWD 口被固件彻底配死也能用串口把芯片救回来。串口 ISP 的连接顺序是先把 BOOT0 拉高、上电或复位用工具连上后擦除 Flash再把 BOOT0 拨回低电平重新上电芯片就恢复正常启动流程了——这一步不需要拆焊任何元件比换芯片快得多。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价