1. 750V直流采样到底难在哪从分压比到隔离屏障的完整推演新能源车的高压母线动辄400V起步满载工况下750V甚至更高都是常态。给这样一条母线做电压采样表面上看就是“分压ADC”两件事但真正动过手的人都知道坑几乎全藏在细节里。我第一次做BMS高压采样板的时候想当然地用了一组电阻分压直接怼进STM32的ADC引脚上电瞬间芯片就冒烟了——高压侧和低压侧共地母线的高电位直接灌进了MCU。这个教训让我彻底理解了为什么高压采样必须做电气隔离。所谓隔离本质上是让高压侧和低压侧之间没有直接的电气通路信号通过光、磁或者电容的方式“隔空”传过来。在750V这个等级上隔离不仅是功能需求更是安全底线。你想想整车高压系统和12V低压系统如果共地一旦高压侧出现异常整个低压控制网络都会被波及这是绝对不能接受的。那为什么选HCNR200这颗线性光耦市面上做隔离的方案不少磁隔离比如AMC1301、电容隔离比如ISO224都有各自的优势。HCNR200的核心价值在于它的线性度和灵活性。它内部有一个LED和两个匹配的光电二极管一个用来反馈servo photodiode一个用来输出output photodiode。两个光电二极管的特性高度一致通过运放构成负反馈回路可以让LED的光输出与输入电流保持极好的线性关系。典型非线性度只有0.01%这在光耦里算是相当优秀的水平。更重要的是HCNR200是电流输入、电流输出的器件外围电路完全由你自己设计。你可以用运放把它配置成电压输入/电压输出、 bipolar输入、甚至4-20mA电流环。这种灵活性是很多集成隔离放大器做不到的。对于750V直流采样这个场景我们可以用高阻值分压网络把750V降到几百毫伏再通过运放缓冲后驱动HCNR200的输入侧输出侧经过I/V转换后送入STM32的ADC。整个链路的设计自由度很高但每一个环节都有讲究。这里先给出一个整体架构的思路高压侧用精密电阻分压分压后的信号经过一个运放做缓冲和电平偏移然后驱动HCNR200的输入LED。HCNR200的输出侧通过另一个运放做电流-电压转换得到0-3.3V的电压信号直接接入STM32的ADC引脚。两侧的供电完全独立高压侧的运放用隔离电源模块供电低压侧用MCU的3.3V供电。这样750V的高压和STM32之间就建立了一道可靠的隔离屏障。注意高压侧的分压电阻必须选用高压专用电阻耐压值要留足余量。普通贴片电阻的耐压通常只有200V左右直接用在750V上会击穿。2. HCNR200的引脚逻辑与外围电路设计要点2.1 先搞清楚HCNR200内部到底有什么HCNR200是8引脚DIP或SMD封装内部结构并不复杂但第一次看数据手册的人容易被那几个光电二极管搞晕。简单来说它里面有一个LED、一个反馈光电二极管PD1和一个输出光电二极管PD2。LED发出的光同时照到PD1和PD2上PD1的电流被用来做反馈控制PD2的电流就是输出信号。引脚定义大致是这样的1脚和2脚是LED的阳极和阴极3脚和4脚是PD1的阴极和阳极5脚和6脚是PD2的阴极和阳极7脚和8脚通常是空脚或者内部连接。不同厂家的封装可能略有差异但核心逻辑一致。你在画原理图的时候一定要对照具体型号的数据手册确认引脚顺序我见过有人把PD1和PD2接反了结果电路完全不工作。2.2 输入侧运放电路让LED电流与输入电压成线性关系HCNR200的输入侧需要一个运放来构成负反馈回路。基本接法是输入电压通过一个电阻R1接到运放的反相输入端运放的输出驱动LEDPD1接在运放的反相输入端和输出端之间形成反馈。这样运放会强制PD1的电流等于输入电压除以R1而由于PD1和PD2的匹配特性PD2的电流也会等于这个值乘以一个传输增益K通常在0.9到1.1之间。具体来说假设输入电压是VinR1是输入电阻那么流过PD1的电流Ipd1 Vin / R1。由于HCNR200的传输增益K Ipd2 / Ipd1典型值为1所以Ipd2也等于Vin / R1。这个电流从PD2流出经过输出侧的运放做I/V转换最终得到输出电压Vout Ipd2 × R2 Vin × R2 / R1。整个链路的增益就是R2/R1非常直观。这里有个关键点输入运放必须选择能够输出足够驱动电流的型号。HCNR200的LED正向电流典型工作范围是1mA到20mA最大不超过25mA。如果你的输入电压范围是0-500mVR1取100Ω那么最大LED电流就是5mA这在合理范围内。但如果R1取太小LED电流过大会加速光耦老化缩短寿命。我一般会把最大LED电流控制在10mA左右留足余量。2.3 输出侧I/V转换把电流变成STM32能读的电压输出侧的设计相对简单但同样有坑。PD2输出的电流需要经过一个运放做电流-电压转换。最基本的接法是把PD2接到运放的反相输入端运放的同相输入端接地或者接一个参考电压反馈电阻R2跨接在输出端和反相输入端之间。这样运放的输出电压就是Ipd2 × R2。但这里要注意运放的输入偏置电流。PD2输出的电流可能在微安级别如果运放的输入偏置电流太大会直接引入误差。比如一个输入偏置电流为1μA的运放在1μA的信号电流下误差就是100%完全不能用。所以输出侧运放必须选低偏置电流的型号比如CMOS输入或者JFET输入的运放偏置电流在pA级别。我常用的是TLV2372或者OPA2376实测效果很稳。另外输出侧的运放供电要和STM32的ADC参考电压匹配。如果STM32的VDDA是3.3V那么输出运放的供电也应该是3.3V并且输出范围要能覆盖0-3.3V。有些轨到轨运放在接近电源轨的时候输出会失真所以最好留出100mV左右的余量让ADC的有效输入范围在0.1V到3.2V之间。2.4 隔离电源高压侧运放的“口粮”从哪来高压侧的运放和HCNR200的LED都需要供电但这个供电必须和低压侧隔离。常见的方案是用一个小功率的隔离DC-DC模块比如B0505S或者类似型号输入5V输出5V隔离电压通常有1kV到3kV。对于750V的应用隔离电压至少要选1.5kV以上的模块留足安全余量。隔离电源的纹波会影响采样精度所以后面最好加一级LDO或者RC滤波。我一般会在隔离电源输出后加一个10Ω电阻和10μF电容组成的低通滤波把开关噪声压下去。实测下来不加滤波的话ADC读数会有几十个LSB的跳动加了之后能稳定在几个LSB以内。提示隔离电源模块的隔离电容会随着温度和时间变化如果对精度要求极高可以考虑用变压器隔离或者电容隔离的方案但成本和复杂度会上升。3. 750V到3.3V的分压网络计算与电阻选型3.1 分压比的计算从750V到500mV假设我们希望在750V满量程时分压后的电压是500mV那么分压比就是750V / 0.5V 1500:1。如果选择高压侧电阻R_high和低压侧电阻R_low串联那么R_high / R_low 1499。假设R_low取100Ω那么R_high就是149.9kΩ。这个阻值不算离谱但要注意功耗。高压侧电阻上的功耗是V²/R 750² / 149900 ≈ 3.75W。这个功耗相当大普通电阻根本扛不住。所以实际设计中高压侧通常会用多个电阻串联来分摊功耗和电压。比如用10个15kΩ的电阻串联总阻值150kΩ每个电阻承受75V电压和0.375W功耗。这样每个电阻的耐压和功率都在安全范围内。低压侧电阻的功耗很小750V乘以分压后的电流电流大约是750V / 150kΩ 5mA低压侧100Ω上的功耗只有2.5mW完全不用考虑。3.2 电阻选型精度、温漂、耐压一个都不能少分压电阻的精度直接决定了采样精度。如果你用1%精度的电阻分压比就会有1%的误差对应到750V上就是7.5V的误差这在BMS里是不可接受的。所以高压侧和低压侧的电阻都要选0.1%甚至更高精度的型号。温漂同样重要。电阻的温漂会导致分压比随温度变化在车载环境下温度范围可能从-40°C到125°C如果电阻的温漂是100ppm/°C那么在整个温度范围内分压比的变化可能达到1.65%对应750V就是12V的误差。所以最好选25ppm/°C以下的低温漂电阻比如Vishay的PTF系列或者Ohmite的精密电阻。耐压方面前面说了单个电阻的耐压有限所以要用多个电阻串联。每个电阻承受的电压不要超过其额定耐压的80%。比如一个电阻的额定耐压是200V那么实际承受电压不要超过160V。对于750V至少需要5个电阻串联但考虑到余量和功耗我一般会用8到10个。3.3 实际电路中的分压网络布局分压网络的布局也很讲究。高压侧的电阻要尽量远离低压侧的敏感电路避免高压电场耦合过去。PCB上要保证足够的爬电距离750V的爬电距离至少要有5mm以上如果环境有污染还要加大。我通常会在高压侧和低压侧之间开一个隔离槽把PCB铣穿这样能有效增加爬电距离。另外分压网络的接地点要选在高压侧的“地”这个地和低压侧的地是完全隔离的。高压侧的运放、HCNR200的输入侧、隔离电源的输出侧都接这个地。低压侧的运放、HCNR200的输出侧、STM32的ADC接低压地。两个地之间只有HCNR200的光路连接没有电气连接。4. STM32的ADC配置与采样代码实战4.1 ADC时钟与采样时间别让采样时间成为精度瓶颈STM32的ADC时钟ADCCLK不能超过芯片手册规定的最大值比如STM32F103的ADCCLK最大是14MHzSTM32F4系列可以到36MHz。ADCCLK由APB2时钟分频得到分频系数要选对。比如APB2是72MHz分频系数选6ADCCLK就是12MHz在F103的安全范围内。采样时间Sampling Time决定了ADC内部采样保持电容的充电时间。如果采样时间太短采样电容充不满读数就会偏低。对于高阻抗信号源采样时间要加长。我们的信号经过运放缓冲后输出阻抗很低所以采样时间可以短一些但为了保险我一般会选55.5个ADC周期或者更长。在12MHz的ADCCLK下55.5个周期大约是4.6μs对于大多数应用足够了。4.2 多次采样与均值滤波用软件换精度STM32的ADC本身有±1到±2个LSB的噪声单次采样精度有限。我通常会用多次采样取平均的方法来降噪。比如连续采样16次去掉最大值和最小值剩下的14次取平均。这样能把随机噪声降低到原来的1/√14效果很明显。代码实现上可以用DMA让ADC自动把数据搬到内存数组里然后CPU在后台做滤波。这样不占用CPU时间效率很高。下面是一段基于HAL库的示例代码#define ADC_BUF_SIZE 16 uint16_t adc_buf[ADC_BUF_SIZE]; void ADC_Init(void) { // ... ADC和DMA初始化代码 ... HAL_ADC_Start_DMA(hadc1, (uint32_t*)adc_buf, ADC_BUF_SIZE); } float Get_Voltage(void) { uint32_t sum 0; uint16_t min 0xFFFF, max 0; for (int i 0; i ADC_BUF_SIZE; i) { if (adc_buf[i] min) min adc_buf[i]; if (adc_buf[i] max) max adc_buf[i]; sum adc_buf[i]; } sum - min; sum - max; float avg (float)sum / (ADC_BUF_SIZE - 2); // 假设VREF 3.3V12位ADC float voltage avg * 3.3f / 4095.0f; // 根据分压比换算回高压侧电压 // 假设分压比是1500:1运放增益是1 float high_voltage voltage * 1500.0f; return high_voltage; }这段代码里Get_Voltage函数做了去极值平均滤波然后根据ADC参考电压和分压比换算出高压侧的实际电压。实际使用时还需要考虑运放的增益和HCNR200的传输增益这些可以在标定时统一修正。4.3 校准没有校准的采样都是耍流氓再精密的电阻也有误差再好的运放也有失调电压。所以校准是必须的。校准的方法很简单在已知输入电压下记录ADC读数然后计算实际增益和偏移。比如在0V和500V两个点分别测量得到两组ADC读数然后用线性拟合求出增益和偏移。我通常会在产线上做两点校准把校准系数存在STM32的Flash里。每次上电时读取系数对ADC读数做修正。这样能把整体精度做到1%以内好的话可以到0.5%。校准的时候要注意高压源本身也要准。如果高压源的精度只有1%那校准出来的结果也不会比1%更好。所以校准用的高压源至少要比目标精度高一个数量级比如目标1%高压源就要0.1%精度。5. 实测中那些数据手册不会告诉你的坑5.1 HCNR200的传输增益离散性比你想的大数据手册上写HCNR200的传输增益K典型值是1但实际批次之间可能有±10%甚至更大的离散性。这意味着你设计的时候不能指望K精确等于1必须留出校准空间。我遇到过一批HCNR200K值普遍在0.85左右如果按1设计输出就偏低了15%。所以电路设计时R2要用可调电阻或者预留多个焊盘方便调整增益。另外K值还会随温度变化虽然变化不大典型值0.005%/°C但在高精度应用里也要考虑。如果温度范围很宽最好用软件做温度补偿或者选温度特性更好的隔离方案。5.2 运放的失调电压会被放大输入侧的运放失调电压会直接叠加在输入信号上然后被后面的电路放大。比如一个失调电压为1mV的运放在1500倍的分压比下等效到高压侧就是1.5V的误差。所以输入运放必须选低失调电压的型号比如OPA333失调电压10μV或者ADA4522失调电压5μV。输出侧的运放失调电压影响相对小一些但也不能忽视。我一般会在输入运放上加一个调零电路或者用软件校准把失调电压修掉。软件校准更简单但需要保证失调电压不随温度剧烈变化。5.3 PCB布局隔离不是画条线就完事了很多人以为在PCB上画一条隔离带就实现了隔离其实远不止。隔离带两侧的铜箔要完全断开不能有任何跨接。隔离带下面不能走任何信号线否则会通过寄生电容耦合。HCNR200本身要跨在隔离带上方它的引脚要分别落在两侧。高压侧的走线要尽量短粗减少电感和电阻。低压侧的走线要远离高压侧避免耦合。如果空间允许最好在高压侧和低压侧之间加一层屏蔽接地到低压侧的地。还有一点隔离电源模块的布局。隔离电源的输入和输出之间也有隔离带这个隔离带要和信号隔离带对齐不能交叉。否则隔离电源的隔离电压会被信号隔离带破坏。5.4 温漂测试高低温下的表现才是真实力实验室常温下测得好好的一到高低温就飘了这是很常见的问题。我建议在设计阶段就做高低温循环测试从-40°C到125°C每隔25°C测一次采样精度。记录每个温度点的误差然后决定是否需要温度补偿。温度补偿可以用查表法把不同温度下的修正系数存在Flash里运行时根据温度传感器读数查表修正。也可以用多项式拟合把误差曲线拟合成一个公式运行时实时计算。查表法简单可靠我一般优先用查表法。6. 从采样到BMS这个电路还能怎么扩展6.1 多路采样用多路复用器扩展通道一个HCNR200只能采一路电压但BMS通常需要监测几十甚至上百节电芯的电压。这时候可以用多路复用器在高压侧切换把多路信号轮流送到HCNR200的输入端。多路复用器要选高压型号比如ADG5408或者类似器件耐压要覆盖750V。切换的时候要注意建立时间。多路复用器切换后信号需要一段时间才能稳定ADC要等稳定后再采样。建立时间取决于多路复用器的导通电阻和后续电路的输入电容一般几十微秒到几百微秒。可以在软件里加一个延时或者用硬件做快速建立。6.2 隔离CAN通信把数据传出去采样到的电压数据需要传给整车控制器通常用CAN总线。但CAN总线是低压侧的和高压侧隔离。所以需要一颗隔离CAN收发器比如ISO1050或者ADM3053。这些芯片内部集成了隔离可以直接把低压侧的CAN信号隔离后送到高压侧或者反过来。隔离CAN的供电也要注意高压侧和低压侧各用各的电源不能共地。ISO1050的隔离电压通常有2.5kV以上对于750V系统足够了。6.3 功能安全ISO 26262的要求不能忽视如果这个采样电路用在量产车上还要考虑ISO 26262功能安全的要求。ASIL等级取决于具体的应用场景但一般来说高压采样至少要做到ASIL B或者ASIL C。这意味着电路要有冗余设计比如双路采样、交叉校验还要有诊断功能能检测出开路、短路、漂移等故障。诊断功能可以通过在采样电路里加测试注入来实现。比如在输入端加一个已知的测试电压定期检查ADC读数是否正常。如果读数偏离预期就报故障。这样能在不增加太多成本的情况下满足功能安全的要求。6.4 成本优化从实验室到量产实验室里用的都是最好的器件但量产要考虑成本。HCNR200本身不便宜一颗要十几块钱。如果成本压力大可以考虑用普通光耦加软件校准的方案比如PC817虽然线性度差很多但通过多点校准也能做到1%左右的精度。不过PC817的温漂很大校准系数需要随温度变化软件复杂度会上升。另一个思路是用电容隔离或者磁隔离的集成方案比如TI的AMC1301虽然单价可能更高但外围电路简单整体BOM成本可能更低。具体选哪个方案要看项目的成本目标和精度要求。7. 写在最后一些个人经验做高压采样这些年我最大的体会是精度是设计出来的不是调出来的。如果你在原理图阶段没有把分压比、运放选型、PCB布局这些基础打好后面再怎么调代码、换器件也很难达到理想的精度。我见过太多项目硬件设计有缺陷软件工程师拼命做滤波和校准最后还是不稳定。另一个体会是测试要覆盖极端工况。常温下测得好不代表没问题高低温、振动、湿度、电磁干扰这些都要考虑。我一般会在设计阶段就做EMC预测试看看采样电路对辐射干扰和传导干扰的敏感度。如果发现问题及早改板比后期整改成本低得多。最后HCNR200虽然是一颗老器件但在高压隔离采样这个领域它的性价比和灵活性依然很有竞争力。只要把外围电路设计好校准做到位750V直流采样完全可以做到0.5%以内的精度。希望这些经验对你有帮助少走一些我当年走过的弯路。