基于STM32的无人机FOC电调开发全流程:从寄存器配置到空载测试
扫描二维码
随时随地手机看文章
一块STM32G431、三颗IRFS7530 MOSFET、两个1mΩ采样电阻——这就是一台20A无人机电调的全部硬件。但从上电到电机平稳空转,中间隔着寄存器配置、ADC同步触发、Park变换、PI调参、SVPWM生成五道关卡。少过一关,轻则发热抖动,重则炸管烧机。
一、原理分析:五层架构,每层都是生死线
无人机FOC电调的软件架构分五层,自底向上:
第一层:硬件抽象层(寄存器配置)。STM32G431的HRTIM负责生成三相互补PWM,死区精度185ps;ADC1/ADC2双ADC同步注入采样三相电流,采样点锁定在PWM中点;运放OPAMP1/2做差分放大,增益20倍,输出接ADC。
第二层:信号处理层(Clark+Park变换)。三相电流 ia,ib,ic 经Clark变换投影到 αβ 静止坐标系,再经Park变换旋转到 dq 同步旋转坐标系。Id 控制磁通(设为0),Iq 控制转矩——两个直流量,用PI分别调节。
第三层:控制层(双闭环PI)。外环速度环输出 Iq 参考值,带宽设50Hz;内环电流环跟踪 Iq,带宽设2kHz。电流环必须比速度环快5~10倍,否则系统振荡。
第四层:调制层(SVPWM)。根据 Vd,Vq 反Park变换回 αβ,再用SVPWM算法生成六路PWM占空比,送入HRTIM比较寄存器。
第五层:保护层。过流、过压、堵转、堵转恢复,全部在硬件比较器层面实现,CPU来不及反应时硬件先动作。
二、寄存器配置:三组代码定生死
HRTIM配置——死区200ns,精度的起点
void HRTIM_PWM_Init(void) {
// 时钟:170MHz / 1 = 170MHz,周期1190 → PWM频率 ≈ 119kHz
HRTIM1->sTimerxRegs[0].TIMxCR = 0x0001; // 连续模式
HRTIM1->sTimerxRegs[0].PERxR = 1190;
HRTIM1->sTimerxRegs[0].REPxR = 0;
// 死区:200ns ≈ 34个HRTIM时钟周期
HRTIM1->sTimerxRegs[0].DTxR = 34;
// 比较值:初始设为0(电机停转)
HRTIM1->sTimerxRegs[0].CMP1xR = 0;
HRTIM1->sTimerxRegs[0].CMP2xR = 0;
HRTIM1->sTimerxRegs[0].CMP3xR = 0;
HRTIM1->sMasterRegs.MCR = 0x01; // 启动定时器
}
ADC双同步注入——采样点锁定PWM中点
void ADC_Sync_Init(void) {
// ADC1通道1=A相,ADC2通道1=B相,C相由KCL推算
ADC1->CFGR |= ADC_CFGR_JAUTO; // 自动注入
ADC1->SMPR1 = 0x00700707; // 采样时间247.5周期
ADC2->CFGR |= ADC_CFGR_JAUTO;
ADC2->SMPR1 = 0x00700707;
// 触发源:HRTIM的CMP1事件 → 采样点锁定在PWM中点
ADC1->CFGR |= (0b0101 << 20); // JEXTSEL = HRTIM_TRG1
ADC_CCR->CFGR |= ADC_CCR_DMACFG; // DMA双缓冲
}
OPAMP配置——增益20倍,偏置1.65V
void OPAMP_Init(void) {
// OPAMP1:A相电流差分放大,增益20
OPAMP1->CSR = OPAMP_CSR_OPAMPxEN // 使能
| OPAMP_CSR_PGGAIN_2 // 增益20
| OPAMP_CSR_VMSEL_VREF // 正输入接1.65V基准
| OPAMP_CSR_VPSEL_DAC; // 负输入接采样电阻
OPAMP2->CSR = OPAMP_CSR_OPAMPxEN | OPAMP_CSR_PGGAIN_2 | OPAMP_CSR_VMSEL_VREF;
}
三、数据比对:FOC vs 六步换向,空载实测说话
|
指标 |
六步换向 |
FOC(本方案) |
提升幅度 |
|
空载电流 |
1.8A |
0.6A |
-67% |
|
转矩脉动 |
±12% |
±3% |
75% |
|
效率(空载) |
82% |
94% |
+12% |
|
噪声(1m处) |
68dB |
52dB |
-16dB |
|
启动时间 |
0.8s |
0.3s |
62% |
|
电机温升(10min) |
42℃ |
28℃ |
-33% |
空载测试方法:4S电池供电,油门从0%阶跃到100%,用示波器抓取三相电流波形和母线电压。FOC方案的三相电流正弦度肉眼可见——六步换向是方波,FOC是平滑正弦波,THD从38%降至8%。
四、核心程序:FOC主循环120μs跑完
void FOC_Loop(void) { // 调用频率8.33kHz(120μs)
// ① ADC双缓冲DMA自动填充,零CPU开销
i_a = adc_buf[0] - offset_a;
i_b = adc_buf[1] - offset_b;
i_c = -i_a - i_b; // KCL
// ② Clark变换
i_alpha = i_a;
i_beta = (i_a + 2*i_b) / sqrt(3.0f);
// ③ Park变换(CORDIC加速)
Park_CORDIC(i_alpha, i_beta, theta_est, &i_d, &i_q);
// ④ PI调节
vd = PI_Run(&id_pi, 0 - i_d); // Id=0
vq = PI_Run(&iq_pi, iq_ref - i_q); // Iq跟踪
// ⑤ 反Park + SVPWM → HRTIM占空比
InvPark_CORDIC(vd, vq, theta_est, &v_alpha, &v_beta);
SVPWM_Update(v_alpha, v_beta, &duty_a, &duty_b, &duty_c);
// ⑥ 写入HRTIM比较寄存器
__HAL_HRTIM_SETCOMPARE(&hhrtim, HRTIM_TIMERINDEX_TIMER_A,
HRTIM_COMPAREUNIT_1, duty_a);
}
结语
从寄存器的一个死区配置,到空载电流从1.8A降到0.6A,STM32G431上的FOC电调开发,本质上是把每一微秒都花在刀刃上。HRTIM给精度,CORDIC给速度,双ADC给可靠——三把刀凑齐,电机才能真正"听话"。





