
真正把一套四通道温控系统跑起来最容易被低估的环节其实不是PID调参而是最底层那块MCU最小系统。上一篇我把整体框架拆开了四个温度采样通道、四路加热输出、RS485通信和本地显示当时选定的主控就是STM32F103RCT6。这篇专门把STM32F103RCT6最小系统的原理图设计从头到尾捋一遍把电源、时钟、复位、启动模式、调试接口这几块的选型逻辑和画图细节一次说清楚顺便把我在做这套温控时踩过的坑也放进去尤其是AMS1117的输出电容、LSE起振、SWD连接这老三样。无论你是照着画板子还是准备做基于STM32的毕业设计这部分内容都够用。1. 四路温控选STM32F103RCT6到底图什么1.1 把温控需求拆成MCU资源清单很多人一上来就纠结型号然后随手抓一块现成的最小系统板开始调等做到四通道才发现引脚不够或者Flash装不下那时候再换芯片是最痛苦的。我更习惯先把需求摊开列一个资源清单再对着清单选MCU。四通道温控听上去简单实际拆出来大概是这么一堆事温度采样每通道一路模拟量。我用的是NTC热敏电阻加固定电阻分压接到ADC输入脚。四路就需要至少4个ADC通道。加热输出每通道一路可控硅或者固态继电器。如果只做开关式控制一个GPIO就能管一路四路就是4个GPIO如果想做PID的PWM调功那就需要4路PWM或者用定时器对PWM用多通道输出。闭环控制逻辑每个通道一个PID10Hz周期的计算量其实很小72MHz主频的Cortex-M3完全扛得住根本不用上带FPU的M4。人机交互常见方案是12864点阵屏或者0.96寸OLED接管脚的I2C或SPI。上位机通信至少要留一个USART做调试日志和参数下发如果项目要求多机联网还要加RS485那就需要第二个USART加一个方向控制引脚。数据存储温控参数、校准表、历史记录。如果只用Flash模拟EEPROM那对Flash容量就有要求。实时时钟温控系统往往要记录事件时间和运行时长RTC会用到外部32.768kHz晶振。把这堆需求加起来一个带2~4路USART、4~5个定时器、十几个ADC通道、50个左右GPIO的MCU是最舒服的。再看内存PID需要保存历史误差、积分和微分项显示缓冲和通信缓冲也要占RAM温度校准表放在Flash里省RAM但总得留出运行余量。1.2 和C8T6、F407横向对比为什么不用它们都说STM32F103C8T6便宜又够用但实际上C8T6是LQFP48封装只有37个GPIO、64KB Flash、20KB RAM3个USART、4个16位定时器、10个ADC通道。如果做两通道温控C8T6勉强够但做四通道就绷得太紧了。等你想加个菜单界面、加个历史曲线存储64KB Flash很快就被LVGL或者中文字库吃掉一大半。20KB RAM跑一阵子PID加显示缓冲也会捉襟见肘。我最后选了STM32F103RCT6LQFP64封装核心资源对比看这张表资源STM32F103C8T6STM32F103RCT6Flash64KB256KBRAM20KB48KBGPIO37个51个定时器4个7个含2个高级2个基本USART/UART3个5个ADC通道10个16个封装LQFP48LQFP64RCT6比C8T6多的不只是容量关键是换个型号不用重新设计整套板子引脚资源宽松很多后面想扩展第二块485、加个按键矩阵都有余地。而且现在RCT6的价格已经压到和C8T6没差几块钱还想更省的话可以看看GD32F103RCT6或者APM32F103RCT6这类国产替代但这里提醒一句用替代芯片前一定要确认启动文件、官方外设库版本以及Flash和RAM分区的兼容性我见过有人直接烧STM32标准库结果在GD32上跑出莫名奇妙的ADC问题。至于F407性能当然强但四通道温控用不到那么高的主频和FPUF407的引脚更多、封装更大原理图画起来麻烦不说功耗也高。温控设备往往是长年上电运行低功耗和低成本反而更重要。F103系列在Keil、STM32CubeMX、标准库、HAL库的支持都很成熟遇到问题网上一搜一大把对做毕业设计和产品原型都友好。2. 最小系统分模块设计每个电阻电容都有理由所谓单片机最小系统就是让MCU能正常跑起来的最少外围电路。对STM32F103RCT6来说最小系统包括电源电路、时钟电路、复位电路、启动模式配置和调试接口。看着东西不多但每一处都藏着讲究我按模块拆开讲。2.1 电源电路AMS1117输出电容这事得掰开讲STM32F103RCT6的工作电压是2.0V到3.6V常用3.3V。我的方案是外部供5V板上用AMS1117-3.3线性稳压到3.3V。注意AMS1117的压降大约在1V左右输入5V给输出3.3V没问题但如果你的输入是3.6V或3.7V锂电池那AMS1117就不太合适了输出会掉到3V以下整板工作不稳定。AMS1117最大的坑在输出电容。它的数据手册明确写了输出电容对稳定性至关重要且对ESR有要求经典接法是输出端接10uF钽电容。钽电容的ESR通常在几欧以内正好压住稳压环路的极点。很多人图便宜或者图体积小把钽电容直接换成10uF陶瓷电容结果有的板子工作正常有的板子输出端出现几十毫伏甚至上百毫伏的高频振荡MCU跑起来莫名复位、ADC数值乱跳就是找不到原因。我在温控板上用的方案是输出端一颗10uF/16V钽电容加一颗100nF陶瓷电容并联。如果实在想全用陶瓷电容建议换输出端电容为X5R或X7R材质并在稳压输出和电容之间串一个0.5欧到1欧的小电阻来补足ESR不过这样做对负载瞬态响应有轻微影响不是最优解法。更省事的办法是直接换LDO型号比如ME6211、RT9013、LP5907这些专门为陶瓷电容优化的LDO输出端放10uF陶瓷电容一点问题没有静态功耗也更低。电源引脚处理上STM32F103RCT6有多个VDD和VSS引脚分布在封装四周。原理图里一定要把每个VDD都连到3.3V、每个VSS都连到GND并且每一对相邻的VDD/VSS引脚旁边就近放一颗100nF去耦电容不能只在芯片电源入口放一颗大电容就完事。去耦电容的作用是给高频开关电流提供低阻抗回路放置位置不对等于白放。模拟电源VDDA一定要单独处理。F103这类芯片的ADC参考电压在LQFP64封装上并没有单独的VREF引脚内部是直接接到VDDA上的所以VDDA的纹波直接决定ADC采样的准不准。我习惯在3.3V到VDDA之间串一颗磁珠然后在VDDA引脚放1uF加10nF两颗电容到VSSA。磁珠选600欧/100MHz左右的就行没有磁珠用小电感也行甚至用10欧电阻都能挡掉不少高频噪声代价是VDDA有一点压降。VBAT引脚如果不用后备电池我一般是直接接到3.3V再放一颗100nF电容到地。如果设计里有RTC断电保持需求就通过一个1N4148二极管从3.3V或外部电池供电此时VBAT电压不能超过VDD0.3V。还有一个细节AMS1117输入端建议加大容量储能电容我在5V入口放了10uF/25V电解电容加100nF陶瓷因为温控板会驱动继电器或者可控硅负载切换瞬间会让输入电源出现跌落大电容能兜住这个坑。2.2 时钟电路8MHz主晶振和32.768kHz RTC晶振STM32F103内部有一个8MHz的HSI振荡器精度在1%~3%左右对串口波特率和PID定时来说不够稳所以必须外部挂8MHz晶振做HSE再通过PLL倍频到72MHz。HSE电路就两个20pF到30pF的负载电容分别接在晶振两脚到地。负载电容的取值要按公式算一下CL (C1 x C2) / (C1 C2) CstrayCstray是引脚和走线引入的杂散电容大概3pF到5pF。如果晶振标称负载电容是20pF那C1和C2都取30pF的时候实际CL约等于20pF正好匹配。很多开发板直接放20pF也能起振但频率会略微偏高一点。如果走线长、铺铜面积大杂散电容会更大负载电容要适当调小一点。晶振两脚到MCU的OSC_IN和OSC_OUT走线要尽量短不要在晶振下方铺大块铜皮更不要在晶振旁边走高频数字信号线。我第一版PCB把晶振放到了电源走线附近结果导致串口偶尔丢字节后来把晶振挪到远离电源的板边才算干净。32.768kHz的LSE晶振用来给RTC提供秒基准。四通道温控需要记录运行时间我做方案时没省这个晶振。LSE对负载电容更敏感我建议选6pF或者12.5pF负载电容的晶振负载电容配6.8pF到10pF。注意STM32F103的LSE振荡器驱动能力有限如果配的负载电容太大会出现上电后不启振的问题。一旦遇到LSE起振不稳定除了换负载电容还可以在代码里把LSE的驱动能力调到中或高同时使能时钟安全系统。如果实在对LSE没把握也可以不画LSE晶振用HSE/32做RTC时钟源缺点就是时间精度差一些一天下来误差可能到几十秒看你对定时精度有没有要求。对温控记录来说我建议还是把LSE画上成本就几毛钱。2.3 复位与启动模式NRST、BOOT0、BOOT1怎么接STM32F103的NRST引脚内部已经有一个大约40k欧的上拉电阻理论上悬空也能工作但实际设计里我建议外部再接一颗100nF电容到地构成一个简单的上电复位延时电路。在温控这种有继电器和可控硅切换的环境里电网瞬变很容易在复位脚上耦合出毛刺导致芯片突然复位。所以我在100nF电容的基础上又加了一颗10k电阻到3.3V把复位脚拉得更稳。复位按键不是必需但开发调试阶段强烈建议加一个方便手动复位。NRST还有一个特点STM32的复位脚是双向的既可以输入复位信号内部看门狗或软件复位时又会主动拉低这个引脚输出复位脉冲。所以不要在NRST上接强驱动器件正常的按键、电阻、电容组合就够。BOOT模式是新手非常头疼的地方。STM32复位时会对BOOT0和BOOT1引脚采样决定从哪里启动对应有三种模式BOOT0BOOT1启动来源用途0任意主Flash正常运行默认模式10系统存储器串口ISP下载程序恢复用11SRAM调试RAM中程序极少用正常情况下BOOT0必须保持低电平我用10k电阻把它拉到地。BOOT1对应的是PB2引脚它只在复位瞬间被采样之后可以当普通GPIO使用。很多官方原理图里BOOT1会通过10k电阻下拉这也是给引脚一个确定的默认电平。我的板子上把BOOT0做成了一组三针跳线让BOOT0可以切换到高电平这样万一写错程序导致SWD被禁用还能通过系统存储器自带的串口bootloader恢复芯片。量产的板子就没必要放跳线了直接10k下拉就行。2.4 调试接口SWD为什么比JTAG香STM32F103原生支持JTAG和SWD两种调试接口但我强烈推荐只用SWD。JTAG最少要4根信号线加NRST占用的引脚是PA13、PA14、PA15、PB3、PB4也就是JTMS、JTCK、JTDI、JTDO、NJTRST这一组。SWD只需要PA13作为SWDIO、PA14作为SWCLK再加上3.3V和GND一个标准的四针下载座就搞定了。对比下来SWD节省了PA15、PB3、PB4这三个引脚。可别小看这三个脚F103有IO重映射功能PA15可以重映射为TIM2通道1的PWM输出PB3和PB4也能复用成串口或定时器引脚。在四通道温控这种对GPIO资源有需求的设计里能省一点是一点。调试接口的原理图设计我参考了ST官方评估板的习惯SWDIO加10k上拉SWCLK加10k下拉NRST引到调试座。SWCLK下拉的目的是防止悬空时时钟线上出现毛刺导致调试器误判。SWDIO上拉则是保证通信空闲时电平确定。下载器用ST-Link V2就好便宜稳定KEIL5里设置一下就能直接在线仿真。这里必须强调一个坑PA13和PA14默认是调试功能但代码里如果把这两个引脚配置成GPIO输出SWD就会被关闭之后你再用ST-Link连接就会报找不到设备。遇到这种情况别急着怀疑芯片坏了把BOOT0跳线拨到高电平让单片机跑系统存储器里的bootloaderST-Link就又能连上了然后用STM32 ST-LINK Utility做一次整片擦除程序会恢复默认的SWD引脚功能。2.5 外围细节LED、测试点、备用接口最小系统不只是把芯片和晶振画上就完了几个小细节能帮你少烧好几块板子。首先是电源指示灯一颗绿色LED串联一个1k电阻接到3.3V和地之间。这个灯的价值在于上电第一时间判断电源是否正常如果灯都不亮就别浪费时间查程序了。其次是3.3V和GND的测试点最好做成圆形焊盘或者排针方便示波器探头去夹对后面排查电源纹波、ADC噪声特别有用。我还会在5V输入入口加一颗肖特基二极管比如SS34或者1N5819做反接保护。很多开发板没有这个但温控板会接外置电源现场插错电源正负极的事太常见了一颗二极管能保住整块板子和芯片。如果追求更好的保护加一个500mA的自恢复保险丝也行。最后是预留一组3.3V、GND、SWDIO、SWCLK、NRST的五针调试排针以及一组1.27mm间距的备用IO引出排针方便后续调试时飞线。最小系统板的好处就是在正式驱动四路加热之前先把电源、晶振、调试、串口这几样全部验证通过再往上叠加功能排查问题就没那么痛。3. 原理图绘制实操从建库到DRC的完整流程3.1 器件选型和封装的坑原理图看着是连线实际根子是器件和封装。STM32F103RCT6是LQFP64封装脚间距0.5mm画封装时最怕引脚顺序错位。我的建议是尽量到立创商城或者芯片原厂网站下载官方封装库不要自己从零手动画手动画封装早晚要出事。如果非要自己画一定要对着数据手册的Pin 1位置和引脚编号逐个核对LQFP封装的引脚序号是逆时针排的弄反了整块板子直接废。除了主控其他器件的封装也要在画原理图前敲定。片式电阻电容我统一用0603封装手工焊接和贴片加工都方便AMS1117用SOT-223封装8MHz晶振我选了3225贴片封装比直插的49S更能抗震动也省空间32.768kHz晶振用3215封装这是RTC晶振的常见尺寸。LED、按键、排针这些没有统一标准但要在Value字段里写清楚具体值或者型号后面导BOM时能省不少时间。这里专门提一下一些国产替代芯片如GD32F103RCT6、APM32F103RCT6引脚排列和STM32F103RCT6完全兼容但不同批次芯片的启动电压特性、模拟外设的offset会有细微差别画原理图时按STM32手册接就行等到调ADC的时候再按实际芯片做校准。3.2 电源网络与去耦电容的布局一张原理图的电源网络怎么画直接决定DRC阶段能不能查出问题。我的习惯是5V、3.3V、VDDA用独立的电源符号不用简单的网络标号。电源符号在层次原理图里一眼就能看出来排查断网和短接都方便很多。STM32F103RCT6的电源引脚分布比较散LQFP64封装有多个VDD和VSS它们不是聚集在一块的。画原理图时我每一对VDD/VSS引脚旁边都放了一颗100nF去耦电容。去耦电容在原理图里要放在MCU引脚旁边标注清楚“靠近U1的VDD_1引脚放置”这类注释这样PCB阶段的布局才有依据。如果原理图里所有去耦电容都堆在电源入口后续PCB布局的人根本不知道哪个电容对应哪个引脚效果就会大打折扣。VDDA的磁珠和电容我单独画了一个局部电源网络用“VREF/VREF-”的命名习惯去标记模拟地。注意STM32的模拟地和数字地在芯片内部是共用的外部处理上要尽量做到单点接地也就是3.3V的GND和VDDA的GND最终只在某一点汇合避免数字地电流窜进模拟地。指示灯、复位、BOOT这些低速电路我用普通网络标号连接不在电源网络上混。总之一个原则电源网络干净、控制逻辑清晰、模拟部分隔离后面检查PCB的时候就少一半精力。3.3 连线规范和网标命名的习惯原理图连线看着是小事但规范程度直接影响你后期改板的效率。我给自己定的规矩是信号线的网络标号用功能英文缩写比如NTC1、HEATER1、RS485_A、RS485_B、SWDIO、SWCLK。电源网络用5V、3.3V、VDDA、VSSA。复位、BOOT这些特殊引脚用NRST、BOOT0、BOOT1。画LQFP64这种引脚多的芯片时不要试图用一条线把每个引脚都拉出来而是把引脚附近的短引线拉到芯片轮廓外用网络标号互连。这样图面干净也方便给每类信号加注释。比如把ADC相关的引脚放一起在图纸右侧用注释框写清楚“四路NTC采样输入走线避开PWM输出”。这些注释在别人看图或者你几个月后再回来看设计时价值非常大。还要注意层次图的结构。我把最小系统原理图分成了两页第一页是MCU主控和去耦电容、调试接口第二页是电源电路、时钟电路、复位和BOOT。页与页之间通过端口符号连接比如3.3V、GND、NRST、BOOT0这些。两页结构比一页塞满所有东西要清楚得多打印出来也方便审核。3.4 画完之后的自查清单画完原理图先别急着生成PCB花十几分钟做一轮自查至少检查这几个项目每个VDD引脚都有3.3V网络每个VSS引脚都有GND网络VDD和VSS没有短路。VDDA到3.3V之间有磁珠或电阻隔离VSSA接到GNDVDDA的滤波电容已经放置。时钟引脚没有接错8MHz晶振接OSC_IN/OSC_OUT32.768kHz晶振接PC14/PC15两个晶振的负载电容都有。NRST有100nF电容到地必要时加了10k上拉。BOOT0有10k下拉BOOT1也处理过不是悬空。SWD的SWDIO和SWCLK连接正确没有被其他网络占用调试座引脚顺序和ST-Link线序一致。电源输入端口有极性保护器件和输入电容。跑一遍电气规则检查重点看悬空输入引脚和单端网络。BOM里每个电容的耐压值都大于实际工作电压钽电容的极性方向正确。这轮自查能滤掉八成的低级错误。我第一次画F103最小系统板时把32.768kHz晶体接到了PC14和PC15但RTC使能后怎么都不起振后来用示波器一看是负载电容用大了换小电容立马恢复正常。这种问题在原理图阶段看不出来但负载电容参数选对了后面就少一次改板。4. 常见故障排查与温控系统的抗干扰设计4.1 上电后芯片发热、无法下载的排查速查表最小系统板打样回来上电以后如果芯片发烫十有八九是电源问题别急着怀疑芯片坏。常见的情况就是VDD和VSS焊反或者AMS1117装反。尤其是SOT-223封装的AMS1117三个引脚分别是GND、VOUT、VIN但不同厂家的丝印排列会有差异焊接前一定看实物引脚定义。还有一种隐蔽情况LQFP64的某个VDD引脚虚焊没连上芯片内部多个电源域共用结果供电不足芯片发热不明显但运行不稳定。这时候用万用表量一下每个VDD引脚对地电压是不是都是3.3V如果有某个引脚电压异常补焊一下就好了。无法下载程序的问题我整理了一个排查顺序表现象可能原因排查方法ST-Link连不上3.3V没供上先量电源指示灯再看LDO输出ST-Link连不上SWD四根线顺序错对照调试座丝印确认SWDIO、SWCLK没有接反ST-Link连不上PA13/PA14被程序禁用BOOT0跳高进bootloader用ST-LINK Utility整片擦除ST-Link连不上下载器接触不良换一根杜邦线缩短线长度到10cm以内能连上但下载失败Flash容量选错Keil里芯片型号选STM32F103RC不要选成C8能连上但下载失败芯片被读保护ST-LINK Utility执行unsecure chipSWD线太长是很多人忽视的问题SWCLK频率高的时候超过20cm的杜邦线就会开始不稳定下载报错无规律。我的建议是调试座和ST-Link之间用2.54mm排线直接插不要中间转接太多。必须飞线的话把ST-Link的SWCLK速度在Keil里从10MHz降到1MHz甚至500kHz基本能稳定下载。这不是芯片的问题是信号完整性的问题。4.2 SWD连不上的几种情况和恢复办法SWD连不上是STM32最小系统板最常遇到的问题但很多情况下芯片并没有坏。我总结下来有几种典型。第一种是代码里把PA13或PA14重映射成GPIO用了。程序烧进去之后SWD引脚变成了普通IO调试器自然找不到目标。恢复办法BOOT0跳线拨到高电平上电让芯片从系统存储器启动系统存储器里的bootloader不会禁用SWD所以ST-Link立刻能连上然后擦除整片Flash再把BOOT0拨回来。用STM32 ST-LINK Utility软件连接方式选Connect under Reset成功率更高。第二种是电源问题。SWD接口的3.3V引脚如果只是给调试器提供参考电平那一定要保证目标板有独立供电而且GND必须和ST-Link共地。如果目标板没上电ST-Link只靠自己的3.3V驱动目标往往出现“No target connected”。第三种是芯片进了低功耗模式。温控板如果待机时进入STOP或者STANDBY模式SWD调试接口也会停止响应。恢复办法同样是拉高BOOT0连上后擦除程序。还有一种比较邪门的情况是板子上的复位电容太大导致ST-Link在复位期间无法稳定握手。我用10uF的复位电容试过ST-Link十次里要有三次连不上换成100nF后立刻正常。所以复位脚那颗电容不是越大越好100nF是最稳妥的。4.3 晶振不起振的排查思路晶振不起振分主晶振HSE和RTC晶振LSE两种情况。8MHz主晶振不起振的话芯片还能靠内部HSI跑起来但串口波特率会和预期偏差很大单片机运行速度也明显不对。排查思路是先看负载电容是否过大我用示波器探头直接点晶振引脚经常把振荡蹭灭必须用探头的前端钩或10x档位而且探头电容也会影响振荡最好是示波器夹在OSC_OUT引脚上设置触发模式看一下。更可靠的办法是配置MCO输出也就是PA8引脚复用为MCO功能把系统时钟输出到PA8上测量这样不会干扰晶振。32.768kHz LSE晶振不起振的现象更隐蔽因为程序不用RTC的时候完全感知不到。一旦用上RTC就会遇到时间不走、走时不准的问题。排查思路基本是晶振引脚是不是接反了PC14是OSC32_INPC15是OSC32_OUT。负载电容是不是太大我用过20pF的负载电容LSE死活不启振换成6.8pF就好了。代码里LSE驱动能力是不是太弱在RCC配置里把LSE驱动能力调高一点。晶振是不是选成了低负载电容型号但匹配电容却用了通用值。LSE起振慢还和PCB漏电流有关PC14和PC15之间如果有助焊剂残留就会出现有时能起振有时不能起振的怪毛病。遇到这种幽灵故障先用洗板水把晶振区域洗一遍再考虑换器件。4.4 温控场景下的电源噪声和ADC漂移对策四通道温控和最小系统开发板最大的不同是它会驱动加热设备。加热设备要么是交流可控硅要么是继电器每次切换瞬间的电流冲击和尖峰噪声都是MCU的敌人。我第一版板子用的是两层板数字地和模拟地没做分割四路加热同时动作的时候ADC采样值明显跳动温度控制来回震荡。后来改版的时候做了两个关键调整一是在3.3V入口增加了一个磁珠把数字电路和模拟电路的供电分开二是把四路NTC采样走线尽量靠近并在每路ADC输入引脚上加了一颗100pF到1nF的对地滤波电容和NTC分压电阻构成一个低通滤波器滤掉高频共模噪声。温控系统的地线布局我强烈建议使用星形接地思想MCU的GND、功率驱动部分的GND、传感器分压电路的GND各自独立走到电源输入的地端汇合不要串成一条线。这样驱动电流不会流过模拟采样的地回路ADC的跳动幅度能降一个数量级。再有就是软件上的滤波配合。硬件无论如何做温控系统里总有电源毛刺和工频干扰。实时性要求允许的话在PID采样前做一次滑动平均比如连续采8次去掉最大最小再求平均就能把大部分突发干扰滤掉。四路PID的控制周期通常是100ms到200ms8次ADC采样平均完全来得及。最后分享一个小技巧如果你发现ADC采样值还是不稳试试看把ADC的采样时间配置拉长。STM32F103的ADC采样时间可以配置成1.5周期到239.5周期默认值往往偏短。加大采样时间意味着ADC内部采样电容有更充分的时间充电到被测电压对高阻抗的NTC分压电路特别有效。我在四通道温控板上把采样时间设为55.5周期再配合硬件低通滤波实测采样值稳定在正负1个LSB以内比直接用最短采样时间强太多。这个经验在常规教程里很少会写但对温控系统这种低速高精度采样场景来说比换一堆电容电阻都管用。