1. 单电阻采样FOC系统概述
单电阻采样FOC(磁场定向控制)系统是一种用于永磁同步电机(PMSM)驱动的高性价比解决方案。与传统的三电阻采样方案相比,单电阻采样通过在直流母线串联单个采样电阻来重构三相电流,显著降低了硬件成本和PCB布局复杂度。
这种方案的核心挑战在于:
- 需要在有限的PWM周期内精准捕捉有效电流信号
- 必须解决采样窗口不足的问题
- 需要处理开关管切换带来的干扰
- 电流重构算法必须足够鲁棒
在实际工程应用中,我们通常采用STM32F103等Cortex-M3内核MCU来实现这一系统,配合Keil MDK开发环境和标准库/HAL库进行开发。系统的主要组成部分包括:
- PWM生成模块(TIM1高级定时器)
- ADC采样模块(规则组+注入组)
- 电流重构算法
- 电机参数辨识
- 无感位置估计(SMO/SVC)
- 双闭环控制(电流环+速度环)
提示:单电阻方案虽然成本低,但对软件时序要求极高,建议使用定时器主从模式确保PWM、ADC和DMA的严格同步。
2. 单电阻采样核心技术解析
2.1 移相策略实现
移相策略是解决采样窗口不足的关键技术。我们需要先定义几个关键参数:
c复制// PWM占空比参数定义
uint16_t hig = MAX(dutyA, dutyB, dutyC); // 最大相占空比
uint16_t mid = MID(dutyA, dutyB, dutyC); // 中间相占空比
uint16_t low = MIN(dutyA, dutyB, dutyC); // 最小相占空比
uint16_t delta1 = mid - low; // 第一个采样窗口
uint16_t delta2 = hig - mid; // 第二个采样窗口
uint16_t delta = hig - low; // 总差值
根据这些参数,我们可以将移相场景分为四类:
| 场景类型 | 判定条件 | 移相策略 | 典型应用场景 |
|---|---|---|---|
| 无需移相 | delta1≥Tmin且delta2≥Tmin | 保持原有相位 | 轻载或平衡工况 |
| 三相接近 | delta<2*Tmin | 固定最大相,调整中/小相 | 接近50%占空比时 |
| 一长两短 | delta2<Tmin | 左移中间相 | 一相高占空比 |
| 两长一短 | delta1<Tmin | 右移中间相 | 两相高占空比 |
移相实现时需要特别注意:
- 上桥臂占空比不能设为100%,否则下桥臂无法导通导致电流无法采样
- 移相后要确保PWM比较值不超过定时器周期(PRD)
- 死区时间必须考虑在内,通常设置为1-2us
2.2 电流重构算法
电流重构的核心是根据电压空间矢量所在扇区,建立采样电阻电流与三相电流的对应关系。空间矢量被划分为6个扇区(0-5),每个扇区有不同的电流路径。
以扇区0为例的电流重构过程:
- 矢量7阶段(000):所有上桥臂导通,无电流流过采样电阻
- 矢量6阶段(001):C相下桥臂导通,采样电流为-Ic
- 矢量2阶段(101):B相下桥臂导通,采样电流为Ia
- 根据KCL定律:Ia + Ib + Ic = 0 → Ib = -(Ia + Ic)
各扇区的电流重构关系如下表所示:
| 扇区 | 最大相 | 中间相 | 最小相 | 第一次采样 | 第二次采样 | 重构公式 |
|---|---|---|---|---|---|---|
| 0 | A | B | C | -Ic | Ia | Ib=-(Ia+Ic) |
| 1 | B | A | C | -Ic | Ib | Ia=-(Ib+Ic) |
| 2 | B | C | A | -Ia | Ib | Ic=-(Ia+Ib) |
| 3 | C | B | A | -Ia | Ic | Ib=-(Ia+Ic) |
| 4 | C | A | B | -Ib | Ic | Ia=-(Ib+Ic) |
| 5 | A | C | B | -Ib | Ia | Ic=-(Ia+Ib) |
在代码实现中,我们通常使用查表法来提高效率:
c复制// 扇区电流重构表
const int8_t current_reconstruct_table[6][3] = {
{1, 0, -1}, // 扇区0: Ia=采样2, Ib=-(Ia+Ic), Ic=-采样1
{0, 1, -1}, // 扇区1
{-1, 1, 0}, // 扇区2
{-1, 0, 1}, // 扇区3
{0, -1, 1}, // 扇区4
{1, -1, 0} // 扇区5
};
2.3 采样点优化技术
采样点的精准定位对电流测量精度至关重要。我们需要考虑三个关键时间参数:
- 死区时间(t_d):通常1-2μs,防止上下桥臂直通
- 电流稳定时间(t_stab):约2μs,等待电流振荡衰减
- ADC采样时间(t_adc):约2.5μs(84MHz时钟下)
采样点设置规则:
- 第一相采样延迟 = t_d + t_stab ≈ 3μs
- 第二相采样延迟 = t_stab ≈ 2μs
在STM32中,我们通过定时器的比较匹配来触发ADC采样:
c复制// 定时器配置示例(PWM频率16kHz,时钟64MHz)
TIM1->ARR = 3999; // PWM周期 = 4000个计数
TIM1->CCR4 = 192; // 第一相采样点 (3μs = 192个计数@64MHz)
TIM1->CCR3 = 128; // 第二相采样点 (2μs = 128个计数)
注意:实际工程中需要根据示波器观测的电流波形微调这些参数,确保采样点位于电流平台区。
3. 电机参数辨识技术
3.1 电感参数辨识
电感辨识利用磁路饱和特性,通过将转子定位到特定角度并施加电压脉冲来测量电流变化率。
辨识流程:
- 转子定位到0°(q轴对齐)
- 施加V+W-电压脉冲(持续时间T_pulse)
- 测量电流变化ΔI
- 计算线电感:Lbc = (Udc * T_pulse) / ΔI
- 重复在90°位置(d轴对齐)测量
- 推导dq轴电感:Lq = Lbc(0°)/2, Ld = Lbc(90°)/2
代码实现关键点:
c复制void Inductance_Identification(void) {
// 1. 转子定位到0度
Set_PWM_Duty(0, 0.5, -0.5); // U相开通,VW相负向
delay_ms(100);
// 2. 施加电压脉冲
uint32_t t_start = Get_Micros();
Set_PWM_Duty(1, 0, -1); // 最大电压脉冲
while(Get_Micros() - t_start < T_PULSE); // 保持脉冲时间
// 3. 采样电流
float delta_i = Get_Current() - i_initial;
// 4. 计算电感
Lbc = (Udc * T_PULSE) / (delta_i * 1e6); // 转换为H
// 5. 重复90度位置测量...
}
3.2 电阻参数辨识
电阻辨识基于欧姆定律,通过闭环控制稳定电流后测量电压电流关系。
辨识步骤:
- 设定目标电流I_set(如0.5倍额定电流)
- 闭环控制电流至稳定
- 采样512组Udc和Ia数据
- 计算平均值和电阻值:Rs = ΔU/ΔI
注意事项:
- 需要在不同电流点多次测量提高精度
- 要考虑MOSFET导通电阻的影响
- 温度变化会影响电阻值,最好在常温下测量
3.3 磁链参数辨识
磁链辨识基于拖转法,通过测量不同id下的uq值来计算。
核心公式:
[ \phi_r = \frac{u_{q1}i_{d2} - u_{q2}i_{d1}}{\omega_e(i_{d2} - i_{d1})} ]
实现要点:
- 将电机拖转到稳定转速(如1000rpm)
- 施加不同的d轴电流(id1和id2)
- 测量对应的q轴电压(uq1和uq2)
- 代入公式计算永磁磁链
4. 无感控制算法实现
4.1 滑模观测器(SMO)设计
滑模观测器通过比较估计电流与实际电流的偏差来修正速度和位置估计。
电流估计模型:
[ \begin{cases}
di_d = \frac{T_s}{L_d}(u_d - R_si_d + \omega_eL_qi_q) \
di_q = \frac{T_s}{L_q}(u_q - R_si_q - \omega_e(L_di_d + \phi_r))
\end{cases} ]
速度估计流程:
- 计算电流估计误差:e = i_actual - i_estimate
- 更新反电势估计:
[ emf_{est} = emf_{est_last} + k_i \cdot e \cdot T_s ] - 计算电角速度:
[ \omega_e = emf_{est} / \phi_r ] - 积分得到转子位置:
[ \theta_{est} = \theta_{est_last} + \omega_e \cdot T_s ]
代码实现关键:
c复制typedef struct {
float i_d_est; // 估计d轴电流
float i_q_est; // 估计q轴电流
float emf_est; // 估计反电势
float theta_est; // 估计转子位置(rad)
float omega_est; // 估计电角速度(rad/s)
} SMO_Observer;
void SMO_Update(SMO_Observer* obs, float u_d, float u_q, float i_d, float i_q) {
// 电流估计
obs->i_d_est += Ts/Ld * (u_d - Rs*obs->i_d_est + obs->omega_est*Lq*obs->i_q_est);
obs->i_q_est += Ts/Lq * (u_q - Rs*obs->i_q_est - obs->omega_est*(Ld*obs->i_d_est + Flux));
// 反电势估计
float e_q = i_q - obs->i_q_est;
obs->emf_est += Ki * e_q * Ts;
// 速度估计
obs->omega_est = obs->emf_est / Flux;
// 位置估计
obs->theta_est += obs->omega_est * Ts;
if(obs->theta_est > 2*PI) obs->theta_est -= 2*PI;
if(obs->theta_est < 0) obs->theta_est += 2*PI;
}
4.2 初始转子位置检测
六脉冲定位法流程:
- 对三相依次施加正负电压脉冲(VA+,VA-,VB+,VB-,VC+,VC-)
- 测量每个脉冲结束时的电流峰值
- 计算电流差值Δih = ih+ - ih-
- 通过模糊逻辑处理确定初始位置
代码实现:
c复制float Six_Step_Detection(void) {
float delta_i[3]; // ABC三相电流差值
float max_delta = 0;
// 1. 施加六脉冲序列
for(int i=0; i<3; i++) {
// 正脉冲
Apply_Pulse(i, POSITIVE);
delay_us(PULSE_WIDTH);
float i_pos = Get_Current();
// 负脉冲
Apply_Pulse(i, NEGATIVE);
delay_us(PULSE_WIDTH);
float i_neg = Get_Current();
delta_i[i] = i_pos - i_neg;
if(fabs(delta_i[i]) > max_delta) max_delta = fabs(delta_i[i]);
}
// 2. 归一化处理
float norm_delta[3];
for(int i=0; i<3; i++) {
norm_delta[i] = delta_i[i] / max_delta;
}
// 3. 模糊逻辑判断位置
float theta = Fuzzy_Logic_Process(norm_delta);
return theta;
}
5. 系统调试与优化
5.1 常见问题解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 电流波形毛刺 | 扇区切换不同步 | 使用延迟扇区变量(sector_post) |
| 重构电流偏移 | ADC零漂未校准 | 增加零矢量采样校准 |
| 电感辨识过流 | 脉冲时间过长 | 减小占空比步长,延长PWM周期 |
| 启动抖动 | 观测器增益不匹配 | 调整KiForEmf参数 |
| 高速失步 | 反电势估计延迟 | 增加速度前馈补偿 |
5.2 关键参数调试建议
-
电流环PI参数:
- Kp = 3L/(nTs)
- Ki = 3Rs/(nTs)
- 典型值:n=8, Ts=62.5μs(16kHz)
-
速度环PI参数:
- 从较小值开始调试
- 先调Kp使转速能跟踪
- 再调Ki消除静差
- 典型带宽:50-100Hz
-
滑模观测器参数:
- KiForEmf = 3Rs/(nTs)
- 低速时可适当增大增益
- 高速时需要降低增益
5.3 硬件设计要点
-
采样电阻选择:
- 阻值:0.001-0.01Ω
- 功率:至少3倍额定功耗
- 温度系数:<100ppm/℃
-
运放电路设计:
- 带宽:>1MHz
- 增益:20-50倍
- 推荐型号:INA240, INA293
-
PCB布局:
- 采样电阻靠近逆变器
- 模拟地单点连接
- 避免高频干扰
6. 工程实现参考
完整的Keil工程应包含以下模块:
-
硬件抽象层(HAL):
- PWM配置
- ADC配置
- 定时器配置
-
算法模块:
- 电流重构
- SMO观测器
- PI控制器
- 参数辨识
-
应用层:
- 状态机
- 保护逻辑
- 通信接口
关键代码结构:
code复制Project/
├── CMSIS/
├── Drivers/
├── Inc/
│ ├── foc_algorithm.h
│ ├── hardware_init.h
│ └── sm_observer.h
└── Src/
├── main.c
├── foc_algorithm.c
├── hardware_init.c
└── sm_observer.c
在main.c中的典型控制流程:
c复制int main(void) {
Hardware_Init(); // 初始化硬件
Motor_Parameter_Identification(); // 参数辨识
while(1) {
Current_Reconstruct(); // 电流重构
SMO_Update(); // 更新观测器
FOC_Control(); // 磁场定向控制
Speed_Control(); // 速度控制
Protection_Check(); // 保护检测
}
}
对于资源受限的F103平台,可以采用Q格式定点运算来优化性能:
c复制// Q15格式的PI控制器实现
int32_t PI_Controller_Q15(PI_Controller* pi, int32_t error) {
pi->integral += error;
// 积分限幅
if(pi->integral > pi->integral_max) pi->integral = pi->integral_max;
else if(pi->integral < -pi->integral_max) pi->integral = -pi->integral_max;
// Q15乘法,结果右移15位
int32_t p_term = (error * pi->kp) >> 15;
int32_t i_term = (pi->integral * pi->ki) >> 15;
return p_term + i_term;
}
通过以上技术实现,单电阻采样FOC系统可以在保证性能的同时显著降低成本,适用于风机、泵、电动工具等大批量应用场景。