简介:这份电路图设计资料面向嵌入式硬件工程师、电源设计初学者及机器人主控板开发者,围绕一块集成电源管理与通信接口的硬件板卡展开,重点解决多电压域供电、电源采样监控与工业总线通信等实际问题。压缩包内为1个PDF文件,约622KB,以原理图页形式呈现,涵盖电源输入、DCDC转换、采样与接口等模块,便于直接查阅与对照设计。内容涉及INA226电源采样、RS485收发器(TP75176)、防反接电路、12V降压3.3V与3.3V升压5V电路,并包含LMR14050、LMR62421等DCDC转换器及TPS2553电源管理方案,同时覆盖STM32F405主控、TMP275温度检测与CAT24C512存储、I2C与UART调试接口、电机驱动及外部传感器模块供电等设计细节。目前已有3945人学习,适合需要参考完整电源树与接口布局的读者快速获取设计思路与器件选型依据。
1. 一块机器人电源板卡的真实拆解起点
拿到 LX-GIS-2-PWR 这份原理图时,我第一反应不是去看 STM32F405 的引脚分配,而是翻到第二页看电源输入路径。原因很简单:机器人主控板烧过太多次,十次里有七次不是 MCU 的问题,而是电源域设计没兜住。这块板卡要同时伺候 11.1V 锂电池、12V 到 16.8V 的外部适配器、电机驱动、前视摄像头补光灯、RS485 总线收发、以及一堆 3.3V 和 5V 的外设模块,任何一个电源域出问题都会连锁反应。
它解决的核心问题是:在一块板子上把多路输入电源安全地合并、分配、监控,并且让主控能实时知道每一路电流电压的状态。适合谁看?做嵌入式硬件、机器人电控、工业网关的工程师,尤其是那些需要在锂电池和外部电源之间做无缝切换、还要做电流采样上报的场景。下面按电源输入、降压升压、采样监控、通信接口、调试排错几个技术点逐层拆。
2. 电源输入路径:理想二极管、防反接与 12V 降压 3.3V
2.1 LTC4359 理想二极管如何做电池与外部电源的自动切换
这块板子的输入有两个来源:11.1V 锂电池接口和外部 12V 到 16.8V 适配器。两者不能直接并联,否则电池会向适配器倒灌。原理图里用的是 LTC4359 搭配 NMOS(CSD18543Q3A)构成理想二极管电路。LTC4359 的 SOURCE 脚接 NMOS 源极,GATE 驱动栅极,IN 脚接输入电源,OUT 接负载侧。当输入电压高于输出侧时,芯片快速拉高 GATE,NMOS 导通,压降只有几十毫伏;当输入掉电或反接时,GATE 迅速拉低,MOS 关断,反向电流被切断。
相比肖特基二极管,理想二极管的优势在压降和发热。10A 电流下肖特基压降约 0.5V,功耗 5W,需要散热片;理想二极管压降约 0.02V,功耗 0.2W,几乎不发热。LTC4359 的 SHDN 脚可以用来做使能控制,原理图里通过电阻分压设定阈值。实际调试时要注意 GATE 引脚的上升时间,如果负载有大电容,浪涌电流会触发前级保护,常见做法是在 GATE 和 SOURCE 之间加一颗小电容延缓开通。
2.2 FSV20120V 防反接电路的工作逻辑
防反接用了两颗 FSV20120V,分别放在电池接口和外部电源接口后面。FSV20120V 是一颗 120V/20A 的肖特基二极管,这里不是用来做理想二极管,而是做极性保护。当电源正负极接反时,二极管反向截止,后级电路不会得到反向电压。选 120V 耐压是因为外部适配器最高 16.8V,但工业现场可能有浪涌,留足余量。
这里有个容易踩的坑:防反接二极管放在理想二极管前面还是后面。原理图里是放在前面,先防反接再做理想二极管切换。如果放在后面,反接时理想二极管的 NMOS 体二极管可能先导通,反而让反向电压窜到负载侧。所以顺序不能乱。
2.3 LMR14050 实现 12V 到 3.3V 的降压设计
12V 到 3.3V 的降压用的是 LMR14050,这是一颗 40V/5A 的同步降压转换器。原理图里反馈电阻是 R24=34K 和 R31=20K,输出电压计算:
Vout = 0.75V × (1 + R24/R31) = 0.75 × (1 + 34/20) = 0.75 × 2.7 = 2.025V等等,这个结果不对。重新看原理图,LMR14050 的 FB 基准是 0.75V,但原理图里标注的是Vout =(34K/10K)*0.75+0.75=3.3V,说明实际用的是 34K 和 10K。R31 在原理图里标注 20K 可能是另一路的分压。按 34K 和 10K 算:
Vout = 0.75 × (1 + 34/10) = 0.75 × 4.4 = 3.3V正确。LMR14050 的开关频率由 RT/SYNC 脚电阻设定,原理图里 R23=100K,对应约 400KHz。电感 L2 是 6.8uH/4A,输出电容 C19 是 22uF/10V。输入电容 C1 是 10uF/50V,C2 是 0.1uF/50V。EN 脚通过 R33=310K 和 R34=100K 分压,使能阈值约 1.2V,对应输入电压约 4.8V 时启动。
实际布局时,输入电容要尽量靠近 VIN 和 GND 引脚,FB 反馈走线要远离 SW 节点,否则输出纹波会变大。如果输出带载后电压跌落,先查电感饱和电流是否够,再查 FB 电阻精度。
2.4 3.3V 升压 5V:LMR62421 的反馈电阻计算
5V 系统由 LMR62421 从 3.3V 升压得到。这是一颗 2.7V 到 5.5V 输入的升压转换器,开关频率 1.6MHz。反馈基准是 1.25V,原理图里 R30=20K,R2=10K:
Vout = 1.25 × (1 + R30/R2) = 1.25 × (1 + 20/10) = 1.25 × 3 = 3.75V这个结果也不是 5V。再看原理图标注Vout=((30/10)+1)*1.25=5V,说明实际用的是 30K 和 10K。按 30K 和 10K 算:
Vout = 1.25 × (1 + 30/10) = 1.25 × 4 = 5V正确。LMR62421 的 EN 脚通过 R10=4.7K 和 R11=4.7K 分压,使能阈值约 0.6V,3.3V 输入时 EN 电压约 1.65V,正常使能。电感 L1 是 3.3uH/1.32A,输出电容 C15 是 2.2uF/50V。升压电路布局时,SW 节点面积要小,反馈走线要短,否则容易振荡。
| 电源域 | 芯片 | 输入 | 输出 | 关键电阻 | 电感 |
|---|---|---|---|---|---|
| 12V→3.3V | LMR14050 | 12V | 3.3V/3A | 34K/10K | 6.8uH |
| 3.3V→5V | LMR62421 | 3.3V | 5V/0.3A | 30K/10K | 3.3uH |
| 电池切换 | LTC4359 | 11.1V | 跟随 | 分压设定 | 无 |
| 防反接 | FSV20120V | 12-16.8V | 跟随 | 无 | 无 |
3. INA226 电源采样电路与 I2C 地址配置
3.1 INA226 的采样原理与分流电阻选型
INA226 是一颗 16 位 I2C 接口的电流/电压/功率监控芯片,共模电压范围 0V 到 36V,适合这块板子的 12V 和 5V 电源域。它通过测量分流电阻两端的差分电压来计算电流,同时测量 VBUS 对地电压。原理图里 INA226 的 IN+ 和 IN- 接在分流电阻 R17=0.005Ω 两端,VBUS 接在负载侧。
分流电阻选 0.005Ω 是因为最大电流 10A 时,压降只有 50mV,功耗 0.5W。INA226 的差分输入范围是 ±81.92mV,0.005Ω 对应最大电流 16.384A,留了余量。如果选 0.01Ω,最大电流 8.192A,10A 时会超量程。所以 0.005Ω 是合理的。
电流计算公式:
Current = (ShuntVoltage / Rshunt) = (ShuntVoltage / 0.005)INA226 的 ShuntVoltage 寄存器是 2.5uV/LSB,所以 50mV 对应 20000 个 LSB。实际读取时:
// INA226 读取电流值 #define INA226_ADDR 0x40 #define SHUNT_RESISTOR 0.005f #define CURRENT_LSB 0.001f // 1mA/LSB float ina226_read_current(I2C_HandleTypeDef *hi2c) { uint8_t reg = 0x04; // Current Register uint8_t data[2]; HAL_I2C_Master_Transmit(hi2c, INA226_ADDR << 1, ®, 1, 100); HAL_I2C_Master_Receive(hi2c, (INA226_ADDR << 1) | 1, data, 2, 100); int16_t raw = (int16_t)((data[0] << 8) | data[1]); return raw * CURRENT_LSB; // 返回安培 }这里 CURRENT_LSB 需要根据校准寄存器设置。INA226 的校准寄存器值:
CAL = 0.00512 / (CURRENT_LSB × Rshunt)如果 CURRENT_LSB 设为 1mA,Rshunt=0.005Ω:
CAL = 0.00512 / (0.001 × 0.005) = 0.00512 / 0.000005 = 1024所以校准寄存器写 1024。实际调试时,如果读到的电流值偏大或偏小,先查校准寄存器是否写对,再查分流电阻的实际阻值。
3.2 I2C 地址冲突与 TMP275/CAT24C512 的地址分配
原理图里 I2C1 总线上挂了 INA226、TMP275 和 CAT24C512。INA226 的地址由 A0 和 A1 引脚决定,原理图里 A0 和 A1 都接地,地址是 0x40。TMP275 的地址由 A0/A1/A2 决定,原理图里 A0/A1/A2 都接地,地址是 0x48。CAT24C512 的地址由 A0/A1/A2 决定,原理图里 A0/A1/A2 都接地,地址是 0x50。
三个器件地址不冲突,但要注意 7 位地址和 8 位地址的区别。HAL 库用的是 8 位地址,需要左移一位。INA226 的 7 位地址 0x40,8 位写地址是 0x80,读地址是 0x81。TMP275 的 7 位地址 0x48,8 位写地址是 0x90,读地址是 0x91。CAT24C512 的 7 位地址 0x50,8 位写地址是 0xA0,读地址是 0xA1。
原理图里标注的I2C ADDR write Ox92 read 0x93和I2C ADDR write OxA2 read 0xA3是 TMP275 和 CAT24C512 的 8 位地址,但写的是 0x92 和 0xA2,说明 A0 引脚可能接了 VCC 而不是 GND。实际以原理图连接为准,调试时用 I2C 扫描工具确认。
# 在 Linux 下用 i2cdetect 扫描 I2C 总线 i2cdetect -y 1 # 输出示例: # 0 1 2 3 4 5 6 7 8 9 a b c d e f # 40: 40 -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- # 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --如果扫描不到器件,先查上拉电阻。原理图里 I2C 上拉是 4.7K,3.3V 供电,电流约 0.7mA,符合 I2C 规范。如果上拉太大,上升沿变缓,高速通信会出错。
3.3 INA226 的 ALERT 引脚与功率报警配置
INA226 的 ALERT 引脚可以配置成过流、过压、欠压报警。原理图里 ALERT 通过 R25=100K 上拉到 3.3V,接到 MCU 的 PWR_ALERT 网络。配置报警阈值:
// 设置 INA226 过流报警阈值为 8A void ina226_set_alert_current(I2C_HandleTypeDef *hi2c, float current_limit) { uint8_t reg = 0x07; // Alert Limit Register uint16_t limit = (uint16_t)(current_limit / CURRENT_LSB); uint8_t data[2] = {limit >> 8, limit & 0xFF}; HAL_I2C_Master_Transmit(hi2c, INA226_ADDR << 1, ®, 1, 100); HAL_I2C_Master_Transmit(hi2c, INA226_ADDR << 1, data, 2, 100); // 配置 Mask/Enable 寄存器,使能过流报警 reg = 0x06; uint16_t mask = 0x8000; // SOL 位,过流报警 data[0] = mask >> 8; data[1] = mask & 0xFF; HAL_I2C_Master_Transmit(hi2c, INA226_ADDR << 1, ®, 1, 100); HAL_I2C_Master_Transmit(hi2c, INA226_ADDR << 1, data, 2, 100); }ALERT 引脚是开漏输出,需要上拉。触发后 MCU 进入中断,读取状态寄存器判断报警类型。注意 ALERT 是锁存还是透明模式,由 Mask/Enable 寄存器的 AFF 位决定。锁存模式下需要读状态寄存器清除报警。
4. RS485 收发器 TP75176 与 UART5 通信实战
4.1 TP75176 的收发切换与 DE/RE 控制
RS485 收发器用的是 TP75176,兼容 75176 引脚。原理图里 RX 接 MCU 的 USART5_RX,TX 接 USART5_TX,DE 和 RE 接在一起由 USART5_CTRL 控制。DE 高电平发送,RE 低电平接收。因为 DE 和 RE 接在一起,所以发送时 DE 高、RE 高(发送禁止接收),接收时 DE 低、RE 低(接收使能)。
这种接法需要 MCU 在发送前拉高 CTRL,发送完拉低。如果 CTRL 切换不及时,总线会冲突。常见做法是用 UART 的 TC(发送完成)中断来切换:
// RS485 发送函数 void rs485_send(uint8_t *data, uint16_t len) { HAL_GPIO_WritePin(RS485_CTRL_GPIO_Port, RS485_CTRL_Pin, GPIO_PIN_SET); // DE 高,发送模式 HAL_UART_Transmit(&huart5, data, len, 1000); // 等待发送完成 while(__HAL_UART_GET_FLAG(&huart5, UART_FLAG_TC) == RESET); HAL_GPIO_WritePin(RS485_CTRL_GPIO_Port, RS485_CTRL_Pin, GPIO_PIN_RESET); // DE 低,接收模式 }如果发送完立即拉低 CTRL,最后一个字节可能还没移出移位寄存器,总线会被截断。所以必须等 TC 标志置位。有些方案用 DMA 发送完成中断来切换,效果一样。
4.2 RS485 终端电阻与总线匹配
原理图里 B12 是 120Ω 终端电阻,标注A/120 OHM。RS485 总线两端需要各接一个 120Ω 终端电阻,匹配电缆特性阻抗,减少反射。如果总线短于 10 米,可以不接;如果长于 100 米,必须接。这块板子作为总线的一个节点,终端电阻通过跳线或焊接选择。
实际组网时,如果通信不稳定,先查终端电阻。用万用表测 A-B 之间电阻,如果接近 60Ω,说明两端都有终端电阻;如果接近 120Ω,只有一端有;如果无穷大,没有终端电阻。另外查 A-B 之间的差分电压,空闲时应该大于 200mV,如果小于 200mV,说明偏置电阻不够。
4.3 根据 RS485 差分信号解析数据
RS485 是物理层协议,数据格式由上层协议决定。常见的是 Modbus RTU。解析数据时,先看波特率、数据位、停止位、校验位是否匹配。原理图里 UART5 的波特率由 MCU 配置,常见 9600 或 115200。
# Python 解析 Modbus RTU 帧 import serial def parse_modbus_rtu(frame): if len(frame) < 4: return None addr = frame[0] func = frame[1] if func == 0x03: # 读保持寄存器 byte_count = frame[2] data = frame[3:3+byte_count] crc = frame[3+byte_count:5+byte_count] # 校验 CRC calc_crc = crc16(frame[:3+byte_count]) if calc_crc != (crc[1] << 8 | crc[0]): return None registers = [] for i in range(0, byte_count, 2): registers.append((data[i] << 8) | data[i+1]) return {'addr': addr, 'func': func, 'registers': registers} return None def crc16(data): crc = 0xFFFF for byte in data: crc ^= byte for _ in range(8): if crc & 0x0001: crc = (crc >> 1) ^ 0xA001 else: crc >>= 1 return crc解析时注意字节序,Modbus 是大端。CRC 是低字节在前。如果解析出错,先抓原始波形,用示波器看差分信号是否干净,再查波特率误差。
5. 电源管理 TPS2553 与 LT1910 的限流与故障排查
5.1 TPS2553 的限流电阻计算与故障上报
TPS2553 是一颗限流配电开关,用于 5V 和 3.3V 外设模块供电。原理图里 R100=24.9K 设定限流值。TPS2553 的限流公式:
Ilimit = 22980 / Rilim^1.026Rilim=24.9K 时:
Ilimit = 22980 / 24900^1.026 ≈ 22980 / 31600 ≈ 0.727A约 0.73A。如果外设模块电流超过这个值,TPS2553 进入恒流模式,FAULT 引脚拉低。FAULT 是开漏输出,通过 R101=1K 上拉到 3.3V,接到 MCU 的 PWR_ALERT 网络。MCU 检测到 FAULT 低电平后,可以关闭该路电源或上报故障。
实际调试时,如果 FAULT 频繁触发,先查外设模块的峰值电流。有些模块启动瞬间电流是额定值的 2 到 3 倍,需要加大限流值或加软启动电路。
5.2 LT1910 高边驱动与电机供电的故障保护
LT1910 是一颗高边 NMOS 驱动芯片,用于电机驱动板和外部模块供电。原理图里用了两颗 LT1910,分别控制 MOTOR_PWR_CAR 和 MOTOR_PWR_ARM。LT1910 的 SENSE 脚接在 NMOS 源极和负载之间,通过 R36=0.005Ω 检测电流。当电流超过阈值时,LT1910 关断 GATE,FAULT 引脚拉低。
电流阈值计算:
Ilimit = Vsense / Rsense = 50mV / 0.005Ω = 10A原理图里标注Iset =10A,对应 Vsense=50mV。LT1910 的 TIMER 脚接 C30=0.1uF,设定故障后的重启时间。如果电机堵转,电流超过 10A,LT1910 关断,TIMER 电容充电,充电到阈值后尝试重启。如果故障持续,进入打嗝模式。
排查电机供电问题时,先查 LT1910 的 FAULT 引脚是否拉低,再查 SENSE 电阻是否烧断。如果电机不转但 FAULT 正常,查 GATE 电压是否升到 12V 以上,NMOS 是否导通。
5.3 电源域故障排查流程与关键测试点
这块板子的电源域多,排查时按以下顺序:
| 步骤 | 测试点 | 正常值 | 异常处理 |
|---|---|---|---|
| 1 | 电池接口电压 | 11.1V | 查电池或防反接二极管 |
| 2 | 理想二极管输出 | 11.1V | 查 LTC4359 GATE 电压 |
| 3 | 12V 输入电压 | 12-16.8V | 查适配器或防反接 |
| 4 | 3.3V 输出 | 3.3V±5% | 查 LMR14050 FB 分压 |
| 5 | 5V 输出 | 5V±5% | 查 LMR62421 FB 分压 |
| 6 | INA226 电流读数 | 与实际相符 | 查校准寄存器 |
| 7 | RS485 A-B 差分 | >200mV | 查终端电阻和偏置 |
| 8 | TPS2553 FAULT | 高电平 | 查外设电流 |
用万用表测电压,用示波器看纹波。3.3V 和 5V 的纹波应该小于 50mV。如果纹波大,查输出电容和电感。如果 INA226 读数跳变,查 I2C 上拉和电源去耦。
6. 用 INA226 做功率趋势记录与阈值联动
INA226 不只是读当前值,还可以做趋势记录。我一般会在 MCU 里开一个 100ms 的定时器,每次读 INA226 的电压、电流、功率,存到环形缓冲区。如果功率超过阈值,触发报警或降载。
// INA226 功率趋势记录 #define POWER_LOG_SIZE 100 float power_log[POWER_LOG_SIZE]; uint8_t power_log_idx = 0; void ina226_log_power(I2C_HandleTypeDef *hi2c) { float voltage = ina226_read_voltage(hi2c); float current = ina226_read_current(hi2c); float power = voltage * current; power_log[power_log_idx] = power; power_log_idx = (power_log_idx + 1) % POWER_LOG_SIZE; // 如果功率超过 50W,触发降载 if (power > 50.0f) { // 关闭非关键外设 HAL_GPIO_WritePin(IO_PWR_CTRL_GPIO_Port, IO_PWR_CTRL_Pin, GPIO_PIN_RESET); } }阈值联动时要注意迟滞,否则功率在阈值附近波动会频繁开关。常见做法是设两个阈值:超过 50W 关断,低于 45W 恢复。另外 INA226 的转换时间可以配置,默认 1.1ms,如果噪声大,可以加长转换时间做平均。
验证方法:用电子负载拉载,从 0A 慢慢加到 10A,看 INA226 读数是否线性。如果非线性,查分流电阻的温漂。0.005Ω 的电阻在 10A 时功耗 0.5W,温升可能导致阻值变化。选低温漂的合金电阻,或者做温度补偿。
最后提一个技巧:INA226 的 VBUS 和 IN+ 可以接不同点,VBUS 接负载侧,IN+ 接电源侧,这样可以同时测电源电压和负载电压,算线损。如果线损大,查走线宽度和连接器接触电阻。
本文还有配套的精品资源,点击获取