4. 尿素泵控制:尿素泵类型、PWM驱动原理、泵压力闭环调节

好,咱们进入第四章。这一章聊尿素泵,SCR系统里最“累”的部件之一。我当年刚接触SCR时,觉得尿素泵不就是个泵嘛,能有多复杂?结果第一次调试就给我来了个下马威——压力死活建不起来,查了三天,最后发现是回液管路里有个气泡。嗯,从那以后,我再也不敢小看这个“小东西”了。

4.1 尿素泵类型:气助式与非气助式

先说分类。尿素泵分两大类:气助式非气助式。说白了,就是看它需不需要压缩空气帮忙把尿素喷出去。

4.1.1 气助式尿素泵

气助式,顾名思义,需要压缩空气参与。尿素泵只负责建压(通常3-5 bar),然后靠压缩空气把尿素液滴打散、吹进排气管。这种方案在重型柴油机上很常见,尤其是欧五、欧六早期的系统。

  • 优点:雾化效果好,液滴直径可以做到50微米以下;对尿素结晶不敏感,因为空气一直在吹。
  • 缺点:系统复杂,多了气路、气阀、气滤;整车得有气源(空压机),成本高。
  • 控制要点:需要协调尿素泵压力和空气压力。我见过一个项目,空气压力波动大,导致喷射量忽大忽小,NOx转化效率直接掉到60%。后来加了压力补偿算法才搞定。

4.1.2 非气助式尿素泵

非气助式,也叫“无气式”。它自己把尿素加压到更高(通常5-9 bar),然后通过特殊喷嘴直接喷出。靠高压本身实现雾化。现在乘用车和轻型柴油车用得越来越多。

  • 优点:结构简单,没有气路,成本低;体积小,好布置。
  • 缺点:对尿素品质敏感,容易堵喷嘴;低温下尿素结晶风险更高。
  • 控制要点:压力控制精度要求高。我调试过一个项目,压力波动超过±0.3 bar,喷射量偏差就超5%,OBD(车载诊断系统)直接报故障。

我的建议:选型时别只看成本。如果整车气源充足(比如卡车),气助式更可靠。如果是乘用车或小型非道路机械,非气助式更合适。我个人习惯在项目初期就定好类型,不然后面改管路设计,那叫一个痛苦。

4.2 PWM驱动原理

尿素泵电机怎么控制?绝大多数方案都用PWM(脉宽调制)。你想想看,电机转速需要连续可调,总不能一直全速转吧?PWM就是通过调节占空比,改变电机两端的有效电压,从而控制转速。

4.2.1 基本驱动电路

TC3xx的GTM模块或者CCU6模块都可以产生PWM。驱动电路一般用半桥或H桥,配合续流二极管。我贴一段典型的初始化代码,用的是GTM的TOM通道:

/* GTM TOM 配置示例 - 用于尿素泵PWM驱动 */
/* 假设系统时钟100MHz,目标PWM频率20kHz */
/* 预分频:100MHz / 2 = 50MHz */
/* 周期寄存器值:50MHz / 20kHz = 2500 */

IfxGtm_Tom_Pwm_Config tomConfig;
IfxGtm_Tom_Pwm_Driver tomDriver;

/* 初始化配置 */
IfxGtm_Tom_Pwm_initConfig(&tomConfig, &MODULE_GTM);
tomConfig.tom = IfxGtm_Tom_0;              /* 使用TOM0模块 */
tomConfig.tomChannel = IfxGtm_Tom_Ch_0;    /* 通道0 */
tomConfig.period = 2500;                   /* 周期值 */
tomConfig.pin.outputPin = &IfxGtm_TOM0_0_P00_0_OUT; /* 输出引脚 */
tomConfig.syncUpdateEnabled = TRUE;        /* 同步更新,防止毛刺 */
tomConfig.immediateOutputEnabled = FALSE;  /* 非立即输出,等待同步 */

/* 初始化驱动 */
IfxGtm_Tom_Pwm_init(&tomDriver, &tomConfig);

/* 设置占空比50% */
IfxGtm_Tom_Pwm_setCompare(&tomDriver, 1250);

避坑指南:我曾经在设置PWM频率时踩过坑。频率太低(比如低于100Hz),电机会抖动,噪音大,压力波动也大。频率太高(超过50kHz),MOS管开关损耗剧增,发热严重。我一般选10kHz-20kHz,兼顾效率和噪音。

4.2.2 占空比与电机转速的关系

占空比越大,电机转速越高,泵出口压力也越高。但注意,不是线性关系。因为电机有死区电压——占空比太低时,电机根本转不起来。我实测过,某款泵在占空比低于15%时,电机纹丝不动。所以控制时,要设一个最小占空比阈值。

占空比(%) 电机转速(rpm) 泵出口压力(bar) 备注
0-15 0 0 死区,电机不转
20 1200 1.2 刚启动,压力低
40 2800 3.5 常用工作点
60 4200 6.0 接近额定压力
80 5200 8.2 满负荷,注意电流

4.3 泵压力闭环调节

开环控制行不行?理论上可以,但实际不行。为什么?因为尿素泵的出口压力受温度、尿素浓度、管路阻力、泵磨损等多种因素影响。开环给一个固定占空比,压力可能飘得没边。所以必须用闭环调节

4.3.1 控制架构

典型的压力闭环是PID控制器。目标压力由上层(比如SCR需求扭矩模型)给出,实际压力由压力传感器反馈。PID输出就是PWM的占空比。

  • P(比例):快速响应偏差。但P太大,压力会震荡。我调过一个项目,P设到0.8,压力在目标值上下±0.5 bar来回跳,吓死人。
  • I(积分):消除稳态误差。但I太大,响应变慢,而且容易积分饱和。启动时尤其要注意——泵还没转,积分项已经堆了一大堆,一启动就超调。
  • D(微分):抑制超调,提高动态响应。但D对噪声敏感,压力信号如果滤波不好,D项会乱跳。

注意:压力传感器信号一定要做低通滤波。我见过一个案例,传感器噪声大,D项输出剧烈波动,导致PWM占空比也跟着抖,电机嗡嗡响,压力根本稳不住。后来加了50Hz的IIR滤波,问题解决。

4.3.2 抗积分饱和策略

积分饱和是PID控制里的常见问题。比如泵刚启动时,实际压力远低于目标,积分项会一直累加。等压力上来后,积分项已经很大了,导致严重超调。我的做法是:

  1. 限制积分项输出范围:比如积分项最大不超过总输出的30%。
  2. 条件积分:只有当实际压力在目标值附近(比如±1 bar内)时,才允许积分累加。偏差太大时,冻结积分项。
  3. 积分清零:每次泵停止后,把积分项清零,避免下次启动时残留。

下面是我在TC3xx上实现的一个简化版抗积分饱和PID,供参考:

/* 抗积分饱和PID - 用于尿素泵压力控制 */
typedef struct {
    float Kp;           /* 比例系数 */
    float Ki;           /* 积分系数 */
    float Kd;           /* 微分系数 */
    float integral;     /* 积分累加值 */
    float prevError;    /* 上一次偏差 */
    float integralMax;  /* 积分上限 */
    float outputMax;    /* 输出上限 */
} PID_Type;

float PID_Update(PID_Type *pid, float target, float actual) {
    float error = target - actual;
    float derivative;
    float output;

    /* 条件积分:偏差小于1 bar时才积分 */
    if (fabs(error) < 1.0f) {
        pid->integral += pid->Ki * error;
        /* 限制积分项 */
        if (pid->integral > pid->integralMax) pid->integral = pid->integralMax;
        if (pid->integral < -pid->integralMax) pid->integral = -pid->integralMax;
    }

    /* 微分项 */
    derivative = pid->Kd * (error - pid->prevError);
    pid->prevError = error;

    /* 计算输出 */
    output = pid->Kp * error + pid->integral + derivative;

    /* 限制总输出 */
    if (output > pid->outputMax) output = pid->outputMax;
    if (output < 0.0f) output = 0.0f;  /* 占空比不能为负 */

    return output;
}

4.3.3 压力闭环的调试经验

调试压力闭环,我有个习惯:先调P,再调I,最后调D。具体步骤:

  1. 先把I和D设成0,只加P。从小到大增加P,直到压力开始震荡,然后退回一半。
  2. 加入I,从0开始慢慢加,观察稳态误差是否消除。注意不要加太快,防止积分饱和。
  3. 最后加D,用来抑制超调。D的系数通常很小,我一般从0.01开始试。

我的经验:尿素泵压力闭环的响应速度不需要太快。因为SCR系统本身是一个大惯性系统,排气管温度、NOx浓度变化都很慢。压力调节的带宽有1-2 Hz就足够了。调得太快反而容易引入噪声,得不偿失。

好了,这一章就到这里。尿素泵控制说难不难,说简单也不简单。关键是理解泵的特性,选对控制策略,再配合扎实的调试。下一章我们聊尿素喷射量的精确计量,那又是另一个有意思的话题。