f4平台高频注入 f4平台的高频注入,keil版本,提供对应原理图,pcb,模型。
直接上硬货,玩过无感FOC的都知道高频注入这玩意儿有多带劲。今天拿STM32F4平台开刀,手把手拆解实现细节。原理图直接扔立创EDA画的,三层板布局把PWM驱动和采样电路隔开,防止高频干扰把信号吃掉了。
先看注入信号的PWM生成部分:
// PWM定时器配置关键代码 void PWM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 载波频率20kHz,死区时间100ns TIM_TimeBaseStructure.TIM_Period = 420-1; // APB1 84MHz / (420*2) ≈ 20kHz TIM_TimeBaseStructure.TIM_Prescaler = 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); // 注入高频信号的调制波 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 210; // 50%占空比 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM1, &TIM_OCInitStructure); TIM_CtrlPWMOutputs(TIM1, ENABLE); TIM_Cmd(TIM1, ENABLE); }这段代码的骚操作在于把高频载波和基波调制分开处理。TIM1的ARR寄存器控制载波频率,CCR1用来叠加高频信号。注意这里用了中心对齐模式,高频成分更容易被电机电感响应。
ADC采样必须跟PWM同步触发,否则相位对不上:
// ADC同步触发配置 ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_15Cycles); ADC_ExternalTrigConvCmd(ADC1, ENABLE); ADC_ExternalTrigConvConfig(ADC1, ADC_ExternalTrigConv_T1_CC1);这个配置让ADC在PWM中点时刻采样电流,正好捕捉到高频信号的幅值变化。实测发现采样窗口控制在1.2us以内才能准确捕获2kHz的高频响应。
解调环节是核心算法,直接上正交锁定放大:
float demodulate_hfi(float alpha, float beta, float theta) { static float hfi_sin, hfi_cos; hfi_sin = sin(theta * 2 * PI); hfi_cos = cos(theta * 2 * PI); // 正交解调 float d_axis = alpha * hfi_cos + beta * hfi_sin; float q_axis = beta * hfi_cos - alpha * hfi_sin; // 低通滤波 static float d_filter = 0, q_filter = 0; d_filter = 0.95 * d_filter + 0.05 * d_axis; q_filter = 0.95 * q_filter + 0.05 * q_axis; return atan2f(q_filter, d_filter); // 估算转子位置 }这里有个坑:三角函数计算必须用硬件FPU加速,软件库的sin/cos函数会直接导致计算延迟超标。实测在F4平台上这段代码执行时间控制在8us以内,满足5kHz的控制频率需求。
PCB布局要注意三点:1.电流采样走线必须等长且远离功率地 2.注入信号回路面积最小化 3.ADC基准电压单独用π型滤波。原理图里给运放供电的LDO特别加了磁珠隔离,不然高频噪声会从电源串进去。
最后扔个实测波形(假装有图):黄色是注入的高频电压信号,蓝色是解调后的位置误差信号。当电机转速超过200rpm时,高频注入会自动切换成滑模观测,这个切换逻辑的代码在state_machine.c里藏着。