尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

嵌入式外围电路设计实战:电源、时钟、复位与通信接口避坑指南

嵌入式外围电路设计实战:电源、时钟、复位与通信接口避坑指南 1. 嵌入式外围电路设计的整体思路与选型逻辑1.1 为什么外围电路设计是嵌入式硬件的分水岭做嵌入式硬件这些年我最大的感受是主控芯片选型其实是最省心的环节真正吃掉项目周期、让板子反复改版的永远是外围电路。MCU或者MPU本身只是一个大脑它要真正跑起来、稳定工作、和外部世界打交道靠的全是外围电路——电源、时钟、复位、调试接口、存储、通信接口、模拟采集、驱动电路每一块单独拎出来都不复杂但组合在一起坑就来了。外围电路设计的本质是解决三件事让主控能正常工作电源、时钟、复位、启动配置、让主控能和外界通信UART、I2C、SPI、CAN、USB、以太网、让主控能感知和控制物理世界ADC采样、GPIO驱动、PWM输出、继电器/MOS驱动。这三件事对应到原理图上就是一个个具体的电路模块。很多新手拿到参考设计直接抄抄完发现板子不启动、通信不稳定、ADC跳变严重问题基本都出在外围电路的细节上。这篇文章我打算按实际项目里最常出现的模块把每个模块的设计要点、参数计算、布局注意事项、常见故障排查都过一遍。适合刚入行的硬件工程师、从软件转硬件的嵌入式开发者以及需要自己画板子做小批量产品的独立开发者。我不会只讲“应该怎么做”更会讲“为什么这么做”以及“不这么做会怎样”。1.2 外围电路设计的核心原则分层与解耦我在实际项目中总结出一个原则外围电路要分层设计层与层之间要解耦。什么意思把电路按功能分成几个层次基础层电源、时钟、复位、启动配置。这一层不工作后面全白搭。通信层UART、I2C、SPI、CAN、USB、以太网等。这一层负责数据交换。模拟层ADC、DAC、运放、传感器前端。这一层对噪声最敏感。驱动层GPIO扩展、MOS驱动、继电器驱动、电机驱动。这一层涉及功率和隔离。分层的好处是调试的时候可以逐层验证。板子回来先测电源层电压对不对、纹波大不大再测时钟层晶振起振没有、频率准不准然后测复位和启动能不能正常下载程序最后再逐个验证通信和模拟通道。如果一上来就全功能联调出了问题根本不知道是哪一层的事。解耦的意思是每一层之间的电源和地要处理好。比如模拟部分和数字部分要用不同的LDO供电地平面要单点连接或者用磁珠隔离。通信接口的TVS管、限流电阻、上拉电阻要放在靠近连接器的位置而不是靠近主控。这些细节在后面每个模块里我都会具体展开。1.3 从需求到原理图一个可复用的设计流程我一般按这个流程走明确主控的硬性要求供电电压范围、内核电压、IO电压、时钟频率、启动模式引脚、调试接口类型。这些在数据手册的“Pin Description”和“Electrical Characteristics”章节里都有必须逐条核对。列出所有外设接口每个接口需要哪些引脚、电平标准、速率、是否需要隔离。做成一张表。分配电源域哪些外设用3.3V哪些用5V哪些需要独立LDO。算一下每路的电流预算留30%余量。画模块化原理图每个功能模块单独画标注清楚网络名。网络名要规范比如UART1_TX、I2C1_SCL不要用TX1、SCL1这种容易混淆的。检查交叉点电源和地的连接、上拉下拉电阻、未使用引脚的处理、调试接口的引出。布局前评审把原理图给有经验的同事过一遍重点看电源树、时钟、复位、启动配置。这个流程看起来慢但能省掉至少两轮改版。我见过太多项目因为启动模式引脚接错板子回来只能飞线因为复位电路电容选错偶尔上电不启动因为I2C上拉电阻太大通信速率上不去。这些都是可以在原理图阶段避免的。2. 电源、时钟与复位最基础也最容易翻车的三块2.1 电源树设计与LDO选型实战电源是板子的心脏。嵌入式系统常见的电源架构是输入5V或12V经过DC-DC降到3.3V或5V再经过LDO降到1.8V、1.2V等内核电压。选型的时候重点看几个参数输入电压范围要覆盖你的输入波动范围比如12V输入考虑±10%波动选输入范围到20V以上的。输出电流算总功耗。MCU内核电流、外设电流、LED电流、上拉电阻电流都要算进去。比如STM32F4跑168MHz内核电流大概几十mA加上外设和LED3.3V这一路留500mA比较稳妥。压差LDO的压差决定了最小输入电压。比如3.3V输出压差300mV输入至少要3.6V才能稳住。静态电流电池供电的项目要特别关注选IQ低的LDO。PSRR电源抑制比对模拟部分很重要。ADC供电的LDOPSRR至少60dB以上。我常用的组合是12V转5V用MP1584或TPS54305V转3.3V用AMS1117或者TLV11173.3V转1.8V用TLV70218。AMS1117便宜但静态电流大、压差高电池项目不推荐。TLV系列贵一点但性能好很多。注意LDO的输入输出电容不是随便选的。数据手册里会写“stable with X μF ceramic capacitor”一定要按推荐值来。我试过用10μF代替推荐的1μF结果LDO振荡输出电压纹波巨大。陶瓷电容的ESR很低有些老LDO需要一定的ESR才能稳定这时候要在输出端串一个零点几欧的电阻。电源布局的要点输入电容靠近LDO的VIN引脚输出电容靠近VOUT引脚地线要短而粗。DC-DC的续流二极管和电感要靠近开关引脚反馈电阻靠近FB引脚。这些走线长了纹波和噪声立刻上来。2.2 晶振电路不起振的十个原因晶振不起振是嵌入式硬件最经典的问题之一。我整理过一份排查清单按概率从高到低序号可能原因排查方法1负载电容选错查晶振手册的CL值按公式算2晶振质量差换一个品牌或批次3焊接不良补焊或换晶振4走线太长缩短晶振到MCU的走线5匹配电阻缺失串联1MΩ反馈电阻6电源噪声大示波器看电源纹波7启动时间不够增加上电复位延时8晶振频率不对确认MCU支持的范围9旁路电容过大减小负载电容试试10PCB受潮或污染清洗烘干负载电容的计算公式是CL (C1 * C2) / (C1 C2) Cstray。Cstray是PCB的寄生电容一般2-5pF。比如晶振手册写CL12pFCstray取3pF那么C1C2≈18pF。实际选的时候可以先用22pF测频率偏差再调整。晶振布局的硬性要求晶振和负载电容尽量靠近MCU的晶振引脚走线短且等长下方不要走其他信号线最好铺地隔离。我见过晶振走线穿过SPI时钟线结果通信误码率飙升。2.3 复位电路阻容复位与专用复位芯片的取舍最简单的复位电路是一个10k电阻上拉到VCC一个100nF电容到地MCU的复位引脚接在中间。这个电路成本几乎为零但可靠性一般。问题在于电源上升慢的时候复位引脚电压跟着慢慢升MCU可能在电压不够的时候就试图启动导致跑飞。专用复位芯片比如MAX809、TPS3823内部有电压检测和延时电源低于阈值时保持复位电源稳定后延时200ms左右释放复位。可靠性高很多成本也就几毛钱。我现在的项目基本都用专用复位芯片除非是极度成本敏感的消费类产品。复位引脚的布局要注意复位走线尽量短远离高频信号线。如果复位引脚内部有上拉外部电阻可以省掉但电容还是要加。有些MCU的复位引脚是双向的可以同时做复位输入和复位输出这种要仔细看手册别接错。3. 通信接口外围电路UART、I2C、SPI、CAN的实战细节3.1 UART接口电平转换与隔离设计UART是最简单的通信接口但外围电路也有讲究。MCU的UART是3.3V电平如果要和5V设备通信需要电平转换。最简单的方案是用两个电阻分压但速率高的时候波形会变形。更好的方案是用专用电平转换芯片比如TXS0108E或者TXB0104。如果通信距离超过几十厘米或者环境有干扰建议加隔离。光耦隔离是最常用的方案比如EL357、TLP521。隔离的话两边要分别供电地也要分开。我做过一个工业项目UART走RS485用了ADM2483磁隔离芯片通信距离做到1200米没问题。UART的TVS管要放在连接器附近钳位电压要低于MCU的绝对最大额定值。比如3.3V的UARTTVS选5V钳位的。串联电阻一般22Ω到100Ω起到限流和阻尼的作用。3.2 I2C总线上拉电阻计算与总线电容限制I2C的上拉电阻计算是面试常考题也是实际设计中最容易出问题的地方。上拉电阻的最大值由总线电容和上升时间决定Rp(max) tr / (0.8473 * Cb)其中tr是上升时间标准模式1000ns快速模式300nsCb是总线电容包括PCB走线电容、引脚电容、器件电容一般不超过400pF。上拉电阻的最小值由灌电流决定Rp(min) (VDD - VOL) / IOL比如VDD3.3VVOL0.4VIOL3mA那么Rp(min)≈967Ω。实际选值一般在2.2k到10k之间。总线电容小、速率低可以用10k总线电容大、速率高用2.2k。我一般先用4.7k测波形再调。I2C的坑多个器件挂同一条总线地址冲突上拉电阻只在一处接不要每个器件都接总线电容超了波形上升沿变缓通信失败。我遇到过EEPROM和传感器挂同一条I2C传感器地址固定EEPROM地址可配结果配错了两个器件地址一样总线直接锁死。3.3 SPI接口片选、时钟极性与走线等长SPI比I2C快但线也多。四个信号SCK、MOSI、MISO、CS。片选信号每个从设备一根或者用译码器扩展。SPI的时钟极性CPOL和相位CPHA要和从设备匹配这个在从设备手册里写得很清楚配错了读出来全是0xFF或者0x00。SPI走线要注意SCK是时钟尽量短不要跨分割地平面。MISO是输入如果从设备驱动能力弱可以加上拉。CS信号要加上拉防止上电时从设备误触发。多从设备的时候每个CS单独走线不要共用。高速SPI比如50MHz以上要考虑走线等长和阻抗匹配。我做过一个SPI Flash的项目SCK跑到80MHz走线没做等长读数据偶尔出错。后来把SCK和MISO的走线长度差控制在5mm以内问题解决。3.4 CAN总线终端电阻与共模电感CAN总线在汽车和工业里用得很多。外围电路的核心是收发器比如TJA1050、SN65HVD230。CAN_H和CAN_L之间要接120Ω终端电阻只在总线两端接中间节点不接。我见过每个节点都接120Ω的总线负载变成60Ω通信距离大幅缩短。CAN的共模电感可以抑制共模干扰选100μH左右的。TVS管要选双向的钳位电压在30V左右。CAN的走线要成对尽量等长差分阻抗120Ω。CAN的坑终端电阻漏接或者多接收发器的供电电压不对5V和3.3V的收发器不能混用总线分支太长分支长度不要超过30cm。4. 模拟与驱动外围电路ADC前端、MOS驱动与继电器4.1 ADC前端电路分压、滤波与基准源ADC采样是嵌入式系统感知模拟世界的入口。前端电路的设计直接决定采样精度。常见的信号调理包括分压、运放缓冲、RC滤波、钳位保护。分压电阻的选择阻值不能太大否则ADC的输入阻抗会影响分压比也不能太小否则功耗大。一般选10k到100k。分压电阻的精度要匹配ADC的精度12位ADC用1%精度的电阻就够了16位以上要用0.1%的。RC滤波截止频率要低于信号频率但也不能太低否则响应慢。比如采样1kHz的信号RC截止频率设10kHzR1kC16nF。基准源ADC的精度很大程度上取决于基准电压。MCU内部的基准一般精度和温漂都一般要求高的时候用外部基准比如REF3033、LM4040。基准源的电源要干净旁边放0.1μF和10μF电容。注意ADC的输入电压不能超过基准电压也不能低于0V。如果信号可能超出范围要加钳位二极管。我见过一个项目传感器输出偶尔到4VADC基准是3.3V结果ADC输入引脚被打穿。4.2 MOS管驱动栅极电阻、续流二极管与死区MOS管驱动是嵌入式控制功率负载的常用手段。低边驱动最简单MCU的GPIO经过栅极电阻接MOS的栅极源极接地漏极接负载。栅极电阻一般10Ω到100Ω作用是限制栅极充电电流抑制振荡。电阻太小开关速度快但EMI大电阻太大开关损耗大。如果是感性负载比如电机、继电器、电磁阀必须加续流二极管。二极管要选快恢复的比如1N4148、SS34。续流二极管的方向是反并联在负载两端阴极接电源正极。高边驱动要用PMOS或者专用高边驱动芯片。PMOS的栅极需要拉到比源极低才能导通所以要用三极管或者专用芯片来驱动。我一般用IRF4905做高边配合S8050三极管拉低栅极。死区问题出现在H桥驱动里。上下两个MOS不能同时导通否则电源直接短路。死区时间一般几百纳秒到几微秒具体看MOS的开关速度。很多MCU的PWM外设支持死区插入配置一下就行。4.3 继电器驱动三极管选型与吸收电路继电器驱动和MOS驱动类似但继电器是电流驱动不是电压驱动。MCU的GPIO驱动能力一般20mA继电器线圈电流可能50mA到100mA所以要加三极管或者MOS。三极管选S8050、S8550、2N3904这些通用型号就行。基极电阻按Ib Ic / β来算比如Ic80mAβ100Ib0.8mA基极电阻(3.3-0.7)/0.8≈3.3kΩ。实际选1k到4.7k都可以。继电器线圈两端要加续流二极管1N4148或者1N4007都行。如果继电器触点要控制交流负载还要加RC吸收电路或者压敏电阻抑制触点火花。继电器的坑线圈和触点要隔离PCB上爬电距离要够触点电流不要超过额定值否则触点粘连驱动三极管的集电极电流要留余量。5. 常见问题排查与避坑经验实录5.1 板子不启动从电源到启动模式的排查顺序板子回来不启动按这个顺序查测电源每一路电压对不对纹波大不大。用示波器看不要只用万用表。测复位复位引脚电压是不是高电平有没有复位脉冲。测晶振用示波器看晶振引脚有没有波形频率对不对。测启动模式BOOT引脚的电平对不对启动模式选对了没有。测调试接口SWD或者JTAG能不能连上如果能连上说明内核在跑问题在程序。测启动电流电流异常大可能有短路电流很小可能没启动。我遇到过最诡异的一次板子偶尔不启动查了半天是复位电容用了1μF上电时复位引脚上升太慢MCU在电压不够的时候就开始跑。换成100nF就好了。5.2 通信不稳定示波器抓波形的正确姿势通信不稳定第一件事是抓波形。示波器探头要用短的接地弹簧不要用长地线否则测出来的波形全是振铃。触发方式用边沿触发触发电平设在信号幅度的50%。看波形重点看上升沿和下降沿是否干净有没有过冲和振铃电平幅度是否满足要求时钟和数据的关系是否正确有没有毛刺。I2C通信失败先看SCL和SDA有没有上拉上拉电阻多大波形上升沿是不是太缓。SPI通信失败先看CS有没有拉低SCK有没有波形CPOL和CPHA对不对。UART通信失败先看波特率对不对TX和RX有没有接反。5.3 模拟采样跳变地平面分割与滤波实战ADC采样跳变原因一般三个电源噪声、地噪声、信号本身噪声。电源噪声ADC的供电要干净用LDO单独供电旁边放0.1μF和10μF电容。如果和数字部分共用电源中间加磁珠或者电感隔离。地噪声模拟地和数字地要分开单点连接。ADC的模拟输入地和基准地要接到模拟地。我见过模拟地和数字地混在一起ADC采样值跳几十个LSB。信号噪声加RC滤波截止频率根据信号频率定。如果信号源阻抗高加运放缓冲。如果信号有共模干扰用差分输入或者仪表放大器。提示ADC采样的时候先采一个已知电压比如基准电压或者地看看采样值对不对。如果基准采样都不准那就是基准或者电源的问题。5.4 常见问题速查表现象可能原因解决方法板子不启动电源、复位、晶振、启动模式逐项排查通信失败上拉、电平、时钟极性、波特率抓波形对比ADC跳变电源噪声、地噪声、信号噪声滤波、隔离、屏蔽MOS发热栅极电阻、开关频率、散热调电阻、加散热片继电器不动作驱动电流、续流二极管、触点测线圈电压、换驱动晶振不起振负载电容、走线、晶振质量换电容、换晶振复位异常复位芯片、电容、走线换芯片、调电容功耗大LDO静态电流、外设漏电换LDO、查漏电6. 从原理图到PCB布局布线的经验之谈6.1 电源布局输入电容、电感与反馈路径电源布局的核心是减小环路面积。DC-DC的输入电容、开关管、电感、输出电容构成的环路要尽量小。输入电容靠近VIN引脚输出电容靠近电感输出端反馈电阻靠近FB引脚反馈走线远离电感和开关节点。LDO的布局相对简单输入输出电容靠近引脚就行。但要注意散热LDO的功耗(Vin-Vout)*Iout功耗大的时候要铺铜散热。地平面要完整不要被信号线割裂。电源走线要粗一般1A电流走1mm宽2A走2mm宽。如果空间允许电源走线尽量宽。6.2 信号走线时钟、差分与模拟信号的隔离时钟信号要短不要跨分割地平面两边包地。差分信号要等长差分阻抗要匹配一般100Ω或120Ω。模拟信号要远离数字信号特别是时钟和数据线。如果实在避不开垂直交叉不要平行走。I2C和SPI的走线不要太长一般不超过30cm。UART走线可以长一点但也要注意串扰。CAN和RS485的差分线要成对走终端电阻放在连接器附近。6.3 接地策略单点接地与多点接地的选择低频电路用单点接地高频电路用多点接地。混合信号电路模拟地和数字地分开单点连接。连接点一般选在ADC或者DAC的下方。地平面的分割要谨慎。我见过把地平面割得七零八落的信号回流路径断了EMI严重超标。如果拿不准就用完整地平面靠布局来隔离。6.4 调试接口与测试点预留的艺术调试接口一定要引出SWD最少要四根线VCC、GND、SWDIO、SWCLK。最好再加一根RESET。测试点要留够电源、地、关键信号都留测试点。测试点用1mm的焊盘就行不要太大。我习惯在板子上留几个LED做状态指示电源、运行、通信各一个。调试的时候不用示波器就能看个大概。串口也引出打印调试信息。7. 写在最后一些零散但值钱的经验做嵌入式硬件十几年踩过的坑比画过的板子还多。最后分享几条零散但很值钱的经验第一数据手册永远是对的但你要看对版本。我遇到过用旧版手册设计新版芯片改了引脚定义板子回来直接废掉。每次设计前去官网下最新版手册。第二参考设计可以抄但要理解为什么。原厂的参考设计通常是最小系统实际产品要加保护、加滤波、加测试点。抄的时候要想清楚每一部分的作用。第三PCB打样前让另一个人帮你看一遍。自己画的板子自己查永远查不出问题。别人一眼就能看到你接错的线。第四留够调试余量。电源电流留30%PCB面积留20%接口留测试点。调试的时候你会感谢自己。第五记录每一次改版的原因。我有个Excel表记录每个项目的改版记录版本号、改了什么、为什么改、谁改的。下次做类似项目翻出来看看能省很多时间。嵌入式外围电路设计没有捷径就是一个个模块啃一个个坑踩。但每踩一个坑你就比昨天更靠谱一点。希望这篇东西能帮你少踩几个坑。
返回列表