第四章 GPIO与PWM控制:射频开关与功率调节

各位同学,欢迎来到第四章。这一章我们聊聊GPIO和PWM——说白了,就是怎么用单片机的小信号去控制射频大功率。我在做第一款美容仪的时候,就吃过这方面的亏,后面慢慢跟大家细说。

4.1 GPIO驱动射频开关:小信号控制大功率

射频开关,通常是一个MOSFET或者专用的射频开关芯片。它的控制引脚,一般只需要一个GPIO电平。但这里有个坑——射频开关的驱动电流,往往比普通LED大得多。

⚠️ 注意: 直接拿GPIO去推射频开关,大概率会烧引脚。我当年第一次画板子,就因为这个原因,烧了三个STM32的IO口。

正确的做法是加一级驱动。我个人习惯用NPN三极管或者专用的MOSFET驱动器。电路很简单:

// 伪代码:GPIO控制射频开关
void RF_Switch_Control(uint8_t state) {
    if (state) {
        HAL_GPIO_WritePin(RF_SW_GPIO_Port, RF_SW_Pin, GPIO_PIN_SET);
        // 这里会经过三极管放大,驱动射频开关导通
    } else {
        HAL_GPIO_WritePin(RF_SW_GPIO_Port, RF_SW_Pin, GPIO_PIN_RESET);
    }
}

你想想看,射频开关的导通和关断,直接影响美容仪的输出功率。如果开关切换不够快,或者驱动电流不够,开关就会处于半导通状态——那发热量,啧啧,我见过一个样品直接冒烟了。

4.2 PWM生成与频率调节:射频能量的节奏

PWM,脉冲宽度调制。在美容仪里,PWM的频率决定了射频能量的输出节奏。频率太低,皮肤会感觉到明显的脉冲感;频率太高,MOSFET的开关损耗会急剧上升。

我一般把PWM频率定在100kHz到500kHz之间。为什么是这个范围?

  • 低于100kHz:人耳能听到开关噪声,用户体验差
  • 高于500kHz:MOSFET的开关损耗太大,发热严重
  • 100-500kHz:平衡了噪声、效率和温升

生成PWM的方式有两种:硬件定时器输出,或者软件模拟。我个人强烈建议用硬件定时器。为什么?因为软件模拟PWM会占用CPU,你想想看,CPU忙着翻转IO口,就没空处理其他任务了。

// 硬件定时器配置PWM(以STM32为例)
void PWM_Init(void) {
    TIM_HandleTypeDef htim2;
    TIM_OC_InitTypeDef sConfigOC = {0};
    
    htim2.Instance = TIM2;
    htim2.Init.Prescaler = 72 - 1;      // 72MHz / 72 = 1MHz
    htim2.Init.Period = 10 - 1;          // 1MHz / 10 = 100kHz
    htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
    HAL_TIM_PWM_Init(&htim2);
    
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 5;                 // 占空比50%
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1);
    
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}

嗯,这里要注意:预分频器和自动重装载值的计算,直接决定了PWM的频率。我习惯先算好频率,再调占空比。

4.3 占空比控制功率输出:精细调节的艺术

占空比,说白了就是高电平时间占整个周期的比例。在美容仪里,占空比直接控制射频功率的输出大小。

占空比 输出功率 适用场景
10% - 30% 低功率 敏感肌肤、眼部护理
40% - 60% 中功率 日常护理、面部提升
70% - 90% 高功率 深层紧致、专业模式

我曾经遇到过一个问题:占空比调到90%以上时,射频功率反而下降了。排查了半天,发现是MOSFET的驱动电压不够,导致开关没有完全导通。所以,占空比不是越高越好,还要考虑驱动电路的极限。

💡 小技巧: 实际项目中,我一般把占空比上限设在85%左右,留出余量。这样既保证了最大功率输出,又不会让MOSFET进入线性区。

4.4 硬件定时器配置:精准控制的核心

硬件定时器,是PWM生成的基石。配置定时器,其实就是配置三个参数:预分频器、自动重装载值、比较值。

公式很简单:

PWM频率 = 定时器时钟 / (预分频器 + 1) / (自动重装载值 + 1)
占空比 = 比较值 / (自动重装载值 + 1) * 100%

举个例子,如果定时器时钟是72MHz,我想要100kHz的PWM:

  1. 先选预分频器为71(72分频),得到1MHz的计数频率
  2. 再选自动重装载值为9(10个计数周期),得到100kHz
  3. 比较值设为5,占空比就是50%

我建议在配置定时器时,把预分频器设得大一些,这样自动重装载值可以更精细地调节频率。但也不能太大,否则PWM的精度会下降。

// 动态调节占空比
void PWM_SetDuty(uint8_t duty_percent) {
    uint16_t compare_value;
    compare_value = (duty_percent * (TIM2->ARR + 1)) / 100;
    __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, compare_value);
}

嗯,这里有个坑:动态调节占空比时,一定要确保比较值不超过自动重装载值。我曾经在代码里写了个bug,占空比调到110%,结果PWM输出直接乱掉了。

4.5 实战经验总结

做美容仪射频控制,我总结了几条铁律:

  • GPIO驱动射频开关:一定要加驱动级,别直接推
  • PWM频率:100-500kHz,别太低也别太高
  • 占空比控制:上限留余量,别超过85%
  • 定时器配置:先算频率,再调占空比,顺序别搞反

最后说一句:调试的时候,先用示波器看PWM波形,确认频率和占空比都对,再接到射频开关上。我见过有人直接接负载,结果波形不对,把射频模块烧了。嗯,那就是另一个故事了。

下一章,我们聊聊ADC采样与反馈控制——怎么让美容仪自动调节功率,适应不同肤质。到时候见。