用 Python 检查微型泵的压力余量:从泵曲线到系统工作点

0 阅读6分钟

微型泵选型时,一个常见误区是:目标流量为 Q,只要泵的“最大流量”大于 Q 就可以。实际上,最大流量通常对应接近零背压;最大压力则对应接近零流量。泵装入液路后,真正的流量由泵曲线与系统阻力曲线的交点决定,也就是系统工作点。

本文用一个简化的 Python 模型,把静压、管路层流压降、阀和接头的局部损失放在同一张压力预算中,并计算:

  1. 目标流量下需要多少压力;

  2. 泵在该流量下还能提供多少压力;

  3. 泵曲线与系统曲线的实际交点在哪里;

  4. 黏度、内径和过滤器负载变化后,压力余量是否仍然足够。

示例参数仅用于演示方法,不代表具体泵或元件的实测性能。最终选型应使用厂家曲线和整机台架数据。

1. 最大流量和最大压力为什么不能直接用于工作点

假设一台泵的数据表给出:

  • 零背压最大流量:120 mL/min

  • 截止压力:80 kPa

这并不意味着泵能在 120 mL/min 时同时输出 80 kPa。为了演示,可先用一个二次函数近似泵曲线:


ΔP_pump(Q) = ΔP_shutoff × [1 - (Q / Q_free)²]

真实泵曲线未必是二次函数,可能还受驱动电压、PWM、频率、温度、介质和泵体公差影响。工程计算时,应把下面的近似函数替换为厂家曲线的插值结果。

2. 把液路需求写成系统压力曲线

系统需要的压力可以拆成三部分:


ΔP_system(Q) = ΔP_static + ΔP_laminar(Q) + ΔP_minor(Q)

其中:

  • ΔP_static 是液位差、密闭容器压力或其他与流量无关的静压;

  • 圆管层流压降与流量近似成正比;

  • 接头、弯头、阀口等局部损失常用与速度平方相关的形式估算。

圆管层流可使用 Hagen–Poiseuille 关系:


ΔP_laminar = 128 μLQ / (πd⁴)

这里最值得警惕的是 d⁴:内径的小幅变化,会显著改变系统阻力。

3. 建立一个可复用的 Python 模型

下面的代码统一用 SI 单位计算,输入和输出再转换为工程常用单位。


from dataclasses import dataclass

from math import pi

  


  


@dataclass

class FluidPath:

    length_m: float

    inner_diameter_m: float

    viscosity_pa_s: float

    density_kg_m3: float = 1000.0

    minor_k: float = 0.0

    static_pressure_pa: float = 0.0

  


  


def ml_min_to_m3_s(flow_ml_min: float) -> float:

    return flow_ml_min * 1e-6 / 60.0

  


  


def pump_pressure_pa(

    flow_ml_min: float,

    free_flow_ml_min: float,

    shutoff_pressure_kpa: float,

) -> float:

    ratio = max(0.0, flow_ml_min / free_flow_ml_min)

    return max(0.0, shutoff_pressure_kpa * 1000.0 * (1.0 - ratio**2))

  


  


def system_pressure_pa(flow_ml_min: float, path: FluidPath) -> float:

    q = ml_min_to_m3_s(flow_ml_min)

    d = path.inner_diameter_m

    area = pi * d**2 / 4.0

    velocity = q / area

  


    dp_tube = 128.0 * path.viscosity_pa_s * path.length_m * q / (pi * d**4)

    dp_minor = path.minor_k * path.density_kg_m3 * velocity**2 / 2.0

  


    return path.static_pressure_pa + dp_tube + dp_minor

现在给出一组演示工况:0.8 mm 内径、0.6 m 总管长、水状液体、局部阻力系数合计为 3,并包含 8 kPa 静压。


path = FluidPath(

    length_m=0.60,

    inner_diameter_m=0.80e-3,

    viscosity_pa_s=1.2e-3,

    minor_k=3.0,

    static_pressure_pa=8_000.0,

)

  


free_flow = 120.0       # mL/min

shutoff_pressure = 80.0 # kPa

target_flow = 60.0      # mL/min

  


available = pump_pressure_pa(target_flow, free_flow, shutoff_pressure)

required = system_pressure_pa(target_flow, path)

margin = available - required

  


print(f"available: {available / 1000:.1f} kPa")

print(f"required:  {required / 1000:.1f} kPa")

print(f"margin:    {margin / 1000:.1f} kPa")

margin > 0 只说明目标点在这个简化模型中可达。它还不等于设计已经稳健,因为参数公差和工况变化会继续消耗余量。

4. 求泵曲线与系统曲线的交点

工作点满足:


ΔP_pump(Q) = ΔP_system(Q)

如果不依赖 SciPy,可以用二分法求解:


def operating_point_ml_min(

    path: FluidPath,

    free_flow_ml_min: float,

    shutoff_pressure_kpa: float,

    iterations: int = 80,

) -> tuple[float, float]:

    lo = 0.0

    hi = free_flow_ml_min

  


    for _ in range(iterations):

        mid = (lo + hi) / 2.0

        supply = pump_pressure_pa(

            mid,

            free_flow_ml_min,

            shutoff_pressure_kpa,

        )

        demand = system_pressure_pa(mid, path)

  


        if supply >= demand:

            lo = mid

        else:

            hi = mid

  


    flow = (lo + hi) / 2.0

    pressure = system_pressure_pa(flow, path)

    return flow, pressure

  


  


flow, pressure = operating_point_ml_min(

    path,

    free_flow,

    shutoff_pressure,

)

  


print(f"operating flow: {flow:.1f} mL/min")

print(f"operating pressure: {pressure / 1000:.1f} kPa")

如果目标流量高于求出的工作流量,不能简单地用更高 PWM“补回来”。应先确认泵曲线在新驱动条件下如何变化,并检查噪声、寿命、温升、脉动和电源能力。

5. 不要只检查标称工况

稳健性检查至少应覆盖以下边界:

  • 低温或高浓度试剂导致黏度上升;

  • 软管内径负公差;

  • 过滤器逐渐堵塞;

  • 阀、接头和针头的压降偏差;

  • 入口液位下降或出口容器背压上升;

  • 泵性能批次差异、老化和供电波动。

可以先做一个简单的敏感性扫描:


for viscosity_mpa_s in [1.0, 1.5, 2.0, 3.0]:

    case = FluidPath(

        length_m=path.length_m,

        inner_diameter_m=path.inner_diameter_m,

        viscosity_pa_s=viscosity_mpa_s * 1e-3,

        density_kg_m3=path.density_kg_m3,

        minor_k=path.minor_k,

        static_pressure_pa=path.static_pressure_pa,

    )

    q, dp = operating_point_ml_min(case, free_flow, shutoff_pressure)

    print(

        f"viscosity={viscosity_mpa_s:.1f} mPa·s, "

        f"Q={q:.1f} mL/min, ΔP={dp/1000:.1f} kPa"

    )

还可以把内径、管长、黏度和泵曲线参数作为随机变量做 Monte Carlo 分析,但在此之前,先把最坏情况边界列清楚通常更重要。

6. 工程落地时如何使用这张预算

推荐把压力预算分成三层:

  1. 计算值:直管、静压和有可靠参数的局部损失;

  2. 数据表值:阀、过滤器、针头、流量计等元件的压降曲线;

  3. 实测值:样机工作点、启动瞬态、阀切换和堵塞工况。

直管段可先用 FOREACH 流阻与压降计算器 核对单位、雷诺数和标称压降,再把结果放入系统级 Python 模型。对于非线性元件,应优先采用厂家曲线插值或实测表格,而不是强行套用直管公式。

最后,压力余量应在真实泵曲线和最坏工况上定义,而不是拿截止压力减去某一段管路的标称压降。若系统包含闭环流量控制,还要确认控制器在整个工作区间内仍有足够调节余量。

小结

微型泵的选型核心不是比较“最大流量”或“最大压力”两个孤立数字,而是找到泵曲线与系统曲线的交点。把静压、直管流阻、局部损失和元件曲线放在同一模型中,才能判断目标流量是否可达,以及工况变化后还剩多少压力余量。

本文由 FOREACH 工程团队整理,示例仅用于工程方法讨论。