第三章 执行器驱动电路:直流无刷风机驱动、电子膨胀阀步进电机驱动、四通换向阀继电器驱动、PWM调速原理

各位同学,咱们今天聊点硬核的——执行器驱动电路。说实话,暖通空调系统里那些风机、阀门、换向阀,说白了就是靠这些电路才能“动起来”。我做了十几年嵌入式硬件,踩过的坑比你们见过的电路板还多。今天就把这些经验掰开揉碎了讲给你们听。

3.1 直流无刷风机驱动

先说说直流无刷风机。这玩意儿在空调里太常见了,室内机、室外机都在用。为什么不用有刷电机?你想想看,有刷电机那碳刷磨着磨着就没了,维护起来多麻烦。无刷电机没有这个烦恼,寿命长、效率高、噪音还低。

驱动无刷电机,核心就是控制三相绕组的通电顺序。我习惯用六步换向法,说白了就是六个步骤,每个步骤让两相绕组通电,产生旋转磁场。具体怎么实现?看代码:

// 六步换向表
const uint8_t commutation_table[6] = {
    0b001001, // U+ V- W悬空
    0b001100, // U+ V悬空 W-
    0b010100, // U悬空 V+ W-
    0b011000, // U- V+ W悬空
    0b010001, // U- V悬空 W+
    0b001001  // U悬空 V- W+
};

void motor_step(uint8_t step) {
    // 根据霍尔传感器位置选择换向步骤
    uint8_t pattern = commutation_table[step];
    // 写入PWM寄存器
    PWM1_LOAD(pattern & 0x3F);
}

我在项目中遇到过一个问题:电机启动时抖动得厉害。查了半天,发现是启动时的换向频率不对。后来我加了个开环启动策略——先给一个固定频率的方波,等电机转起来再切到闭环控制。嗯,这个坑你们以后可能会遇到。

小提示:无刷电机启动时,建议先给一个占空比30%左右的PWM信号,频率从低到高慢慢升。这样能避免启动电流过大,也能减少抖动。

3.2 电子膨胀阀步进电机驱动

电子膨胀阀用的是步进电机。步进电机的好处是精确——你给它一个脉冲,它就转一个角度。空调系统里调节制冷剂流量,靠的就是这个。

驱动步进电机,我常用的是两相四拍或者两相八拍。四拍就是A、B、A反、B反这样轮流通电。八拍呢,中间加了半步,精度更高。你们看这个表格:

拍数 A相 B相 A反 B反
1 1 0 0 0
2 1 1 0 0
3 0 1 1 0
4 0 0 1 1

我曾经在一个项目里,电子膨胀阀老是卡死。拆开一看,步进电机驱动芯片过热了。为什么?因为驱动电流设得太大了。后来我把电流从1.5A降到0.8A,问题就解决了。记住,步进电机不是电流越大越好,够用就行。

警告:步进电机驱动芯片的散热一定要做好。我见过有人把驱动芯片直接贴在PCB上,结果跑一会儿就冒烟了。加个散热片,或者用铜皮铺地散热,这是基本操作。

3.3 四通换向阀继电器驱动

四通换向阀,说白了就是控制制冷和制热切换的。它里面有个电磁铁,通电就吸合,改变制冷剂流向。驱动它很简单,一个继电器就够了。

但简单归简单,坑也不少。继电器线圈是感性负载,断电时会产生反向电动势。这个电压能到几百伏,如果不加保护,分分钟烧掉你的MCU。我习惯在继电器线圈两端并联一个续流二极管,阴极接电源正极,阳极接线圈另一端。这样反向电动势就被二极管钳位了。

// 继电器驱动代码
void relay_control(uint8_t state) {
    if (state) {
        GPIO_SetBits(RELAY_PORT, RELAY_PIN); // 吸合
    } else {
        GPIO_ResetBits(RELAY_PORT, RELAY_PIN); // 断开
    }
    // 注意:断开后要加一个延时,防止继电器触点抖动
    delay_ms(10);
}

我记得有一次,客户反映空调制热时偶尔会突然变成制冷。查了半天,发现是继电器触点粘连了。为什么?因为切换太频繁,触点拉弧了。后来我在软件里加了切换间隔——至少等3秒才能再次切换。嗯,这个问题就再也没出现过。

重点:继电器驱动电路,续流二极管是必须的。另外,继电器线圈的驱动电流要足够,一般用三极管或MOS管来驱动,别直接用MCU引脚去推。

3.4 PWM调速原理

PWM调速,说白了就是通过改变方波的占空比来控制电机转速。占空比越高,平均电压越高,电机转得越快。这个原理很简单,但实际应用时有很多细节。

PWM的频率怎么选?我一般用1kHz到20kHz之间。频率太低,电机会发出“嗡嗡”声,听着难受。频率太高,MOS管的开关损耗会变大。我习惯用16kHz,人耳听不到,效率也还行。

占空比的分辨率也很重要。8位分辨率就是0-255,16位就是0-65535。我建议用10位以上,这样调速更平滑。你们看这个代码:

// PWM初始化
void pwm_init(void) {
    // 设置PWM频率为16kHz
    TIM_TimeBaseInitTypeDef tim;
    tim.TIM_Prescaler = 72 - 1;  // 72MHz / 72 = 1MHz
    tim.TIM_Period = 62;         // 1MHz / 62 ≈ 16kHz
    TIM_TimeBaseInit(TIM2, &tim);
    
    // 设置PWM模式
    TIM_OCInitTypeDef oc;
    oc.TIM_OCMode = TIM_OCMode_PWM1;
    oc.TIM_Pulse = 0;            // 初始占空比为0
    TIM_OC1Init(TIM2, &oc);
    
    // 使能PWM输出
    TIM_Cmd(TIM2, ENABLE);
}

// 设置占空比
void pwm_set_duty(uint16_t duty) {
    if (duty > 62) duty = 62;    // 限制最大值
    TIM_SetCompare1(TIM2, duty);
}

我在项目中遇到过一个问题:PWM调速时电机转速不稳定。查了半天,发现是PWM频率和电机的机械谐振频率重合了。后来我把频率调到18kHz,问题就解决了。所以,选PWM频率时,最好避开电机的谐振点。

小技巧:如果你用PWM驱动风机,建议加一个软启动。就是占空比从0慢慢升到目标值,这样能减少启动电流,也能保护电机。我一般用100ms的时间来升到目标占空比。

好了,这一章的内容就这些。直流无刷风机、电子膨胀阀、四通换向阀、PWM调速,每个都是暖通空调系统里的关键执行器。你们在实际项目中,一定要多注意驱动电路的细节——续流二极管、散热、频率选择、软启动,这些看似不起眼的东西,往往就是问题的根源。

下一章我们聊聊传感器电路,温度、湿度、压力、流量,这些信号怎么采集、怎么处理。到时候见。