面向3相无感BLDC电机控制程序

一、系统架构设计

1.1 整体架构

┌─────────────────────────────────────────┐
│          应用层 (Application)            │
├─────────────────────────────────────────┤
│        控制算法层 (Control Logic)       │
│  ┌────────┬─────────┬──────────┐       │
│  │速度环  │ 电流环  │ 位置估算 │       │
│  └────────┴─────────┴──────────┘       │
├─────────────────────────────────────────┤
│        换向控制层 (Commutation)         │
│  ┌──────────────────────────────┐       │
│  │ 六步换向 │ FOC控制 │ 过零检测│       │
│  └──────────────────────────────┘       │
├─────────────────────────────────────────┤
│        驱动层 (Driver)                  │
│  ┌────────┬────────┬──────────┐        │
│  │ PWM   │ ADC    │ 比较器   │        │
│  └────────┴────────┴──────────┘        │
├─────────────────────────────────────────┤
│        硬件层 (Hardware)                │
│  ┌────────┬────────┬──────────┐        │
│  │MOSFET │ 电流   │ 电源     │        │
│  │驱动   │ 采样   │ 管理     │        │
│  └────────┴────────┴──────────┘        │
└─────────────────────────────────────────┘

1.2 特性支持

  • 无位置传感器控制
  • 六步换向 (Trapezoidal)
  • 磁场定向控制 (FOC)
  • 软启动/软停止
  • 过流/过压保护
  • 堵转检测
  • 转速/转矩控制
  • 能量回收

二、硬件定义

2.1 引脚定义

// bldc_hw.h
#ifndef __BLDC_HW_H
#define __BLDC_HW_H

#include <stdint.h>
#include <stdbool.h>

// MCU平台定义
#ifdef STM32F1
    #include "stm32f1xx_hal.h"
#elif STM32F4
    #include "stm32f4xx_hal.h"
#elif ESP32
    #include "driver/mcpwm.h"
    #include "driver/gpio.h"
#endif

// 电机参数
typedef struct {
    uint16_t pole_pairs;          // 极对数
    float    phase_resistance;    // 相电阻 (Ω)
    float    phase_inductance;    // 相电感 (H)
    float    kv_rating;           // KV值 (RPM/V)
    float    max_current;         // 最大电流 (A)
    float    max_voltage;         // 最大电压 (V)
} Motor_Params;

// PWM引脚定义
typedef struct {
    // 高侧MOSFET PWM引脚
    uint16_t uh_pin;     // U相高侧
    uint16_t vh_pin;     // V相高侧
    uint16_t wh_pin;     // W相高侧
    
    // 低侧MOSFET使能引脚
    uint16_t ul_pin;     // U相低侧
    uint16_t vl_pin;     // V相低侧
    uint16_t wl_pin;     // W相低侧
} PWM_Pins;

// ADC通道定义
typedef struct {
    uint16_t phase_u_adc;    // U相电流采样
    uint16_t phase_v_adc;    // V相电流采样
    uint16_t phase_w_adc;    // W相电流采样
    uint16_t bus_voltage;    // 母线电压
    uint16_t temp_adc;       // 温度检测
} ADC_Channels;

// 比较器引脚
typedef struct {
    uint16_t comp_u_pin;     // U相反电动势比较
    uint16_t comp_v_pin;     // V相反电动势比较
    uint16_t comp_w_pin;     // W相反电动势比较
} Comparator_Pins;

// 保护阈值
typedef struct {
    float overcurrent_threshold;    // 过流阈值 (A)
    float undervoltage_threshold;   // 欠压阈值 (V)
    float overvoltage_threshold;    // 过压阈值 (V)
    float overtemperature_threshold; // 过温阈值 (°C)
    uint16_t stall_timeout_ms;      // 堵转超时 (ms)
} Protection_Thresholds;

// 硬件配置结构
typedef struct {
    PWM_Pins pwm_pins;
    ADC_Channels adc_channels;
    Comparator_Pins comp_pins;
    Motor_Params motor_params;
    Protection_Thresholds protection;
    
    // PWM频率
    uint32_t pwm_frequency_hz;
    
    // ADC分辨率
    uint16_t adc_resolution;
    float adc_reference_voltage;
    
    // 电流采样参数
    float current_scale;        // 电流采样系数 (A/V)
    float shunt_resistance;     // 采样电阻 (Ω)
} BLDC_HW_Config;

#endif

三、核心控制算法

3.1 无感BLDC控制主程序

// bldc_core.h
#ifndef __BLDC_CORE_H
#define __BLDC_CORE_H

#include "bldc_hw.h"

// 控制模式
typedef enum {
    CONTROL_MODE_SPEED = 0,     // 速度控制
    CONTROL_MODE_TORQUE = 1,    // 转矩控制
    CONTROL_MODE_OPEN_LOOP = 2, // 开环控制
    CONTROL_MODE_STOP = 3       // 停止
} Control_Mode;

// 运行状态
typedef enum {
    STATE_INIT = 0,             // 初始化
    STATE_ALIGN = 1,            // 定位
    STATE_OPENLOOP_START = 2,   // 开环启动
    STATE_CLOSEDLOOP = 3,       // 闭环运行
    STATE_STOP = 4,             // 停止
    STATE_FAULT = 5             // 故障
} Motor_State;

// 换相状态
typedef enum {
    COMM_STATE_0 = 0,  // A+ B- C off
    COMM_STATE_1 = 1,  // A+ B off C-
    COMM_STATE_2 = 2,  // A off B+ C-
    COMM_STATE_3 = 3,  // A- B+ C off
    COMM_STATE_4 = 4,  // A- B off C+
    COMM_STATE_5 = 5,  // A off B- C+
    COMM_STATE_COAST = 6  // 所有关断
} Commutation_State;

// PI控制器结构
typedef struct {
    float kp;           // 比例系数
    float ki;           // 积分系数
    float integral;     // 积分项
    float integral_max; // 积分限幅
    float output_max;   // 输出限幅
    float output_min;   // 输出下限
    float error;        // 当前误差
    float output;       // 当前输出
} PI_Controller;

// 电机控制结构
typedef struct {
    // 控制模式
    Control_Mode control_mode;
    Motor_State state;
    
    // 目标值
    float target_speed_rpm;     // 目标转速 (RPM)
    float target_torque_nm;     // 目标转矩 (N·m)
    float target_current_a;     // 目标电流 (A)
    
    // 实际值
    float actual_speed_rpm;     // 实际转速
    float actual_speed_radps;   // 实际角速度 (rad/s)
    float electrical_angle;     // 电角度 (rad)
    float mechanical_angle;     // 机械角度 (rad)
    float phase_current_u;      // U相电流
    float phase_current_v;      // V相电流
    float phase_current_w;      // W相电流
    float bus_voltage;          // 母线电压
    float temperature;          // 温度
    
    // 控制器
    PI_Controller speed_pi;     // 速度环PI
    PI_Controller current_pi;   // 电流环PI
    
    // 换向参数
    Commutation_State comm_state;
    uint32_t commutation_period_us;  // 换相周期
    uint32_t last_commutation_time;  // 上次换相时间
    uint8_t  sector;            // 扇区 (0-5)
    
    // PWM占空比
    float pwm_duty_u;
    float pwm_duty_v;
    float pwm_duty_w;
    
    // 保护参数
    uint32_t overcurrent_count;
    uint32_t stall_start_time;
    bool fault_overcurrent;
    bool fault_undervoltage;
    bool fault_overtemperature;
    bool fault_stall;
    
    // 启动参数
    uint8_t start_stage;
    uint32_t start_timer;
    float openloop_speed;
    float openloop_angle;
    float align_current;
} BLDC_Controller;

// 函数声明
void BLDC_Init(BLDC_Controller* ctrl, const BLDC_HW_Config* hw_config);
void BLDC_Start(BLDC_Controller* ctrl);
void BLDC_Stop(BLDC_Controller* ctrl);
void BLDC_SetSpeed(BLDC_Controller* ctrl, float rpm);
void BLDC_SetTorque(BLDC_Controller* ctrl, float torque);
void BLDC_ControlLoop(BLDC_Controller* ctrl);
void BLDC_FaultHandler(BLDC_Controller* ctrl, uint8_t fault_code);
float BLDC_EstimateSpeed(BLDC_Controller* ctrl);
float BLDC_EstimateAngle(BLDC_Controller* ctrl);
void BLDC_ProtectionCheck(BLDC_Controller* ctrl);

#endif

3.2 核心控制实现

// bldc_core.c
#include "bldc_core.h"
#include "math.h"
#include <string.h>

// 全局变量
static BLDC_HW_Config hw_config;
static uint32_t system_tick = 0;

// PI控制器更新
static float PI_Update(PI_Controller* pi, float setpoint, float feedback, float dt) {
    pi->error = setpoint - feedback;
    
    // 积分项
    pi->integral += pi->error * pi->ki * dt;
    
    // 积分限幅
    if (pi->integral > pi->integral_max) {
        pi->integral = pi->integral_max;
    } else if (pi->integral < -pi->integral_max) {
        pi->integral = -pi->integral_max;
    }
    
    // 计算输出
    pi->output = pi->error * pi->kp + pi->integral;
    
    // 输出限幅
    if (pi->output > pi->output_max) {
        pi->output = pi->output_max;
    } else if (pi->output < pi->output_min) {
        pi->output = pi->output_min;
    }
    
    return pi->output;
}

// 初始化BLDC控制器
void BLDC_Init(BLDC_Controller* ctrl, const BLDC_HW_Config* config) {
    if (!ctrl || !config) return;
    
    // 复制硬件配置
    memcpy(&hw_config, config, sizeof(BLDC_HW_Config));
    
    // 初始化控制器
    memset(ctrl, 0, sizeof(BLDC_Controller));
    
    ctrl->control_mode = CONTROL_MODE_SPEED;
    ctrl->state = STATE_INIT;
    ctrl->comm_state = COMM_STATE_COAST;
    
    // 初始化PI控制器参数
    // 速度环PI
    ctrl->speed_pi.kp = 0.1f;
    ctrl->speed_pi.ki = 0.01f;
    ctrl->speed_pi.integral_max = 100.0f;
    ctrl->speed_pi.output_max = 1.0f;  // 最大占空比
    ctrl->speed_pi.output_min = 0.0f;
    
    // 电流环PI
    ctrl->current_pi.kp = 0.5f;
    ctrl->current_pi.ki = 0.1f;
    ctrl->current_pi.integral_max = 5.0f;
    ctrl->current_pi.output_max = 1.0f;
    ctrl->current_pi.output_min = 0.0f;
    
    // 初始化PWM
    PWM_Init(config->pwm_frequency_hz);
    
    // 初始化ADC
    ADC_Init();
    
    // 初始化比较器
    Comparator_Init();
    
    // 初始化GPIO
    GPIO_Init();
}

// 启动电机
void BLDC_Start(BLDC_Controller* ctrl) {
    if (ctrl->state == STATE_STOP || ctrl->state == STATE_INIT) {
        ctrl->state = STATE_ALIGN;
        ctrl->start_stage = 0;
        ctrl->start_timer = system_tick;
        ctrl->openloop_speed = 0;
        ctrl->openloop_angle = 0;
        
        printf("Motor starting...\n");
    }
}

// 停止电机
void BLDC_Stop(BLDC_Controller* ctrl) {
    ctrl->state = STATE_STOP;
    ctrl->control_mode = CONTROL_MODE_STOP;
    
    // 关闭所有PWM输出
    PWM_SetDuty(0, 0, 0);
    PWM_Disable();
    
    // 复位控制器
    ctrl->speed_pi.integral = 0;
    ctrl->current_pi.integral = 0;
    
    printf("Motor stopped.\n");
}

// 设置目标转速
void BLDC_SetSpeed(BLDC_Controller* ctrl, float rpm) {
    if (ctrl->control_mode != CONTROL_MODE_SPEED) {
        ctrl->control_mode = CONTROL_MODE_SPEED;
    }
    
    // 速度限幅
    float max_rpm = hw_config.motor_params.kv_rating * hw_config.motor_params.max_voltage;
    if (rpm > max_rpm) rpm = max_rpm;
    if (rpm < -max_rpm) rpm = -max_rpm;
    
    ctrl->target_speed_rpm = rpm;
}

// 设置目标转矩
void BLDC_SetTorque(BLDC_Controller* ctrl, float torque) {
    if (ctrl->control_mode != CONTROL_MODE_TORQUE) {
        ctrl->control_mode = CONTROL_MODE_TORQUE;
    }
    
    // 转矩限幅
    float max_torque = hw_config.motor_params.max_current * 1.5f; // 简单估算
    if (torque > max_torque) torque = max_torque;
    if (torque < -max_torque) torque = -max_torque;
    
    ctrl->target_torque_nm = torque;
}

// 主控制循环 (1kHz执行)
void BLDC_ControlLoop(BLDC_Controller* ctrl) {
    static uint32_t last_control_time = 0;
    uint32_t current_time = system_tick;
    float dt = (current_time - last_control_time) / 1000.0f;  // 转换为秒
    
    if (dt < 0.001f) return;  // 至少1ms执行一次
    
    // 保护检查
    BLDC_ProtectionCheck(ctrl);
    if (ctrl->state == STATE_FAULT) {
        return;
    }
    
    // 状态机处理
    switch (ctrl->state) {
        case STATE_ALIGN:
            State_Align(ctrl, dt);
            break;
            
        case STATE_OPENLOOP_START:
            State_OpenLoopStart(ctrl, dt);
            break;
            
        case STATE_CLOSEDLOOP:
            State_ClosedLoop(ctrl, dt);
            break;
            
        case STATE_STOP:
            // 停止状态,关闭PWM
            PWM_SetDuty(0, 0, 0);
            break;
            
        default:
            break;
    }
    
    last_control_time = current_time;
}

// 定位状态
static void State_Align(BLDC_Controller* ctrl, float dt) {
    static float align_angle = 0;
    const uint32_t align_time_ms = 1000;  // 定位1秒
    
    if (ctrl->start_stage == 0) {
        // 第一阶段:强制定位到0度
        ctrl->openloop_angle = 0;
        align_angle = 0;
        
        // 施加定位电流
        ctrl->align_current = hw_config.motor_params.max_current * 0.3f;
        ctrl->start_timer = system_tick;
        ctrl->start_stage = 1;
        
        printf("Stage 1: Aligning rotor...\n");
    }
    
    if (ctrl->start_stage == 1) {
        // 保持定位
        if (system_tick - ctrl->start_timer >= align_time_ms) {
            ctrl->start_stage = 2;
            ctrl->start_timer = system_tick;
            printf("Stage 2: Starting open loop...\n");
        }
        
        // 输出固定位置的PWM
        BLDC_OpenLoopControl(ctrl, align_angle, ctrl->align_current);
    }
    
    if (ctrl->start_stage == 2) {
        // 进入开环启动
        ctrl->state = STATE_OPENLOOP_START;
        ctrl->openloop_speed = 10.0f;  // 初始速度 10 RPM
        ctrl->start_stage = 0;
    }
}

// 开环启动状态
static void State_OpenLoopStart(BLDC_Controller* ctrl, float dt) {
    const float accel_rate = 50.0f;  // 50 RPM/s
    const float min_speed_for_closedloop = 100.0f;  // 100 RPM
    
    // 加速
    ctrl->openloop_speed += accel_rate * dt;
    
    // 更新开环角度
    ctrl->openloop_angle += (ctrl->openloop_speed * 2 * M_PI / 60.0f) * dt;
    if (ctrl->openloop_angle >= 2 * M_PI) {
        ctrl->openloop_angle -= 2 * M_PI;
    }
    
    // 控制电流
    float target_current = 0.5f;  // 固定启动电流
    BLDC_OpenLoopControl(ctrl, ctrl->openloop_angle, target_current);
    
    // 尝试检测反电动势
    if (ctrl->openloop_speed >= min_speed_for_closedloop) {
        // 检查反电动势是否有效
        if (BLDC_CheckBEMFValid(ctrl)) {
            ctrl->state = STATE_CLOSEDLOOP;
            printf("Switching to closed loop control.\n");
        }
    }
    
    // 超时保护
    if (ctrl->openloop_speed > 500.0f) {  // 如果达到500RPM仍未切闭环
        ctrl->state = STATE_FAULT;
        ctrl->fault_stall = true;
        printf("Startup timeout!\n");
    }
}

// 闭环控制状态
static void State_ClosedLoop(BLDC_Controller* ctrl, float dt) {
    // 估算速度和位置
    ctrl->actual_speed_rpm = BLDC_EstimateSpeed(ctrl);
    ctrl->electrical_angle = BLDC_EstimateAngle(ctrl);
    
    // 根据控制模式计算目标电流
    float target_current = 0;
    
    switch (ctrl->control_mode) {
        case CONTROL_MODE_SPEED: {
            // 速度环PI控制
            float speed_radps = ctrl->target_speed_rpm * 2 * M_PI / 60.0f;
            float actual_speed_radps = ctrl->actual_speed_rpm * 2 * M_PI / 60.0f;
            target_current = PI_Update(&ctrl->speed_pi, speed_radps, actual_speed_radps, dt);
            break;
        }
            
        case CONTROL_MODE_TORQUE: {
            // 转矩控制(简化为电流控制)
            // 假设转矩常数 Kt = 60 / (2π * KV)
            float kt = 60.0f / (2 * M_PI * hw_config.motor_params.kv_rating);
            target_current = ctrl->target_torque_nm / kt;
            break;
        }
            
        case CONTROL_MODE_OPEN_LOOP:
            // 开环控制
            target_current = ctrl->target_current_a;
            break;
            
        default:
            break;
    }
    
    // 电流限幅
    if (target_current > hw_config.motor_params.max_current) {
        target_current = hw_config.motor_params.max_current;
    } else if (target_current < -hw_config.motor_params.max_current) {
        target_current = -hw_config.motor_params.max_current;
    }
    
    // 执行电流控制
    BLDC_CurrentControl(ctrl, target_current, dt);
}

// 开环控制
static void BLDC_OpenLoopControl(BLDC_Controller* ctrl, float angle, float current) {
    // 生成三相PWM占空比
    float u = current * sinf(angle);
    float v = current * sinf(angle + 2 * M_PI / 3);
    float w = current * sinf(angle + 4 * M_PI / 3);
    
    // 设置PWM占空比
    ctrl->pwm_duty_u = (u + 1.0f) / 2.0f;
    ctrl->pwm_duty_v = (v + 1.0f) / 2.0f;
    ctrl->pwm_duty_w = (w + 1.0f) / 2.0f;
    
    // 更新PWM输出
    PWM_SetDuty(ctrl->pwm_duty_u, ctrl->pwm_duty_v, ctrl->pwm_duty_w);
}

// 电流闭环控制
static void BLDC_CurrentControl(BLDC_Controller* ctrl, float target_current, float dt) {
    // 读取相电流
    ctrl->phase_current_u = ADC_GetCurrentU();
    ctrl->phase_current_v = ADC_GetCurrentV();
    
    // 计算第三相电流(基尔霍夫定律)
    ctrl->phase_current_w = -(ctrl->phase_current_u + ctrl->phase_current_v);
    
    // 获取当前电角度
    float angle = ctrl->electrical_angle;
    
    // Clarke变换
    float i_alpha = ctrl->phase_current_u;
    float i_beta = (ctrl->phase_current_u + 2 * ctrl->phase_current_v) / sqrtf(3.0f);
    
    // Park变换
    float id = i_alpha * cosf(angle) + i_beta * sinf(angle);
    float iq = -i_alpha * sinf(angle) + i_beta * cosf(angle);
    
    // 电流环PI控制 (只控制q轴)
    float vq = PI_Update(&ctrl->current_pi, target_current, iq, dt);
    float vd = 0;  // d轴电压设为0(最大转矩控制)
    
    // 反Park变换
    float valpha = vd * cosf(angle) - vq * sinf(angle);
    float vbeta = vd * sinf(angle) + vq * cosf(angle);
    
    // 反Clarke变换
    float vu = valpha;
    float vv = -0.5f * valpha + 0.8660254f * vbeta;  // √3/2
    float vw = -0.5f * valpha - 0.8660254f * vbeta;
    
    // 计算占空比
    ctrl->pwm_duty_u = 0.5f + vu / (2.0f * ctrl->bus_voltage);
    ctrl->pwm_duty_v = 0.5f + vv / (2.0f * ctrl->bus_voltage);
    ctrl->pwm_duty_w = 0.5f + vw / (2.0f * ctrl->bus_voltage);
    
    // 限制占空比
    ctrl->pwm_duty_u = fminf(fmaxf(ctrl->pwm_duty_u, 0.0f), 1.0f);
    ctrl->pwm_duty_v = fminf(fmaxf(ctrl->pwm_duty_v, 0.0f), 1.0f);
    ctrl->pwm_duty_w = fminf(fmaxf(ctrl->pwm_duty_w, 0.0f), 1.0f);
    
    // 更新PWM输出
    PWM_SetDuty(ctrl->pwm_duty_u, ctrl->pwm_duty_v, ctrl->pwm_duty_w);
}

// 保护检查
void BLDC_ProtectionCheck(BLDC_Controller* ctrl) {
    // 过流保护
    float max_current = fmaxf(fabsf(ctrl->phase_current_u), 
                             fmaxf(fabsf(ctrl->phase_current_v), 
                                   fabsf(ctrl->phase_current_w)));
    
    if (max_current > hw_config.protection.overcurrent_threshold) {
        ctrl->overcurrent_count++;
        if (ctrl->overcurrent_count > 5) {  // 连续5次过流
            ctrl->fault_overcurrent = true;
            ctrl->state = STATE_FAULT;
        }
    } else {
        ctrl->overcurrent_count = 0;
    }
    
    // 欠压保护
    if (ctrl->bus_voltage < hw_config.protection.undervoltage_threshold) {
        ctrl->fault_undervoltage = true;
        ctrl->state = STATE_FAULT;
    }
    
    // 过压保护
    if (ctrl->bus_voltage > hw_config.protection.overvoltage_threshold) {
        ctrl->state = STATE_FAULT;
    }
    
    // 过温保护
    if (ctrl->temperature > hw_config.protection.overtemperature_threshold) {
        ctrl->fault_overtemperature = true;
        ctrl->state = STATE_FAULT;
    }
    
    // 堵转检测
    if (ctrl->state == STATE_CLOSEDLOOP) {
        float speed_threshold = 10.0f;  // 10 RPM
        if (fabsf(ctrl->actual_speed_rpm) < speed_threshold) {
            if (ctrl->stall_start_time == 0) {
                ctrl->stall_start_time = system_tick;
            } else if (system_tick - ctrl->stall_start_time > hw_config.protection.stall_timeout_ms) {
                ctrl->fault_stall = true;
                ctrl->state = STATE_FAULT;
            }
        } else {
            ctrl->stall_start_time = 0;
        }
    }
    
    // 故障处理
    if (ctrl->state == STATE_FAULT) {
        BLDC_FaultHandler(ctrl, 0);
    }
}

四、位置和速度估算

4.1 反电动势过零检测

// bemf_sensor.h
#ifndef __BEMF_SENSOR_H
#define __BEMF_SENSOR_H

#include "bldc_core.h"

// 反电动势状态
typedef struct {
    float bemf_u;          // U相反电动势
    float bemf_v;          // V相反电动势
    float bemf_w;          // W相反电动势
    
    float bemf_u_filtered; // 滤波后U相反电动势
    float bemf_v_filtered; // 滤波后V相反电动势
    float bemf_w_filtered; // 滤波后W相反电动势
    
    uint8_t zc_u;          // U相过零点检测
    uint8_t zc_v;          // V相过零点检测
    uint8_t zc_w;          // W相过零点检测
    
    uint32_t zc_time;      // 过零点时间
    uint32_t zc_period;    // 过零点周期
    
    float bemf_amplitude;  // 反电动势幅值
    float bemf_frequency;  // 反电动势频率
} BEMF_Sensor;

// 函数声明
void BEMF_Init(BEMF_Sensor* sensor);
void BEMF_Update(BEMF_Sensor* sensor, BLDC_Controller* ctrl);
float BEMF_EstimateSpeed(BEMF_Sensor* sensor);
float BEMF_EstimateAngle(BEMF_Sensor* sensor);
uint8_t BEMF_GetSector(BEMF_Sensor* sensor);
bool BEMF_CheckValid(BEMF_Sensor* sensor);

#endif
// bemf_sensor.c
#include "bemf_sensor.h"
#include "math.h"

#define BEMF_FILTER_COEFF 0.1f
#define ZC_THRESHOLD 0.1f  // 过零阈值

static BEMF_Sensor bemf_sensor;

void BEMF_Init(BEMF_Sensor* sensor) {
    memset(sensor, 0, sizeof(BEMF_Sensor));
}

void BEMF_Update(BEMF_Sensor* sensor, BLDC_Controller* ctrl) {
    // 读取比较器状态
    uint8_t comp_u = Comparator_GetState(hw_config.comp_pins.comp_u_pin);
    uint8_t comp_v = Comparator_GetState(hw_config.comp_pins.comp_v_pin);
    uint8_t comp_w = Comparator_GetState(hw_config.comp_pins.comp_w_pin);
    
    // 获取当前换相状态
    Commutation_State comm_state = ctrl->comm_state;
    
    // 根据换相状态选择检测的反电动势
    switch (comm_state) {
        case COMM_STATE_0:  // A+B-: 检测C相
            sensor->bemf_w = GetPhaseVoltage(C_PHASE) - GetNeutralVoltage();
            break;
        case COMM_STATE_1:  // A+C-: 检测B相
            sensor->bemf_v = GetPhaseVoltage(B_PHASE) - GetNeutralVoltage();
            break;
        case COMM_STATE_2:  // B+C-: 检测A相
            sensor->bemf_u = GetPhaseVoltage(A_PHASE) - GetNeutralVoltage();
            break;
        case COMM_STATE_3:  // B+A-: 检测C相
            sensor->bemf_w = GetPhaseVoltage(C_PHASE) - GetNeutralVoltage();
            break;
        case COMM_STATE_4:  // C+A-: 检测B相
            sensor->bemf_v = GetPhaseVoltage(B_PHASE) - GetNeutralVoltage();
            break;
        case COMM_STATE_5:  // C+B-: 检测A相
            sensor->bemf_u = GetPhaseVoltage(A_PHASE) - GetNeutralVoltage();
            break;
        default:
            break;
    }
    
    // 低通滤波
    sensor->bemf_u_filtered = sensor->bemf_u_filtered * (1 - BEMF_FILTER_COEFF) + 
                               sensor->bemf_u * BEMF_FILTER_COEFF;
    sensor->bemf_v_filtered = sensor->bemf_v_filtered * (1 - BEMF_FILTER_COEFF) + 
                               sensor->bemf_v * BEMF_FILTER_COEFF;
    sensor->bemf_w_filtered = sensor->bemf_w_filtered * (1 - BEMF_FILTER_COEFF) + 
                               sensor->bemf_w * BEMF_FILTER_COEFF;
    
    // 检测过零点
    static float prev_u = 0, prev_v = 0, prev_w = 0;
    
    // U相过零检测
    if ((prev_u > 0 && sensor->bemf_u_filtered <= 0) || 
        (prev_u < 0 && sensor->bemf_u_filtered >= 0)) {
        if (fabsf(sensor->bemf_u_filtered) < ZC_THRESHOLD) {
            sensor->zc_u = 1;
            sensor->zc_time = system_tick;
            
            // 计算频率
            static uint32_t last_zc_time = 0;
            if (last_zc_time > 0) {
                sensor->zc_period = sensor->zc_time - last_zc_time;
                sensor->bemf_frequency = 1000000.0f / sensor->zc_period;  // Hz
            }
            last_zc_time = sensor->zc_time;
        }
    } else {
        sensor->zc_u = 0;
    }
    prev_u = sensor->bemf_u_filtered;
    
    // 同样处理V相和W相...
}

float BEMF_EstimateSpeed(BEMF_Sensor* sensor) {
    if (sensor->zc_period == 0) return 0;
    
    // 电频率 = 1 / 过零周期
    float electrical_freq_hz = 1000000.0f / sensor->zc_period;
    
    // 机械转速 = 电频率 * 60 / 极对数
    float speed_rpm = electrical_freq_hz * 60.0f / hw_config.motor_params.pole_pairs;
    
    return speed_rpm;
}

float BEMF_EstimateAngle(BEMF_Sensor* sensor) {
    if (sensor->zc_period == 0) return 0;
    
    // 计算从上次过零点到现在的时间
    uint32_t time_since_zc = system_tick - sensor->zc_time;
    
    // 计算电角度
    float angle = 2 * M_PI * time_since_zc / sensor->zc_period;
    
    // 限制在0-2π之间
    if (angle > 2 * M_PI) {
        angle -= 2 * M_PI;
    }
    
    return angle;
}

uint8_t BEMF_GetSector(BEMF_Sensor* sensor) {
    // 根据反电动势极性判断扇区
    if (sensor->bemf_u_filtered > 0 && sensor->bemf_v_filtered < 0 && sensor->bemf_w_filtered < 0) {
        return 0;  // 扇区1
    } else if (sensor->bemf_u_filtering > 0 && sensor->bemf_v_filtered > 0 && sensor->bemf_w_filtered < 0) {
        return 1;  // 扇区2
    } else if (sensor->bemf_u_filtered < 0 && sensor->bemf_v_filtered > 0 && sensor->bemf_w_filtered < 0) {
        return 2;  // 扇区3
    } else if (sensor->bemf_u_filtered < 0 && sensor->bemf_v_filtered > 0 && sensor->bemf_w_filtered > 0) {
        return 3;  // 扇区4
    } else if (sensor->bemf_u_filtered < 0 && sensor->bemf_v_filtered < 0 && sensor->bemf_w_filtered > 0) {
        return 4;  // 扇区5
    } else if (sensor->bemf_u_filtered > 0 && sensor->bemf_v_filtered < 0 && sensor->bemf_w_filtered > 0) {
        return 5;  // 扇区6
    }
    
    return 0;
}

bool BEMF_CheckValid(BEMF_Sensor* sensor) {
    // 检查反电动势是否有效
    if (sensor->zc_period == 0) return false;
    
    // 检查频率是否在合理范围内
    float freq = 1000000.0f / sensor->zc_period;
    if (freq < 1.0f || freq > 1000.0f) {  // 1Hz - 1kHz
        return false;
    }
    
    // 检查幅值
    float amplitude = fmaxf(fabsf(sensor->bemf_u_filtered), 
                           fmaxf(fabsf(sensor->bemf_v_filtered), 
                                 fabsf(sensor->bemf_w_filtered)));
    
    if (amplitude < 0.1f) {  // 最小幅值
        return false;
    }
    
    return true;
}

五、六步换向控制

5.1 换向控制器

// six_step_commutation.h
#ifndef __SIX_STEP_COMMUTATION_H
#define __SIX_STEP_COMMUTATION_H

#include "bldc_core.h"

// 六步换向表
typedef struct {
    Commutation_State state;
    uint8_t uh_enable;  // U相高侧
    uint8_t vh_enable;  // V相高侧
    uint8_t wh_enable;  // W相高侧
    uint8_t ul_enable;  // U相低侧
    uint8_t vl_enable;  // V相低侧
    uint8_t wl_enable;  // W相低侧
} Commutation_Table;

// 换向控制器
typedef struct {
    Commutation_State current_state;
    Commutation_State next_state;
    uint8_t sector;
    uint32_t commutation_time;
    uint32_t phase_advance_us;  // 相位超前补偿
    float duty_cycle;
} SixStep_Controller;

// 函数声明
void SixStep_Init(SixStep_Controller* ctrl);
void SixStep_SetState(SixStep_Controller* ctrl, Commutation_State state, float duty);
void SixStep_NextState(SixStep_Controller* ctrl, uint8_t direction);
void SixStep_ApplyPWM(SixStep_Controller* ctrl);
Commutation_State SixStep_GetStateFromSector(uint8_t sector, uint8_t direction);
void SixStep_UpdateFromBEMF(SixStep_Controller* ctrl, BEMF_Sensor* bemf, uint8_t direction);

#endif
// six_step_commutation.c
#include "six_step_commutation.h"

// 六步换向表(顺时针方向)
static const Commutation_Table comm_table_cw[6] = {
    // 状态  UH  UL  VH  VL  WH  WL
    {COMM_STATE_0, 1, 0, 0, 1, 0, 0},  // A+B-
    {COMM_STATE_1, 1, 0, 0, 0, 0, 1},  // A+C-
    {COMM_STATE_2, 0, 0, 1, 0, 0, 1},  // B+C-
    {COMM_STATE_3, 0, 1, 1, 0, 0, 0},  // B+A-
    {COMM_STATE_4, 0, 1, 0, 0, 1, 0},  // C+A-
    {COMM_STATE_5, 0, 0, 0, 1, 1, 0}   // C+B-
};

// 六步换向表(逆时针方向)
static const Commutation_Table comm_table_ccw[6] = {
    {COMM_STATE_5, 0, 0, 0, 1, 1, 0},  // C+B-
    {COMM_STATE_4, 0, 1, 0, 0, 1, 0},  // C+A-
    {COMM_STATE_3, 0, 1, 1, 0, 0, 0},  // B+A-
    {COMM_STATE_2, 0, 0, 1, 0, 0, 1},  // B+C-
    {COMM_STATE_1, 1, 0, 0, 0, 0, 1},  // A+C-
    {COMM_STATE_0, 1, 0, 0, 1, 0, 0}   // A+B-
};

void SixStep_Init(SixStep_Controller* ctrl) {
    ctrl->current_state = COMM_STATE_0;
    ctrl->next_state = COMM_STATE_1;
    ctrl->sector = 0;
    ctrl->commutation_time = 0;
    ctrl->phase_advance_us = 0;
    ctrl->duty_cycle = 0;
}

void SixStep_SetState(SixStep_Controller* ctrl, Commutation_State state, float duty) {
    ctrl->current_state = state;
    ctrl->duty_cycle = duty;
    
    // 获取换向表
    const Commutation_Table* table = &comm_table_cw[state];
    
    // 设置PWM输出
    if (table->uh_enable) {
        PWM_SetDutyU(duty);
        GPIO_SetHigh(hw_config.pwm_pins.uh_pin);
    } else {
        PWM_SetDutyU(0);
        GPIO_SetLow(hw_config.pwm_pins.uh_pin);
    }
    
    if (table->ul_enable) {
        GPIO_SetHigh(hw_config.pwm_pins.ul_pin);
    } else {
        GPIO_SetLow(hw_config.pwm_pins.ul_pin);
    }
    
    if (table->vh_enable) {
        PWM_SetDutyV(duty);
        GPIO_SetHigh(hw_config.pwm_pins.vh_pin);
    } else {
        PWM_SetDutyV(0);
        GPIO_SetLow(hw_config.pwm_pins.vh_pin);
    }
    
    if (table->vl_enable) {
        GPIO_SetHigh(hw_config.pwm_pins.vl_pin);
    } else {
        GPIO_SetLow(hw_config.pwm_pins.vl_pin);
    }
    
    if (table->wh_enable) {
        PWM_SetDutyW(duty);
        GPIO_SetHigh(hw_config.pwm_pins.wh_pin);
    } else {
        PWM_SetDutyW(0);
        GPIO_SetLow(hw_config.pwm_pins.wh_pin);
    }
    
    if (table->wl_enable) {
        GPIO_SetHigh(hw_config.pwm_pins.wl_pin);
    } else {
        GPIO_SetLow(hw_config.pwm_pins.wl_pin);
    }
    
    ctrl->commutation_time = system_tick;
}

void SixStep_NextState(SixStep_Controller* ctrl, uint8_t direction) {
    // 计算下一个状态
    Commutation_State next_state = (ctrl->current_state + 1) % 6;
    
    if (direction == 0) {  // 顺时针
        SixStep_SetState(ctrl, next_state, ctrl->duty_cycle);
    } else {  // 逆时针
        next_state = (ctrl->current_state - 1 + 6) % 6;
        SixStep_SetState(ctrl, next_state, ctrl->duty_cycle);
    }
}

void SixStep_ApplyPWM(SixStep_Controller* ctrl) {
    SixStep_SetState(ctrl, ctrl->current_state, ctrl->duty_cycle);
}

Commutation_State SixStep_GetStateFromSector(uint8_t sector, uint8_t direction) {
    if (direction == 0) {  // 顺时针
        return (Commutation_State)sector;
    } else {  // 逆时针
        return (Commutation_State)((6 - sector) % 6);
    }
}

void SixStep_UpdateFromBEMF(SixStep_Controller* ctrl, BEMF_Sensor* bemf, uint8_t direction) {
    // 从BEMF获取扇区
    uint8_t new_sector = BEMF_GetSector(bemf);
    
    if (new_sector != ctrl->sector) {
        ctrl->sector = new_sector;
        
        // 获取对应的换向状态
        Commutation_State new_state = SixStep_GetStateFromSector(new_sector, direction);
        
        // 计算换向时间
        uint32_t comm_period = bemf->zc_period * 3;  // 每个扇区60度
        uint32_t elapsed_time = system_tick - ctrl->commutation_time;
        
        // 计算相位超前
        uint32_t advance_time = ctrl->phase_advance_us;
        
        // 如果时间到了,执行换向
        if (elapsed_time >= (comm_period / 6 - advance_time)) {
            SixStep_SetState(ctrl, new_state, ctrl->duty_cycle);
        }
    }
}

参考代码 面向3相无感BLDC控制控制程序 www.youwenfan.com/contentcnv/103317.html

六、PWM驱动实现

6.1 PWM驱动器

// pwm_driver.h
#ifndef __PWM_DRIVER_H
#define __PWM_DRIVER_H

#include "bldc_hw.h"

// PWM驱动结构
typedef struct {
    uint32_t frequency_hz;
    uint16_t resolution;
    float deadtime_ns;      // 死区时间
    uint8_t polarity;       // PWM极性
    float max_duty;         // 最大占空比
    float min_duty;         // 最小占空比
} PWM_Config;

// PWM驱动器
typedef struct {
    PWM_Config config;
    float duty_u;
    float duty_v;
    float duty_w;
    uint8_t enabled;
} PWM_Driver;

// 函数声明
void PWM_InitDriver(PWM_Driver* driver, uint32_t freq_hz);
void PWM_SetFrequency(PWM_Driver* driver, uint32_t freq_hz);
void PWM_SetDeadtime(PWM_Driver* driver, float deadtime_ns);
void PWM_SetDuty(PWM_Driver* driver, float u, float v, float w);
void PWM_Enable(PWM_Driver* driver);
void PWM_Disable(PWM_Driver* driver);
void PWM_SetOutputs(uint8_t uh, uint8_t vh, uint8_t wh, 
                   uint8_t ul, uint8_t vl, uint8_t wl);

#endif
// pwm_driver.c
#include "pwm_driver.h"
#include "stm32f4xx_hal.h"

// 全局PWM驱动器
static PWM_Driver pwm_driver;
static TIM_HandleTypeDef htim1;

void PWM_InitDriver(PWM_Driver* driver, uint32_t freq_hz) {
    driver->config.frequency_hz = freq_hz;
    driver->config.resolution = 1680;  // 对于168MHz时钟,20kHz PWM的分辨率
    driver->config.deadtime_ns = 1000;  // 1us死区时间
    driver->config.polarity = 1;        // 高电平有效
    driver->config.max_duty = 0.95f;    // 最大95%占空比
    driver->config.min_duty = 0.0f;     // 最小0%占空比
    
    driver->duty_u = 0;
    driver->duty_v = 0;
    driver->duty_w = 0;
    driver->enabled = 0;
    
    // 初始化定时器
    TIM1_Init(freq_hz);
}

void PWM_SetFrequency(PWM_Driver* driver, uint32_t freq_hz) {
    driver->config.frequency_hz = freq_hz;
    // 重新配置定时器
    // ...
}

void PWM_SetDeadtime(PWM_Driver* driver, float deadtime_ns) {
    driver->config.deadtime_ns = deadtime_ns;
    // 配置死区时间寄存器
    // ...
}

void PWM_SetDuty(PWM_Driver* driver, float u, float v, float w) {
    // 限制占空比范围
    u = fmaxf(fminf(u, driver->config.max_duty), driver->config.min_duty);
    v = fmaxf(fminf(v, driver->config.max_duty), driver->config.min_duty);
    w = fmaxf(fminf(w, driver->config.max_duty), driver->config.min_duty);
    
    driver->duty_u = u;
    driver->duty_v = v;
    driver->duty_w = w;
    
    if (driver->enabled) {
        // 计算比较值
        uint32_t arr = __HAL_TIM_GET_AUTORELOAD(&htim1);
        uint32_t ccr1 = (uint32_t)(u * arr);
        uint32_t ccr2 = (uint32_t)(v * arr);
        uint32_t ccr3 = (uint32_t)(w * arr);
        
        // 设置比较寄存器
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, ccr1);
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, ccr2);
        __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, ccr3);
    }
}

void PWM_Enable(PWM_Driver* driver) {
    driver->enabled = 1;
    
    // 启动PWM输出
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
    
    // 启动互补通道
    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_2);
    HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_3);
}

void PWM_Disable(PWM_Driver* driver) {
    driver->enabled = 0;
    
    // 停止PWM输出
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_1);
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
    HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_3);
    
    HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_1);
    HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_2);
    HAL_TIMEx_PWMN_Stop(&htim1, TIM_CHANNEL_3);
    
    // 关闭所有MOSFET
    GPIO_SetLow(hw_config.pwm_pins.uh_pin);
    GPIO_SetLow(hw_config.pwm_pins.vh_pin);
    GPIO_SetLow(hw_config.pwm_pins.wh_pin);
    GPIO_SetLow(hw_config.pwm_pins.ul_pin);
    GPIO_SetLow(hw_config.pwm_pins.vl_pin);
    GPIO_SetLow(hw_config.pwm_pins.wl_pin);
}

void PWM_SetOutputs(uint8_t uh, uint8_t vh, uint8_t wh, 
                   uint8_t ul, uint8_t vl, uint8_t wl) {
    if (uh) GPIO_SetHigh(hw_config.pwm_pins.uh_pin);
    else GPIO_SetLow(hw_config.pwm_pins.uh_pin);
    
    if (vh) GPIO_SetHigh(hw_config.pwm_pins.vh_pin);
    else GPIO_SetLow(hw_config.pwm_pins.vh_pin);
    
    if (wh) GPIO_SetHigh(hw_config.pwm_pins.wh_pin);
    else GPIO_SetLow(hw_config.pwm_pins.wh_pin);
    
    if (ul) GPIO_SetHigh(hw_config.pwm_pins.ul_pin);
    else GPIO_SetLow(hw_config.pwm_pins.ul_pin);
    
    if (vl) GPIO_SetHigh(hw_config.pwm_pins.vl_pin);
    else GPIO_SetLow(hw_config.pwm_pins.vl_pin);
    
    if (wl) GPIO_SetHigh(hw_config.pwm_pins.wl_pin);
    else GPIO_SetLow(hw_config.pwm_pins.wl_pin);
}

// STM32定时器1初始化
static void TIM1_Init(uint32_t freq_hz) {
    TIM_ClockConfigTypeDef sClockSourceConfig = {0};
    TIM_MasterConfigTypeDef sMasterConfig = {0};
    TIM_OC_InitTypeDef sConfigOC = {0};
    TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
    
    // 计算预分频和自动重载值
    uint32_t timer_clock = 168000000;  // APB2时钟
    uint32_t prescaler = 0;
    uint32_t period = timer_clock / freq_hz - 1;
    
    htim1.Instance = TIM1;
    htim1.Init.Prescaler = prescaler;
    htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;  // 中心对齐模式
    htim1.Init.Period = period;
    htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    htim1.Init.RepetitionCounter = 0;
    htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
    
    if (HAL_TIM_Base_Init(&htim1) != HAL_OK) {
        Error_Handler();
    }
    
    sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
    HAL_TIM_ConfigClockSource(&htim1, &sClockSourceConfig);
    
    if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) {
        Error_Handler();
    }
    
    sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
    sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
    HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
    
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 0;  // 初始占空比为0
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
    sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
    sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
    sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
    
    // 通道1-3配置
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1);
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2);
    HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_3);
    
    // 死区时间配置
    uint32_t deadtime = (pwm_driver.config.deadtime_ns * timer_clock) / 1000000000;
    sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
    sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
    sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
    sBreakDeadTimeConfig.DeadTime = deadtime;
    sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
    sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
    sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
    
    HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
}

七、应用示例

7.1 主应用程序

// main.c
#include "bldc_core.h"
#include "pwm_driver.h"
#include "bemf_sensor.h"
#include "six_step_commutation.h"
#include <stdio.h>

// 全局变量
static BLDC_Controller motor_ctrl;
static BEMF_Sensor bemf_sensor;
static SixStep_Controller sixstep_ctrl;
static PWM_Driver pwm_driver;

// 硬件配置
static BLDC_HW_Config hw_config = {
    .pwm_pins = {
        .uh_pin = GPIO_PIN_8,   // TIM1_CH1
        .vh_pin = GPIO_PIN_9,   // TIM1_CH2
        .wh_pin = GPIO_PIN_10,  // TIM1_CH3
        .ul_pin = GPIO_PIN_13,  // TIM1_CH1N
        .vl_pin = GPIO_PIN_14,  // TIM1_CH2N
        .wl_pin = GPIO_PIN_15,  // TIM1_CH3N
    },
    .adc_channels = {
        .phase_u_adc = ADC_CHANNEL_0,
        .phase_v_adc = ADC_CHANNEL_1,
        .phase_w_adc = ADC_CHANNEL_2,
        .bus_voltage = ADC_CHANNEL_3,
        .temp_adc = ADC_CHANNEL_4,
    },
    .comp_pins = {
        .comp_u_pin = GPIO_PIN_0,
        .comp_v_pin = GPIO_PIN_1,
        .comp_w_pin = GPIO_PIN_2,
    },
    .motor_params = {
        .pole_pairs = 7,
        .phase_resistance = 0.1f,
        .phase_inductance = 0.0001f,
        .kv_rating = 1000.0f,
        .max_current = 10.0f,
        .max_voltage = 24.0f,
    },
    .protection = {
        .overcurrent_threshold = 12.0f,
        .undervoltage_threshold = 18.0f,
        .overvoltage_threshold = 30.0f,
        .overtemperature_threshold = 85.0f,
        .stall_timeout_ms = 2000,
    },
    .pwm_frequency_hz = 20000,
    .adc_resolution = 4096,
    .adc_reference_voltage = 3.3f,
    .current_scale = 10.0f,  // 10A/V
    .shunt_resistance = 0.01f,
};

// 系统定时器中断 (1kHz)
void SysTick_Handler(void) {
    static uint32_t tick_counter = 0;
    system_tick = tick_counter++;
    
    // 读取ADC
    ReadADCValues(&motor_ctrl);
    
    // 更新BEMF检测
    BEMF_Update(&bemf_sensor, &motor_ctrl);
    
    // 执行控制循环
    BLDC_ControlLoop(&motor_ctrl);
    
    // 六步换向控制
    if (motor_ctrl.state == STATE_CLOSEDLOOP) {
        SixStep_UpdateFromBEMF(&sixstep_ctrl, &bemf_sensor, 0);
    }
}

int main(void) {
    // 系统初始化
    SystemClock_Config();
    HAL_Init();
    
    // 初始化PWM驱动
    PWM_InitDriver(&pwm_driver, hw_config.pwm_frequency_hz);
    
    // 初始化BEMF检测
    BEMF_Init(&bemf_sensor);
    
    // 初始化六步换向
    SixStep_Init(&sixstep_ctrl);
    
    // 初始化BLDC控制器
    BLDC_Init(&motor_ctrl, &hw_config);
    
    // 初始化系统定时器 (1kHz)
    HAL_SYSTICK_Config(SystemCoreClock / 1000);
    HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
    
    printf("BLDC Controller Initialized.\n");
    
    // 主循环
    while (1) {
        // 处理用户输入
        HandleUserInput();
        
        // 更新状态显示
        UpdateStatusDisplay();
        
        // 监控任务
        if (motor_ctrl.state == STATE_FAULT) {
            HandleFault(&motor_ctrl);
        }
        
        HAL_Delay(10);
    }
}

// 处理用户输入
void HandleUserInput(void) {
    // 这里可以处理串口命令、按键等
    // 示例:通过串口控制
    if (Serial_Available()) {
        char cmd = Serial_Read();
        
        switch (cmd) {
            case 'S':  // 启动
                BLDC_Start(&motor_ctrl);
                break;
                
            case 'X':  // 停止
                BLDC_Stop(&motor_ctrl);
                break;
                
            case '+':  // 增加速度
                motor_ctrl.target_speed_rpm += 100;
                BLDC_SetSpeed(&motor_ctrl, motor_ctrl.target_speed_rpm);
                break;
                
            case '-':  // 减小速度
                motor_ctrl.target_speed_rpm -= 100;
                BLDC_SetSpeed(&motor_ctrl, motor_ctrl.target_speed_rpm);
                break;
                
            case 'R':  // 复位故障
                if (motor_ctrl.state == STATE_FAULT) {
                    motor_ctrl.state = STATE_STOP;
                    motor_ctrl.fault_overcurrent = false;
                    motor_ctrl.fault_undervoltage = false;
                    motor_ctrl.fault_overtemperature = false;
                    motor_ctrl.fault_stall = false;
                }
                break;
        }
    }
}

// 更新状态显示
void UpdateStatusDisplay(void) {
    static uint32_t last_display_time = 0;
    
    if (system_tick - last_display_time >= 100) {  // 100ms更新一次
        printf("\r状态: %d, 转速: %.1f RPM, 电流: %.2f A, 电压: %.1f V, "
               "温度: %.1f C, 角度: %.1f",
               motor_ctrl.state,
               motor_ctrl.actual_speed_rpm,
               (motor_ctrl.phase_current_u + motor_ctrl.phase_current_v + 
                motor_ctrl.phase_current_w) / 3,
               motor_ctrl.bus_voltage,
               motor_ctrl.temperature,
               motor_ctrl.electrical_angle * 180 / M_PI);
        
        last_display_time = system_tick;
    }
}

// 故障处理
void HandleFault(BLDC_Controller* ctrl) {
    printf("\n故障发生!\n");
    
    if (ctrl->fault_overcurrent) {
        printf("过流故障!\n");
    }
    if (ctrl->fault_undervoltage) {
        printf("欠压故障!\n");
    }
    if (ctrl->fault_overtemperature) {
        printf("过温故障!\n");
    }
    if (ctrl->fault_stall) {
        printf("堵转故障!\n");
    }
    
    // 停止电机
    BLDC_Stop(ctrl);
    
    // 等待复位
    while (1) {
        HAL_Delay(100);
    }
}

7.2 调试和测试代码

// bldc_test.c
#include "bldc_core.h"
#include <stdio.h>
#include <math.h>

// 测试模式
typedef enum {
    TEST_IDLE = 0,
    TEST_ALIGN = 1,
    TEST_OPENLOOP = 2,
    TEST_CLOSEDLOOP = 3,
    TEST_CURRENT_LOOP = 4,
    TEST_BEMF = 5
} Test_Mode;

void Test_Alignment(BLDC_Controller* ctrl) {
    printf("=== 对齐测试 ===\n");
    
    ctrl->state = STATE_ALIGN;
    ctrl->start_stage = 0;
    
    uint32_t start_time = system_tick;
    
    while (system_tick - start_time < 2000) {  // 测试2秒
        BLDC_ControlLoop(ctrl);
        HAL_Delay(1);
        
        printf("对齐电流: %.2f A\n", ctrl->phase_current_u);
    }
    
    printf("对齐测试完成\n");
}

void Test_OpenLoop(BLDC_Controller* ctrl) {
    printf("=== 开环测试 ===\n");
    
    ctrl->state = STATE_OPENLOOP_START;
    ctrl->openloop_speed = 0;
    ctrl->openloop_angle = 0;
    
    // 加速测试
    for (int i = 0; i < 100; i++) {
        ctrl->openloop_speed += 1.0f;  // 1RPM/步
        BLDC_ControlLoop(ctrl);
        
        printf("开环速度: %.1f RPM, 角度: %.1f\n", 
               ctrl->openloop_speed, ctrl->openloop_angle * 180 / M_PI);
        
        HAL_Delay(10);
    }
    
    // 减速测试
    for (int i = 0; i < 100; i++) {
        ctrl->openloop_speed -= 1.0f;
        BLDC_ControlLoop(ctrl);
        
        printf("开环速度: %.1f RPM, 角度: %.1f\n", 
               ctrl->openloop_speed, ctrl->openloop_angle * 180 / M_PI);
        
        HAL_Delay(10);
    }
    
    printf("开环测试完成\n");
}

void Test_BEMF(BEMF_Sensor* sensor) {
    printf("=== BEMF测试 ===\n");
    
    for (int i = 0; i < 100; i++) {
        BEMF_Update(sensor, &motor_ctrl);
        
        printf("BEMF: U=%.3f, V=%.3f, W=%.3f, 频率=%.1f Hz\n",
               sensor->bemf_u_filtered,
               sensor->bemf_v_filtered,
               sensor->bemf_w_filtered,
               sensor->bemf_frequency);
        
        HAL_Delay(10);
    }
}

void Run_All_Tests(void) {
    printf("开始BLDC控制器测试\n");
    
    // 1. 对齐测试
    Test_Alignment(&motor_ctrl);
    HAL_Delay(1000);
    
    // 2. 开环测试
    Test_OpenLoop(&motor_ctrl);
    HAL_Delay(1000);
    
    // 3. BEMF测试
    Test_BEMF(&bemf_sensor);
    
    printf("所有测试完成\n");
}

八、调试和优化

8.1 参数调试工具

// parameter_tuner.h
typedef struct {
    float kp;
    float ki;
    float kd;
    float setpoint;
    float feedback;
    float output;
    float error_integral;
    float error_previous;
} PID_Tuner;

void Tune_SpeedLoop(PID_Tuner* tuner, BLDC_Controller* ctrl) {
    // 自动整定速度环参数
    printf("开始速度环自动整定\n");
    
    // 设置测试信号
    tuner->setpoint = 100.0f;  // 100 RPM
    
    // 记录响应
    float response_time = 0;
    float overshoot = 0;
    float settling_time = 0;
    
    // 这里可以添加Ziegler-Nichols或其他整定算法
    // ...
    
    printf("整定完成: Kp=%.4f, Ki=%.4f\n", tuner->kp, tuner->ki);
}

8.2 性能监控

// performance_monitor.h
typedef struct {
    uint32_t loop_count;
    uint32_t max_loop_time_us;
    uint32_t min_loop_time_us;
    uint32_t avg_loop_time_us;
    float cpu_usage_percent;
    uint32_t fault_count;
} Performance_Monitor;

void Monitor_Performance(Performance_Monitor* monitor) {
    static uint32_t last_time = 0;
    uint32_t current_time = HAL_GetTick();
    uint32_t loop_time = current_time - last_time;
    
    monitor->loop_count++;
    
    if (loop_time > monitor->max_loop_time_us) {
        monitor->max_loop_time_us = loop_time;
    }
    if (loop_time < monitor->min_loop_time_us || monitor->min_loop_time_us == 0) {
        monitor->min_loop_time_us = loop_time;
    }
    
    // 更新平均时间
    monitor->avg_loop_time_us = (monitor->avg_loop_time_us * (monitor->loop_count - 1) + loop_time) / monitor->loop_count;
    
    last_time = current_time;
}
posted @ 2026-06-04 11:27  小前端攻城狮  阅读(10)  评论(0)    收藏  举报