2. 电角度开环旋转

任务目标

本案例通过向FOC控制器输入连续递增的电角度(开环控制),驱动电机匀速旋转,并观察三相电流波形随电角度变化的规律。核心目的是验证电角度与电流矢量之间的对应关系,为后续闭环控制建立直观认知。

实现原理

在FOC中,电角度θ决定电流矢量的方向。开环运行时,我们直接给定θ = ω·t(ω为电角速度),经逆Park变换得到αβ轴电压,再经SVPWM输出到逆变器。由于电机反电动势与电流矢量方向存在相位差,实际电流波形会呈现与给定电角度相关的正弦变化。本案例使用STM32F407 + 定时器生成PWM,通过ADC采样两相电流,在串口或调试器观察波形。

关键代码实现

// 开环电角度旋转 - 核心代码 (STM32F407, 主频168MHz)
#include "main.h"
#include "foc_math.h"

// 全局变量
float electrical_angle = 0.0f;      // 当前电角度 (rad)
float electrical_speed = 2.0f * PI * 10.0f;  // 电角速度: 10圈/秒
float ia, ib, ic;                   // 三相电流采样值 (A)
float valpha, vbeta;                // αβ轴电压
float vd = 0.5f, vq = 0.3f;         // dq轴给定电压 (开环固定值)

// 定时器中断: 10kHz 控制频率
void TIM1_UP_IRQHandler(void) {
    if (TIM1->SR & TIM_SR_UIF) {
        TIM1->SR = ~TIM_SR_UIF;
        
        // 1. 更新电角度 (匀速递增)
        electrical_angle += electrical_speed * 0.0001f;  // 100μs周期
        if (electrical_angle > 2.0f * PI) 
            electrical_angle -= 2.0f * PI;
        
        // 2. 逆Park变换: dq -> αβ
        float sin_a = sinf(electrical_angle);
        float cos_a = cosf(electrical_angle);
        valpha = vd * cos_a - vq * sin_a;
        vbeta = vd * sin_a + vq * cos_a;
        
        // 3. SVPWM调制 (简化: 直接输出占空比)
        // 实际需调用SVPWM函数生成三路PWM
        svpwm_set_voltage(valpha, vbeta);
        
        // 4. 采样电流 (需在PWM中心对齐处触发ADC)
        ia = adc_get_current(CHANNEL_A);
        ib = adc_get_current(CHANNEL_B);
        ic = -(ia + ib);  // 三相平衡假设
        
        // 5. 通过DAC或串口输出波形 (调试用)
        debug_output(ia, ib, ic, electrical_angle);
    }
}

// 主函数初始化
int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_TIM1_Init();   // PWM输出 + 定时中断
    MX_ADC1_Init();   // 电流采样
    MX_DAC_Init();    // 波形观察
    
    // 启动PWM和ADC
    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_TIM_Base_Start_IT(&htim1);
    HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 2);
    
    while (1) {
        // 主循环可调整速度或观察状态
    }
}

运行与验证

硬件连接:电机UVW接逆变器输出,直流母线电压24V,电流传感器(如ACS712)串联在U、V相,ADC采样引脚接传感器输出。

编译烧录:使用STM32CubeIDE编译工程,通过ST-Link烧录到开发板。

验证步骤:

  1. 将vd设为0.5V,vq设为0.3V,电角速度设为10圈/秒(对应机械转速取决于极对数)。
  2. 用示波器或DAC输出观察ia、ib波形,应呈现频率为10Hz的正弦波,相位差120°。
  3. 用逻辑分析仪或串口打印electrical_angle,确认其线性递增(0→2π循环)。
  4. 同时观察valpha、vbeta波形,应为正交正弦波(相位差90°)。

通过条件:电流波形频率与给定电角速度一致(误差<5%),三相电流幅值基本相等(偏差<10%),且波形无明显畸变。若电机带负载,电流幅值会随负载增大,但波形形状不变。

开环电角度与电流波形关系 时间 (ms) 电流 (A) 电角度θ (线性递增) ia ib 120° 幅值

常见问题

  • 电机不转:检查PWM频率是否在16kHz以上(避免 audible noise),确认SVPWM调制比不超过1.0(即母线电压利用率限制)。
  • 电流波形畸变:可能是死区时间设置不当或电流采样时刻不在PWM中心,需调整ADC触发点为定时器中心对齐模式。
  • 电流幅值不平衡:检查三相绕组阻抗是否对称,或电流传感器零点偏移是否校准。