高频注入方案 基于stm32 提升foc的低速性能 简称HFI 脉振高频注入法 在d轴注入正弦波 判断转子位置 实现无感foc的0速和低速控制。 全源码,不是库。

在电机控制领域,场定向控制(FOC)无疑是一项极为重要的技术。然而,FOC在低速尤其是零速时,由于反电动势信号微弱甚至没有,传统基于反电动势检测的转子位置估算方法就会失效。这时候,高频注入方案(High - Frequency Injection,简称HFI)便应运而生,它能有效提升FOC在低速时的性能。本文将围绕基于STM32实现的HFI脉振高频注入法展开,探讨如何通过在d轴注入正弦波来判断转子位置,进而实现无感FOC的0速和低速控制,并且分享全源码(非库实现)。

脉振高频注入法原理

脉振高频注入法的核心思路,是在电机的d轴注入一个高频正弦波信号。由于电机转子的不对称性(凸极效应),注入的高频信号会在电机的感应电压中产生与转子位置相关的调制分量。通过对这些调制分量进行解调、滤波等处理,就可以估算出转子的位置信息。

具体来说,假设注入的高频正弦波信号为:$V{hf} = V{m} \sin(\omega{hf}t)$,其中$V{m}$是幅值,$\omega_{hf}$是高频角频率。这个信号注入到d轴后,电机的感应电压会包含与转子位置$\theta$相关的成分。通过特定的算法处理这些感应电压信号,就能提取出转子位置。

STM32实现要点

硬件连接

首先,确保STM32与电机驱动电路正确连接。STM32需要具备合适的PWM输出通道来控制电机的三相电压,同时需要有ADC通道来采集电机的电流和感应电压信号。例如,使用STM32F4系列,其丰富的定时器资源可用于生成高精度的PWM信号,而高性能的ADC模块能够快速准确地采集模拟信号。

软件实现

  1. 高频信号注入

下面是一段简单的代码用于生成高频正弦波信号并注入到d轴(假设使用定时器产生PWM信号):

// 假设TIMx为用于生成高频PWM的定时器
void HF_Inject_Init(void) {
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;

    // 使能TIMx时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx, ENABLE);

    // 定时器基本配置
    TIM_TimeBaseStructure.TIM_Period = HF_PERIOD - 1; // HF_PERIOD为高频信号周期
    TIM_TimeBaseStructure.TIM_Prescaler = HF_PRESCALER - 1; // 预分频器
    TIM_TimeBaseStructure.TIM_ClockDivision = 0;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIMx, &TIM_TimeBaseStructure);

    // PWM模式配置
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_Pulse = HF_AMPLITUDE; // HF_AMPLITUDE为高频信号幅值
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC1Init(TIMx, &TIM_OCInitStructure);

    // 使能定时器
    TIM_Cmd(TIMx, ENABLE);
}

在这段代码中,首先使能了定时器时钟,然后对定时器的基本参数如周期、预分频器等进行配置,最后将定时器配置为PWM模式并设置好幅值,启动定时器,这样就实现了高频正弦波信号的注入。

  1. 感应电压采集与处理

使用ADC采集电机的感应电压信号,以下是ADC初始化及数据采集的代码示例:

// 假设ADCx为用于采集感应电压的ADC
void ADC_Init_For_Sensorless(void) {
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    // 使能ADCx和对应GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADCx | RCC_APB2Periph_GPIOx, ENABLE);

    // 配置GPIO为模拟输入
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOx, &GPIO_InitStructure);

    // ADC初始化
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADCx, &ADC_InitStructure);

    // 配置ADC通道
    ADC_RegularChannelConfig(ADCx, ADC_Channel_x, 1, ADC_SampleTime_55Cycles5);

    // 使能ADC
    ADC_Cmd(ADCx, ENABLE);
}

// 采集ADC数据
uint16_t ADC_Read(void) {
    // 启动转换
    ADC_SoftwareStartConvCmd(ADCx, ENABLE);
    // 等待转换完成
    while (ADC_GetFlagStatus(ADCx, ADC_FLAG_EOC) == RESET);
    return ADC_GetConversionValue(ADCx);
}

在这段代码中,先使能了ADC和相关GPIO的时钟,将GPIO配置为模拟输入模式,接着对ADC进行初始化,设置为独立模式、单次转换等参数,并配置好采集通道,最后使能ADC。采集函数则通过软件触发转换并等待转换完成后返回采集到的数据。

  1. 转子位置估算算法

采集到感应电压信号后,需要通过特定算法解调、滤波来估算转子位置。这部分代码相对复杂,涉及到信号处理算法,以下是一个简化的示意代码(实际算法可能需要更精细的设计和优化):

// 假设采集到的ADC数据存放在adc_value中
float Estimate_Rotor_Position(uint16_t adc_value) {
    // 简单的解调算法示意
    float demodulated_value = (float)adc_value * HF_MODULATION_FACTOR;
    // 简单的低通滤波
    static float filtered_value = 0;
    filtered_value = FILTER_COEFFICIENT * filtered_value + (1 - FILTER_COEFFICIENT) * demodulated_value;
    // 根据滤波后的值估算转子位置
    float rotor_position = atan2(filtered_value, REFERENCE_VALUE) * 180.0 / PI;
    return rotor_position;
}

在这段代码中,首先对采集到的ADC数据进行解调,乘以一个调制因子。然后通过一个简单的一阶低通滤波器对解调后的数据进行滤波,最后根据滤波后的值使用反正切函数估算出转子位置。

总结

通过基于STM32实现的高频注入方案(HFI)脉振高频注入法,我们能够有效地在FOC控制中解决低速和零速时的转子位置估算问题,提升电机在这些工况下的性能。从高频信号注入、感应电压采集到转子位置估算,每一步都需要精心设计和调试。希望本文分享的原理、代码及分析能对各位在电机控制领域探索的朋友有所帮助,大家可以在此基础上进一步优化和完善,实现更高效稳定的无感FOC控制。

Logo

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

更多推荐