3、静态死区设置方法:基于阈值的死区配置、查表法实现死区、寄存器配置实例

好,咱们接着聊死区设置。上一章讲了死区的基本概念,这一章我直接上干货——静态死区到底怎么配?

说白了,静态死区就是固定不变的死区值。你设好它,它就老老实实待在那儿,不会因为系统状态变化而改变。这在很多工业现场里其实够用了,尤其是那些工况相对稳定的场合。

3.1 基于阈值的死区配置

这是最直观的方法。你设定一个阈值,误差信号小于这个阈值,控制器就不响应。

我个人的习惯是,先把阈值设得稍微大一点,然后慢慢往下压。为什么?因为一开始你并不知道系统的噪声底噪有多大。设小了,执行器会频繁动作,磨损快;设大了,系统响应又太迟钝。

举个例子,一个温度控制系统,设定值是100°C。你设死区阈值为±1°C。那么实际温度在99°C到101°C之间时,控制器就当没看见,不输出任何调节动作。

核心公式:
if |e(t)| < Deadband_Threshold:
  Output = 0
else:
  Output = e(t)

嗯,这里要注意:阈值不能设成0。设成0就等于没有死区,系统会一直抖。我在项目中遇到过有人把死区设成0,结果阀门每秒钟都在微调,最后执行器电机烧了。

3.2 查表法实现死区

阈值法虽然简单,但不够灵活。有时候你需要不同的死区值——比如在零点附近死区大一点,远离零点时死区小一点。这时候查表法就派上用场了。

查表法说白了就是预先算好一张表,把输入和输出对应关系存进去。运行时直接查表,省去实时计算的开销。

我曾经在一个电机控制项目里用过查表法。电机在低速时抖动厉害,需要大死区;高速时抖动小,可以设小死区。我建了一张表,把转速分成10个区间,每个区间对应一个死区值。

// 查表法死区配置示例
// 输入:转速 (rpm)
// 输出:死区值 (mV)

const uint16_t speed_table[] = {0, 100, 200, 500, 1000, 2000, 5000};
const uint16_t deadband_table[] = {50, 40, 30, 20, 15, 10, 5};

uint16_t get_deadband(uint16_t speed) {
    for (int i = 0; i < 6; i++) {
        if (speed < speed_table[i+1]) {
            return deadband_table[i];
        }
    }
    return deadband_table[6]; // 最高速时的死区
}

你想想看,这样做的好处是什么?灵活。你想改哪个区间的死区,改表里的数值就行,不用动逻辑代码。调试的时候特别方便。

小技巧: 查表法的表项不要太多,8-16项就够用了。太多反而浪费内存,而且查表速度会变慢。

3.3 寄存器配置实例

好了,理论说完了,咱们看看实际芯片里怎么配。我以TI的TMS320F28335 DSP为例,它的ePWM模块里有专门的死区寄存器。

这个芯片的死区配置寄存器叫DBCTL(Dead-Band Control Register)。你需要设置三个东西:

  • 死区模式:选择是上升沿延时、下降沿延时,还是两者都延时
  • 死区极性:选择输出是高有效还是低有效
  • 死区时间:以系统时钟周期为单位,设置延时长度
// TMS320F28335 ePWM死区配置实例
// 系统时钟 150MHz,死区时间 1us

EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3;  // 上升沿和下降沿都延时
EPwm1Regs.DBCTL.bit.POLSEL = 0x0;    // 极性不反转
EPwm1Regs.DBRED = 150;               // 上升沿延时 150个时钟周期 = 1us
EPwm1Regs.DBFED = 150;               // 下降沿延时 150个时钟周期 = 1us

这里有个坑,我踩过。DBRED和DBFED这两个寄存器是10位的,最大值是1023。如果你系统时钟是150MHz,最大死区时间就是1023/150MHz ≈ 6.8us。别设超了,否则寄存器会溢出,死区时间反而变成0。

避坑指南: 我曾经在调试一个变频器项目时,死区时间设了2000个时钟周期,结果寄存器溢出,上下管直接导通,炸了一个IGBT模块。从那以后,我每次配死区都会先算一下最大值。

再补充一个实际项目中常用的配置表,方便你快速参考:

系统时钟频率 目标死区时间 寄存器值 适用场景
100 MHz 0.5 μs 50 小功率MOSFET
150 MHz 1.0 μs 150 通用IGBT
200 MHz 2.0 μs 400 大功率IGBT
100 MHz 3.0 μs 300 SiC MOSFET

嗯,这张表是我自己总结的,不同厂家的芯片寄存器结构可能不一样,但思路是通用的。你拿到一个新芯片,第一件事就是看它的死区寄存器位宽和时钟频率,算出最大可设死区时间。

最后说一句,静态死区虽然简单,但它是所有高级死区控制的基础。你把静态死区玩明白了,后面学动态调整就轻松多了。

静态死区设置方法知识体系 基于阈值的死区配置 查表法实现死区 寄存器配置实例 设定阈值 → 判断误差 → 输出控制 优点:实现简单,计算量小 缺点:不够灵活,无法分段 预建表格 → 查表映射 → 输出死区 优点:灵活可调,分段控制 缺点:占用内存,查表有延迟 DBCTL → DBRED → DBFED 注意:寄存器位宽限制 计算最大死区时间 静态死区是动态调整的基础,务必熟练掌握

公众号:蓝海资料掘金营,微信deep3321