1. 单电阻采集FOC技术概述
在电机控制领域,磁场定向控制(FOC)技术因其卓越的性能表现已成为工业标准。相比传统的六步换相控制,FOC能够实现更平滑的转矩输出、更高的效率以及更精确的速度控制。而单电阻电流采样方案,则是在保证控制性能的前提下,对传统三电阻采样方案的一次重要优化。
单电阻FOC的核心优势在于硬件成本的大幅降低。传统FOC方案需要在三相桥臂上分别安装采样电阻,而单电阻方案仅需在下桥臂公共端安装一个采样电阻。根据我们的实测数据,采用单电阻方案可以将BOM成本降低约15-20%,这对于消费级产品和大规模工业应用来说意义重大。
2. 单电阻采样原理深度解析
2.1 电流重构理论基础
单电阻采样的核心挑战在于如何从一个采样点获取三相电流信息。其理论基础是基尔霍夫电流定律:在星型连接的电机中,三相电流之和为零(Ia + Ib + Ic = 0)。这意味着我们只需要测量其中两相电流,第三相电流可以通过计算得出。
在实际操作中,我们利用PWM开关状态的变化,在不同的时间段采集电流信息。具体来说:
- 在PWM周期开始时,上桥臂导通,下桥臂关断,此时采样电阻上没有电流流过
- 当某个下桥臂导通时,该相电流会流经采样电阻
- 通过精心设计PWM模式,确保在每个PWM周期内能采集到至少两相的有效电流信息
2.2 采样时序设计要点
正确的采样时序是单电阻方案成功的关键。以下是几个关键参数的设计原则:
- 采样窗口时间:通常设置在PWM周期的中间位置,避开开关噪声。对于20kHz PWM频率,建议采样窗口宽度为1-2μs
- ADC触发时机:必须与PWM生成严格同步,一般使用定时器的比较事件触发ADC
- 死区补偿:需要考虑功率器件开关延迟,在采样时序中加入适当的补偿时间
重要提示:采样电阻的布局对信号质量影响极大。建议将采样电阻尽可能靠近MOSFET放置,并使用开尔文连接方式减小引线电阻的影响。
3. STM32硬件资源配置
3.1 定时器配置详解
STM32F1/F3系列的高级定时器(TIM1/TIM8)是生成PWM信号的理想选择。以下是一个典型的配置流程:
c复制// PWM频率设置示例:16kHz @72MHz主频
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Period = 4499; // 72MHz/(4499+1) = 16kHz
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
// 通道配置
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
// 各通道占空比初始值
TIM_OCInitStructure.TIM_Pulse = 2250; // 50%占空比
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
// 死区时间配置
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
TIM_BDTRInitStructure.TIM_DeadTime = 72; // 1μs @72MHz
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_Cmd(TIM1, ENABLE);
3.2 ADC配置优化技巧
STM32F3系列在ADC性能上具有明显优势,其内置的硬件过采样功能可以显著提高采样精度。以下是配置要点:
- 使用定时器触发ADC采样,确保采样时刻精确
- 启用ADC的DMA传输,减少CPU开销
- 对于F3系列,可以利用内置的硬件过采样功能(16x过采样可将有效分辨率提升2位)
c复制// ADC DMA配置示例
ADC_InitTypeDef ADC_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
// DMA配置
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
// ADC配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
// 校准ADC
ADC_VoltageRegulatorCmd(ADC1, ENABLE);
delay_us(10);
ADC_SelectCalibration(ADC1, ADC_CalibrationMode_Single);
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1) != RESET);
4. 软件算法实现
4.1 电流重构算法
采集到原始ADC值后,需要经过以下处理流程:
- 偏移校准:消除ADC零漂
- 增益校准:将ADC值转换为实际电流值
- 相电流重构:根据PWM状态重建三相电流
c复制// 电流重构示例代码
typedef struct {
float Ia;
float Ib;
float Ic;
} PhaseCurrents;
PhaseCurrents ReconstructCurrents(uint16_t adc_value, PWM_State pwm_state)
{
static float R_shunt = 0.05f; // 采样电阻值
static float gain = 3.3f / 4095.0f / R_shunt; // 3.3V参考电压,12位ADC
float I_shunt = (float)adc_value * gain;
PhaseCurrents currents;
switch(pwm_state) {
case PWM_STATE_A:
currents.Ia = I_shunt;
currents.Ib = 0;
currents.Ic = -currents.Ia;
break;
case PWM_STATE_B:
currents.Ia = 0;
currents.Ib = I_shunt;
currents.Ic = -currents.Ib;
break;
case PWM_STATE_C:
currents.Ia = -I_shunt;
currents.Ib = I_shunt;
currents.Ic = 0;
break;
default:
currents.Ia = 0;
currents.Ib = 0;
currents.Ic = 0;
}
return currents;
}
4.2 FOC算法实现
完整的FOC算法包含以下步骤:
- Clarke变换:将三相电流转换为α-β坐标系
- Park变换:将α-β坐标系转换为d-q坐标系
- PI调节器:实现电流环控制
- 反Park变换:将d-q坐标系转换回α-β坐标系
- SVM调制:生成PWM信号
c复制// FOC核心算法示例
void FOC_Update(Motor *motor)
{
// Clarke变换
float I_alpha = motor->Ia;
float I_beta = (motor->Ia + 2*motor->Ib) * ONE_BY_SQRT3;
// Park变换
float sin_theta = arm_sin_f32(motor->theta_e);
float cos_theta = arm_cos_f32(motor->theta_e);
motor->Id = I_alpha * cos_theta + I_beta * sin_theta;
motor->Iq = -I_alpha * sin_theta + I_beta * cos_theta;
// PI调节
motor->Vd = PI_Update(&motor->pid_Id, motor->Id_ref - motor->Id);
motor->Vq = PI_Update(&motor->pid_Iq, motor->Iq_ref - motor->Iq);
// 反Park变换
float V_alpha = motor->Vd * cos_theta - motor->Vq * sin_theta;
float V_beta = motor->Vd * sin_theta + motor->Vq * cos_theta;
// SVM调制
SVM_Update(V_alpha, V_beta, &motor->pwm_duty);
}
5. 实际调试经验分享
5.1 常见问题排查
-
电流采样噪声大:
- 检查PCB布局,确保采样回路面积最小化
- 增加RC滤波(典型值:100Ω+100nF)
- 启用ADC的硬件平均功能
-
电机运行抖动:
- 检查电流重构算法是否正确
- 验证PWM时序与ADC采样的同步性
- 调整PI参数,通常先调Iq环再调Id环
-
高速运行不稳定:
- 检查反电动势补偿是否足够
- 提高PWM频率(最高到32kHz)
- 考虑使用弱磁控制
5.2 性能优化技巧
-
使用查表法优化三角函数计算:
c复制// 预计算sin/cos表 #define TABLE_SIZE 256 float sin_table[TABLE_SIZE]; void InitTrigTables(void) { for(int i=0; i<TABLE_SIZE; i++) { float angle = 2*PI*i/TABLE_SIZE; sin_table[i] = arm_sin_f32(angle); } } float FastSin(float angle) { angle = fmodf(angle, 2*PI); if(angle < 0) angle += 2*PI; int index = (int)(angle * TABLE_SIZE / (2*PI)); return sin_table[index]; } -
利用DMA实现双缓冲:
- 设置两个ADC缓冲区,DMA在填充一个缓冲区时,CPU可以处理另一个缓冲区
- 避免数据处理延迟导致的控制周期抖动
-
使用STM32硬件加速:
- F3系列内置CORDIC协处理器,可加速三角函数计算
- 使用ARM CMSIS-DSP库优化数学运算
6. 不同芯片型号的适配考虑
6.1 STM32F1系列特点
- 最高72MHz主频
- 无硬件浮点单元
- ADC性能一般(1MHz左右)
- 推荐用于低成本、中低性能应用
优化建议:
- 使用Q15格式定点数运算
- 降低控制频率(5-10kHz)
- 采用简化版FOC算法
6.2 STM32F3系列优势
- 最高72MHz主频,带FPU
- 5Msps高速ADC
- 内置比较器、运放等模拟外设
- 适合高性能应用
可实现的增强功能:
- 更高的控制频率(20-32kHz)
- 更复杂的观测器算法(如滑模观测器)
- 实时参数辨识
在实际项目中,我们曾用STM32F303实现了一套单电阻FOC方案,控制频率达到20kHz,电机转速范围0-20000RPM,稳态转速误差小于0.1%。关键是在ADC采样时刻的精确控制和电流重构算法的优化上下了很大功夫。