CSDN 风格博客草稿合集



说明:以下内容是公开技术学习笔记草稿,适合提前发布。建议每篇单独发布,标题尽量包含 STM32F103、CubeIDE、无线充电、ADC DMA、TIM1、补偿电容等关键词,方便比赛时站内搜索。

---

# 文章 1:STM32F103 无线充电控制入门:PWM、ADC DMA 与保护状态机

## 标题

STM32F103 无线充电控制入门:TIM PWM、ADC DMA 与过流保护状态机

## 标签

STM32F103、CubeIDE、PWM、ADC DMA、无线充电、过流保护、状态机

## 摘要

本文整理一个基于 STM32F103 的小功率无线充电控制框架,包括 TIM PWM 输出、ADC DMA 多通道采样、UART 调试打印、软启动、运行状态和故障保护状态机。适合做无线充电发射端、感应供电、线圈驱动和功率电子入门实验时参考。

## 正文

无线充电发射端的 MCU 本身不直接传输能量,而是负责控制功率级。常见结构是 STM32 输出 PWM,经 MOSFET 驱动芯片控制半桥或全桥,在线圈上产生高频交变电流。

系统同时采集输入电压、输入电流、输出电压、温度或 Hall 信号,用于闭环控制和保护。

基本结构如下:

```text
STM32F103
  ├─ TIM PWM -> MOSFET Driver -> Half Bridge / Full Bridge -> TX Coil
  ├─ ADC DMA <- Vin / Iin / Vout / Temp / Hall
  ├─ UART -> Debug Print
  └─ GPIO -> Enable / Fault LED / Protection

1. 为什么要用状态机

功率系统不建议把所有判断都堆在 while 循环里。推荐用状态机:

typedef enum {
    SYS_IDLE = 0,
    SYS_SOFT_START,
    SYS_RUN,
    SYS_FAULT
} system_state_t;

状态说明:

SYS_IDLE        空闲,PWM 关闭
SYS_SOFT_START 软启动,占空比逐步提高
SYS_RUN         正常工作,采样、保护、闭环控制
SYS_FAULT       故障状态,PWM 关闭

2. ADC DMA 采样结构

#define ADC_CH_COUNT 4

uint16_t adc_dma_buf[ADC_CH_COUNT];

typedef struct {
    float vin;
    float iin;
    float vout;
    float temp;
} measure_t;

measure_t meas;

ADC 原始值转电压:

static float adc_to_voltage(uint16_t raw)
{
    return (float)raw * 3.3f / 4095.0f;
}

电阻分压换算:

static float divider_to_real_voltage(float adc_v, float r_upper, float r_lower)
{
    return adc_v * (r_upper + r_lower) / r_lower;
}

Hall 电流换算:

static float hall_to_current(float adc_v, float zero_v, float sensitivity_v_per_a)
{
    return (adc_v - zero_v) / sensitivity_v_per_a;
}

3. 一阶低通滤波

功率电路噪声较大,ADC 数据通常会抖动,可以做简单滤波:

static float lowpass(float old_value, float new_value, float alpha)
{
    return old_value + alpha * (new_value - old_value);
}

采样更新示例:

void measure_update(void)
{
    float vin_adc = adc_to_voltage(adc_dma_buf[0]);
    float iin_adc = adc_to_voltage(adc_dma_buf[1]);
    float vout_adc = adc_to_voltage(adc_dma_buf[2]);
    float temp_adc = adc_to_voltage(adc_dma_buf[3]);

    float vin_new = divider_to_real_voltage(vin_adc, 100000.0f, 10000.0f);
    float iin_new = hall_to_current(iin_adc, 1.65f, 0.100f);
    float vout_new = divider_to_real_voltage(vout_adc, 100000.0f, 10000.0f);
    float temp_new = temp_adc * 100.0f;

    meas.vin = lowpass(meas.vin, vin_new, 0.1f);
    meas.iin = lowpass(meas.iin, iin_new, 0.2f);
    meas.vout = lowpass(meas.vout, vout_new, 0.1f);
    meas.temp = lowpass(meas.temp, temp_new, 0.1f);
}

4. PWM 控制

void pwm_start(void)
{
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
}

void pwm_stop(void)
{
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
}

void pwm_set_duty(uint16_t duty)
{
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty);
}

如果使用 TIM1 互补 PWM:

void pwm_complementary_start(void)
{
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
}

void pwm_complementary_stop(void)
{
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
    HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1);
}

5. 保护逻辑

#define VIN_MIN_V   8.0f
#define VIN_MAX_V   15.0f
#define IIN_MAX_A   2.0f
#define VOUT_MAX_V  8.0f
#define TEMP_MAX_C  70.0f

uint8_t protection_has_fault(void)
{
    if (meas.vin < VIN_MIN_V) return 1;
    if (meas.vin > VIN_MAX_V) return 1;
    if (meas.iin > IIN_MAX_A) return 1;
    if (meas.vout > VOUT_MAX_V) return 1;
    if (meas.temp > TEMP_MAX_C) return 1;

    return 0;
}

6. 主状态机

system_state_t sys_state = SYS_IDLE;
uint16_t pwm_duty = 50;

void app_loop_1ms(void)
{
    measure_update();

    switch (sys_state) {
    case SYS_IDLE:
        pwm_stop();
        pwm_duty = 50;
        if (meas.vin > VIN_MIN_V && meas.vin < VIN_MAX_V) {
            pwm_start();
            sys_state = SYS_SOFT_START;
        }
        break;

    case SYS_SOFT_START:
        if (protection_has_fault()) {
            pwm_stop();
            sys_state = SYS_FAULT;
            break;
        }

        pwm_set_duty(pwm_duty);
        pwm_duty += 2;

        if (pwm_duty >= 300) {
            sys_state = SYS_RUN;
        }
        break;

    case SYS_RUN:
        if (protection_has_fault()) {
            pwm_stop();
            sys_state = SYS_FAULT;
            break;
        }

        /* control_update(); */
        break;

    case SYS_FAULT:
        pwm_stop();
        break;

    default:
        sys_state = SYS_FAULT;
        break;
    }
}

7. 调试建议

  1. 先让 LED 闪烁,确认程序运行。
  2. 再让 UART 打印,方便看变量。
  3. 单独测 PWM 输出,不接功率电路。
  4. 接驱动芯片,确认高低边无直通。
  5. 低压限流接线圈。
  6. 最后接接收端和电子负载。

文章 2:无线充电线圈谐振与补偿电容计算

标题

无线充电线圈谐振与补偿电容计算:LC 公式、Q 值和调试方法

标签

无线充电、LC谐振、补偿电容、线圈、磁耦合、效率测试

摘要

无线充电系统中,线圈和补偿电容决定了工作频率、输出能力和效率。本文整理 LC 谐振频率、补偿电容计算、线圈 Q 值、耦合偏移和现场调试方法。

正文

无线充电发射线圈和接收线圈通常工作在某个交流频率附近。为了提高能量传输效率,会在线圈上加入补偿电容,使线圈电感 L 和电容 C 在目标频率附近谐振。

1. LC 谐振公式

f0 = 1 / (2*pi*sqrt(L*C))

已知 L 和目标频率 f0,可以反推补偿电容:

C = 1 / ((2*pi*f0)^2 * L)

例如:

线圈电感 L = 10 uH
目标频率 f0 = 100 kHz

C = 1 / ((2*pi*100000)^2 * 10e-6)
C ≈ 253 nF

实际可以用:

220 nF + 33 nF 并联

接近 253 nF。

2. Q 值

Q 值可粗略理解为线圈谐振系统的“损耗程度”。

Q = omega*L / R
omega = 2*pi*f

Q 值高,通常说明损耗小,但也意味着频率带宽更窄,对偏移和参数变化更敏感。

比赛现场不能只追求 Q 高,还要看:

  • 线圈偏移后输出是否稳定。
  • MOSFET 是否发热。
  • 接收端整流是否稳定。
  • 效率是否真的提高。

3. 串联补偿与并联补偿

串联补偿:

电容与线圈串联
谐振时等效阻抗较低
线圈电流可能较大

并联补偿:

电容与线圈并联
谐振时等效阻抗较高
更像电压型谐振

实际系统里可能发射端、接收端都做补偿,即双边补偿。

4. 中继线圈影响

加入中继线圈后,系统不再是简单的两个线圈耦合。中继线圈会改变系统等效阻抗和谐振点。

调试时要分别测试:

无中继
中继居中
中继偏移
中继距离变化
不同负载
不同频率

不要只看空载电压。无线充电系统经常出现“空载电压很高,带载马上掉”的现象。

5. 推荐调试流程

  1. 用 LCR 表测线圈电感和直流电阻。
  2. 根据目标频率计算补偿电容。
  3. 焊接电容前先确认耐压。
  4. 用限流电源上电。
  5. 从小占空比或低电压开始。
  6. 用示波器看线圈波形。
  7. 接接收端,测整流输出。
  8. 接电子负载,逐步增加电流。
  9. 记录输入功率、输出功率和温升。

6. 效率计算

Pin = Vin * Iin
Pout = Vout * Iout
eta = Pout / Pin

建议记录:

频率
占空比
线圈距离
线圈偏移
输入电压
输入电流
输出电压
输出电流
MOS 温度
线圈温度

文章 3:半桥逆变驱动无线充电线圈的调试记录

标题

半桥逆变驱动无线充电线圈:MOSFET 发热、死区和波形调试

标签

半桥逆变、MOSFET、无线充电、死区、STM32 PWM、栅极驱动

摘要

小功率无线充电发射端常用半桥或全桥驱动线圈。本文总结半桥驱动线圈时的上电顺序、死区设置、MOSFET 发热原因和示波器波形检查点。

正文

半桥由高边 MOSFET 和低边 MOSFET 组成。STM32 输出 PWM 后,一般还需要专用 MOSFET 驱动芯片才能可靠驱动半桥。

半桥最危险的问题是上下管同时导通,也就是直通。

1. 首次调试顺序

1. MCU 单独运行,测 PWM
2. 接驱动芯片,不接功率电源
3. 低压限流接功率级,不接线圈
4. 接发射线圈,从小占空比开始
5. 接接收端
6. 接电子负载

2. MOSFET 发热原因

常见原因:

  • 没有死区或死区太小。
  • 驱动电压不足,MOSFET 没有充分导通。
  • PWM 频率太高,开关损耗过大。
  • 门极电阻不合适。
  • 线圈或补偿电容参数错误,导致电流过大。
  • PCB 大电流回路过长。
  • 整流端或负载异常导致反射阻抗变化。

3. 示波器检查点

建议预留测试点:

MCU PWM 输出
驱动芯片输入
驱动芯片输出
MOSFET Vgs
半桥开关节点
发射线圈两端
电流采样信号
接收端整流输出

测高边 MOSFET Vgs 时要注意示波器接地方式,避免短路。

4. 死区

互补 PWM 中,高低边切换时必须加入死区。

搜索关键词:

STM32F103 TIM1 complementary PWM dead time
STM32F103 TIM1 互补 PWM 死区
STM32 HAL TIMEx PWMN Start

5. 保护建议

如果硬件允许,过流比较器输出可以接到 TIM1 的 BKIN 刹车输入。这样出现过流时,定时器硬件可以立即关闭 PWM,比软件轮询更快。


文章 4:STM32F103 ADC DMA 多通道采样:电压、电流、Hall 和温度检测

标题

STM32F103 ADC DMA 多通道采样:电压、电流、Hall 和温度检测

标签

STM32F103、ADC、DMA、Hall、电流检测、CubeIDE、滤波

摘要

功率电子系统常需要采集电压、电流、温度和 Hall 信号。本文记录 STM32F103 使用 ADC DMA 多通道采样的基本思路,以及采样换算、滤波和校准方法。

正文

STM32F103 的 ADC 可用于读取:

  • 输入电压分压。
  • 输出电压分压。
  • Hall 电流传感器输出。
  • NTC 温度信号。
  • 电流采样放大器输出。

为了减少 CPU 占用,可以使用 DMA 循环采样。

1. ADC DMA 缓冲区

#define ADC_CH_COUNT 4
uint16_t adc_dma_buf[ADC_CH_COUNT];

启动:

HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_dma_buf, ADC_CH_COUNT);

2. ADC 转电压

float adc_to_voltage(uint16_t raw)
{
    return (float)raw * 3.3f / 4095.0f;
}

3. 电阻分压换算

float divider_to_real_voltage(float adc_v, float r_upper, float r_lower)
{
    return adc_v * (r_upper + r_lower) / r_lower;
}

4. Hall 电流换算

float hall_to_current(float adc_v, float zero_v, float sensitivity_v_per_a)
{
    return (adc_v - zero_v) / sensitivity_v_per_a;
}

例如:

零点电压 zero_v = 1.65 V
灵敏度 sensitivity = 0.100 V/A
ADC 测得电压 adc_v = 1.85 V

current = (1.85 - 1.65) / 0.100 = 2 A

5. 滤波

float lowpass(float old_value, float new_value, float alpha)
{
    return old_value + alpha * (new_value - old_value);
}

alpha 越大,响应越快,但噪声越明显;alpha 越小,输出越平滑,但响应越慢。

6. 注意事项

  • ADC 输入不能超过 3.3V。
  • 分压电阻不宜过大。
  • ADC 采样时间要足够。
  • 功率电路噪声大时需要 RC 滤波。
  • DMA 通道顺序要和软件数组对应。
  • Hall 零点需要校准。
  • 模拟地和功率地处理不好会导致采样乱跳。

文章 5:无线充电系统现场调试:无输出、效率低、MOS 管发热怎么排查

标题

无线充电系统现场调试:无输出、效率低、MOS 管发热怎么排查

标签

无线充电、调试、效率、MOSFET发热、线圈、STM32

摘要

无线充电系统由电源、功率驱动、线圈、整流、负载和 MCU 控制组成。现场出现无输出、输出低、发热和 ADC 异常时,需要按能量路径逐级排查。

正文

无线充电系统调试的原则是:

从输入到输出
从低压到高压
从开环到闭环
从单模块到整机
每次只改一个变量

1. 无输出

检查顺序:

  1. 输入电源是否正常。
  2. STM32 是否运行。
  3. PWM 是否输出。
  4. MOS 驱动是否有波形。
  5. 发射线圈是否有交流电压或电流。
  6. 接收线圈是否有感应交流电压。
  7. 整流后是否有直流电压。
  8. 负载是否短路或过重。

2. 输出电压低

可能原因:

  • 发射和接收线圈没有对准。
  • 距离过大。
  • 补偿电容不匹配。
  • 工作频率偏离谐振点。
  • 线圈电阻过大。
  • 整流二极管压降过大。
  • 负载过重。

3. MOS 管发热

优先检查:

  • 死区时间。
  • 栅极驱动电压。
  • Vgs 波形。
  • 半桥开关节点。
  • 线圈电流。
  • 开关频率。
  • PCB 大电流回路。

4. 空载电压高,带载马上掉

这是无线充电调试中很常见的问题。

可能原因:

  • 耦合太弱。
  • 接收线圈没有谐振。
  • 发射端频率不合适。
  • 补偿电容参数错误。
  • 线圈电阻太大。
  • 负载电流超过系统能力。

5. ADC 数据乱跳

检查:

  • 分压电阻比例。
  • ADC 输入是否超过 3.3V。
  • 采样时间是否太短。
  • ADC 前端有没有 RC 滤波。
  • 模拟地是否被功率电流污染。
  • DMA 通道顺序是否弄错。

6. 建议记录表

时间:
线圈编号:
补偿电容:
PWM 频率:
占空比:
输入电压:
输入电流:
输出电压:
输出电流:
效率:
距离:
偏移:
MOS 温度:
线圈温度:
现象:
下一步:

7. 总结

无线充电不是只靠软件,也不是只靠硬件。真正有效的调试方法是:

准备测试点
限流上电
逐级排查
记录数据
每次只改一个参数


Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐