峰岹 FOC寄存器 结合代码分析初始化配置
峰岹FOC寄存器简看
前言
峰岹FOC寄存器介绍,详细应用见这篇。文章中图片为峰岹FU6522-72系列规格书中截图,如有侵权请联系删除。
FOC寄存器
1. FOC_CR0

ClrBit(FOC_CR0, MERRS1);
SetBit(FOC_CR0, MERRS0);
#if (EstimateAlgorithm == AO) //自适应角度估算器
{
ClrBit(FOC_CR2, ESEL);
FOC_KSLIDE = OBS_KSLIDE;
FOC_EKLPFMIN = OBS_EA_KS;
SetBit(FOC_CR0, ESCMS);
SetBit(FOC_CR3, MFP_EN);
}
初始化部分两个部分用到了FOC_CR0,使能FOC部分配置了滑膜算法的最大误差0.25;角度输出模式为推荐模式(暂时不知道是啥)。
2. FOC_CR1

FOC_CR1 = 0;
SetBit(FOC_CR1, SVPWMEN);
/* 过调制 */
#if (OverModulation == Enable)
{
SetBit(FOC_CR1, OVMDL); // 过调制
}
#endif //end OverModulation
/* 单电阻采样; 需要最小采样窗,FOC_TRGDLY为0,七段式SVPWM方式 */
#if (Shunt_Resistor_Mode == Single_Resistor)
{
SetReg(FOC_CR1, CSM0 | CSM1, 0x00);
FOC_TRGDLY = (int8)(SampleDLYTime); // 采样时刻在中点,一般考虑开关噪声影响,会设置延迟;
// 如:0x0c表示延迟12个clock,提前用反码形式,如0x84表示提前12个clock。
ClrBit(FOC_CR2, F5SEG); // 7段式,单电阻仅支持7段式
fault.TempTSminValue = PWM_TS_LOAD;
if (fault.TempTSminValue < 1023)
{
FOC_TSMIN = fault.TempTSminValue;
FOC_CR3 |= fault.TempTSminValue >> 8;
}
else
{
FOC_TSMIN = 0xFF;
FOC_CR3 |= 0x03;
} // 如:0x0c表示延迟12个clock,提前用反码形式,如0x84表示提前12个clock。
ClrBit(FOC_CR2, F5SEG); // 7段式,单电阻仅支持7段式
}
#endif
先是对FOC_CR1清零;配置SVPWM模块使能;配置单电阻模式
3. FOC_CR2


FOC_CR2 = 0;
#if (EstimateAlgorithm == AO)
{
ClrBit(FOC_CR2, ESEL);
FOC_KSLIDE = OBS_KSLIDE;
FOC_EKLPFMIN = OBS_EA_KS;
SetBit(FOC_CR0, ESCMS);
SetBit(FOC_CR3, MFP_EN);
}
#if (Shunt_Resistor_Mode == Single_Resistor)
{
SetReg(FOC_CR1, CSM0 | CSM1, 0x00);
FOC_TRGDLY = (int8)(SampleDLYTime); // 采样时刻在中点,一般考虑开关噪声影响,会设置延迟;
// 如:0x0c表示延迟12个clock,提前用反码形式,如0x84表示提前12个clock。
ClrBit(FOC_CR2, F5SEG); // 7段式,单电阻仅支持7段式
fault.TempTSminValue = PWM_TS_LOAD;
if (fault.TempTSminValue < 1023)
{
FOC_TSMIN = fault.TempTSminValue;
FOC_CR3 |= fault.TempTSminValue >> 8;
}
else
{
FOC_TSMIN = 0xFF;
FOC_CR3 |= 0x03;
} // 如:0x0c表示延迟12个clock,提前用反码形式,如0x84表示提前12个clock。
ClrBit(FOC_CR2, F5SEG); // 7段式,单电阻仅支持7段式
}
#endif
对FOC_CR2清零;配置SMO(滑膜观测器);配置SVPWM模式为7段式。
4. FOC_CR3和FOC_TSMIN


#if (EstimateAlgorithm == AO)
{
ClrBit(FOC_CR2, ESEL);
FOC_KSLIDE = OBS_KSLIDE;
FOC_EKLPFMIN = OBS_EA_KS;
SetBit(FOC_CR0, ESCMS);
SetBit(FOC_CR3, MFP_EN);
}
/* 单电阻采样; 需要最小采样窗,FOC_TRGDLY为0,七段式SVPWM方式 */
#if (Shunt_Resistor_Mode == Single_Resistor)
{
SetReg(FOC_CR1, CSM0 | CSM1, 0x00);
FOC_TRGDLY = (int8)(SampleDLYTime); // 采样时刻在中点,一般考虑开关噪声影响,会设置延迟;
// 如:0x0c表示延迟12个clock,提前用反码形式,如0x84表示提前12个clock。
ClrBit(FOC_CR2, F5SEG); // 7段式,单电阻仅支持7段式
fault.TempTSminValue = PWM_TS_LOAD;
if (fault.TempTSminValue < 1023)
{
FOC_TSMIN = fault.TempTSminValue;
FOC_CR3 |= fault.TempTSminValue >> 8;
}
else
{
FOC_TSMIN = 0xFF;
FOC_CR3 |= 0x03;
} // 如:0x0c表示延迟12个clock,提前用反码形式,如0x84表示提前12个clock。
ClrBit(FOC_CR2, F5SEG); // 7段式,单电阻仅支持7段式
}
自适应观测器使能;电流采样最小窗口 。
这里主要还是配置一个电流采样最小窗口PWM_TS_LOAD
#define PWM_CYCLE (1000.0 / PWM_FREQUENCY)
#define MIN_WIND_TIME (PWM_DEADTIME + 0.9)
#define PWM_TS_LOAD (uint16)(_Q16 / PWM_CYCLE * MIN_WIND_TIME / 16)
(采样时间us+死区时间us)/采样周期us*4096;
这里的为什么是 4096(即 2¹²)
原因是芯片内部用**12位定点数(Q0.12格式)**来表示一个 PWM 周期:
| 项目 | 含义 |
|---|---|
| PWM周期 | 被归一化为 1.0000(满量程) |
| 内部计数范围 | 0 ~ 4095 |
| 分辨率 | 1 / 4096 ≈ 0.000244 ≈ 0.0244% |
这样,无论 PWM 周期是多少微秒,都能以 12位定点的方式表达出相对时间比例。
例如:
- PWM周期 = 62.5 μs
- 采样窗口 + 死区 = 2 μs → 占周期比例 = 2 / 62.5 = 0.032
- 转成寄存器值 = 0.032 × 4096 ≈ 131
这就是手册例子里的那一行:(1 + 1)/62.5 * 4096 = 131
当然这是手册里的公式,代码中写的
PWM_TS_LOAD = _Q16 / PWM_CYCLE * MIN_WIND_TIME / 16
可以理解成:
P W M _ T S _ L O A D = M I N _ W I N D _ T I M E P W M _ C Y C L E × 2 16 16 PWM\_TS\_LOAD = \frac{MIN\_WIND\_TIME}{PWM\_CYCLE} \times \frac{2^{16}}{16} PWM_TS_LOAD=PWM_CYCLEMIN_WIND_TIME×16216
也就是:
P W M _ T S _ L O A D = M I N _ W I N D _ T I M E P W M _ C Y C L E × 4096 PWM\_TS\_LOAD = \frac{MIN\_WIND\_TIME}{PWM\_CYCLE} \times 4096 PWM_TS_LOAD=PWM_CYCLEMIN_WIND_TIME×4096
——这正是前面手册里那条:
F O C _ T S M I N = T w i n d o w + T d e a d T P W M × 4096 FOC\_TSMIN = \frac{T_{window}+T_{dead}}{T_{PWM}} \times 4096 FOC_TSMIN=TPWMTwindow+Tdead×4096
5. FOC_TGLI

这个寄存器是用来设置防止输出的PWM过小,导致预驱没有反应;MOS没有完全导通;引起采样误差和电流畸变。确保PWM输出的有效性。
6. FOC_TRGDLY

设置电流采样点的提前和延后的;前面DRV配置了PWM的中心点进入中断,这里设置adc采样电流是否需要延迟或者提前。
7. FOC_CSO

设置电流采样的偏置,前面文章中提到会在进行电机控制前进行对母线电压和电流偏置进行1000次采样。
8. FOC__RTHESTEP、FOC_RTHEACC、FOC_RTHECNT
爬坡启动的初始加速度、爬坡速度、爬坡次数上限,demo中用的Omega启动,暂时不看爬坡
9. FOC__EOMELPF
低通滤波后的估算器估算速度
10. FOC__THETA、FOC_THECOR、FOC_THECOMP、FOC__ETHETA
这几个都有写道输出格式与FOC__THETA一致,就一起看了。





这里都是和FOC输出的角度有关,暂时还不知道后续会用那个角度进行计算,先保留吧。
FOC__THETA = 0;
FOC_THECOR = 0x04;
FOC_THECOMP = 0;
FOC_THECOR就是开环角度到闭环角度的一个平滑过渡。
FOC_THECOMP:在实际电机控制中,估算器得到的角度 FOC_ETHETA 与电机实际磁场位置 之间通常会有一个固定偏差;FOC_THECOMP允许用户人为设置一个固定的角度补偿值把估算角度往前(或往后)旋转一点。
FOC_ETHETA 就是估算器的角度输出。
11. FOC相关参数
11.1 参数寄存器
- FOC__EMF:估算器估算的反电动势,等于FOC__EALP的平方加FOC__EBETA的平方开根号
- FOC_DMAX:d轴PI控制器的输出最大值
- FOC__OMEEST:FOC估算器计算速度值
- FOC_DMIN:d轴PI控制器的输出最小值
- FOC__ATAN_THETA:ATAN模式下计算角度,由FOC__EALP/FOC__EBET直接计算得出
- FOC_QMAX:q轴PI控制器的输出最大值
- FOC_QMIN:q轴PI控制器的输出最小值
- FOC__UD:d轴PI控制器算出的d轴电压
- FOC__UQ:q轴PI控制器算出的q轴电压
- FOC__ID:采样电流经过坐标变换得到的d轴电流
- FOC__IQ:采样电流经过坐标变换得到的q轴电流
- FOC__IBET:采样电流经过坐标变换得到的β轴电流
- FOC_IQ_LPFK:FOC_IQ低通滤波系数,默认值为0xFF
- FOC_ID_LPFK:FOC_ID低通滤波系数,默认值为0xFF
- FOC__VBET:FOC模块输出β轴电压
- FOC_UDCPS:d轴电压补偿值,d轴PI计算的结果FOC__UD与FOC_UDCPS相加后送到下一模块
- FOC_UQCPS:q轴的电压补偿值,q轴PI计算的结果FOC__UQ与FOC_UQCPS相加后送到下一模块
- FOC__VALP:FOC模块输出α轴电压
- FOC_FLUX:电机磁通量
- FOC__IC:采样获得的C相相电流
- FOC_LQ:Q轴电感值
- FOC__IB:采样获得的B相相电流
- FOC_LD:D轴电感值
- FOC__IA:采样获得的A相相电流
- FOC__EALP:估算器估算的α轴反电动势
- FOC__EBET:估算器估算的β轴反电动势
- FOC__EOME:估算器输出速度
- FOC__UQEX:Q轴PI控制器溢出值,公式: FOC__UQ - FOC_QMAX,使用FOC__UQEX可实现弱磁控制
- FOC_KFG:FG的计算系数
- FOC__POW:电机功率
- FOC_EOMEKLPF:估算器滤波估算速度FOC_EOMELPF的低通滤波系数,LPF的计算频率为载波周期,范围[1,255]对应滤波系数范围[1/32768,255/32768]。
- FOC__IAMAX:A相电流最大值
- FOC__IBMAX:B相电流最大值
- FOC__ICMAX:C相电流最大值
- FOC_EFREQMAX:omega最大值。
- FOC_DKP:D轴PI的比例参数
- FOC_EKP:估算器的角度估算PI控制器的Kp系数
- FOC_EKI:估算器的角度估算PI控制器的KI系数
- FOC_KSLIDE:FOC_CR2[ESEL] = 0: 为SMO的增益系数,Q15格式
FOC_CR2[ESEL] = 1: 为PLL的PI控制器的KP系数,Q12格式 取值范围[0,32767],最高位恒为0 - FOC_EKLPFMIN:FOC_CR2[ESEL] = 0: 为SMO的反电动势低通滤波系数的最小值。当估算器算出的低通滤波系数小于该值时,强制等于最小值,Q15格式。
FOC_CR2[ESEL] = 1: PLL的PI控制器的KI系数,Q15格式 取值范围[0,32767],最高位恒为0 - FOC_DKI:D轴PI的积分参数
- FOC_OMEKLPF:估算器估算速度的低通滤波系数
- FOC_FBASE:估算器的频率基准设定值, F O C _ F B A S E = f b a s e ∗ T s ∗ 32768 FOC\_FBASE = fbase*Ts*32768 FOC_FBASE=fbase∗Ts∗32768
- FOC_EFREQACC:估算器强制角度模式的速度增量
- FOC_EFREQMIN:估算角度切换阈值
- FOC_EFREQHOLD:估算器强制速度最大值
- FOC_EK3:估算器估算电流的第三个系数
- FOC_EK4:估算器估算电流的第四个系数
- FOC_EK1:估算器估算电流的第一个系数
- FOC_EK2:估算器估算电流的第二个系数
- FOC_IDREF:用户给定的d轴电流指令值
- FOC_IQREF:用户给定的q轴电流指令值
- FOC_QKP:q轴PI控制器的KP系数
- FOC_QKI:q轴PI控制器的KI系数
- FOC__UDCFLT:滤波后的母线电压
我的天呐,看上面这些寄存器的时候一定要对FOC有一定了解,不然就这么看是会心生惧意的,哈哈哈。
下面结合程序看一下设置了些什么。
FOC_EOMEKLPF = _Q8(1.0); //滤波系数 255
FOC_IDREF = 0; // 清零 Id
FOC_IQREF = 0; // 清零 Iq
/* 电流环参数配置 */
FOC_DMAX = DOUTMAX;
FOC_DMIN = DOUTMIN;
FOC_QMAX = QOUTMAX;
FOC_QMIN = QOUTMIN;
/* 位置估算参数配置 */
FOC_EK1 = OBS_K1T;
FOC_EK2 = OBS_K2T;
FOC_EK3 = OBS_K3T;
FOC_EK4 = OBS_K4T;
/* -----AO/PLL/SMO ----- */
FOC_KSLIDE = OBS_KSLIDE; // SMO算法里的滑膜增益值
FOC_EKLPFMIN = OBS_EA_KS; // SMO的最小速度
FOC_FBASE = OBS_FBASE; // 由速度计算角度增量的系数
FOC_OMEKLPF = SPEED_KLPF; // 估算器内速度低通滤波系数
FOC_TGLI = PWM_TGLI_LOAD; // 死区配置
11.2 位置估算参数配置参数解释
都是用于配置 电机反电动势观测器(Back-EMF Observer)或滑模观测器(SMO) 的内部系数。
11.2.1 四个系数的物理意义(简化理解)
| 参数 | 名称 | 含义 | 数学近似含义 |
|---|---|---|---|
| FOC_EK1 | 估算电流的第1系数 | 电流反馈衰减因子 | 与电机电感L、采样周期Tp有关 |
| FOC_EK2 | 估算电流的第2系数 | 电压输入增益 | 与定子电阻Rs有关 |
| FOC_EK3 | 估算电流的第3系数 | 误差放大系数(观测增益) | 控制反电动势估算速度 |
| FOC_EK4 | 估算电流的第4系数 | 速度相关项修正系数 | 与Ld、Lq、ω有关 |
11.2.2 逐个解释代码里的宏定义
- OBS_K1T:电流衰减项
#define OBS_K1T _Q11((1.0*3.0/(125.0*1.0))*(LQ/TPWM_VALUE)*(HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE))
👉 代表观测器方程里 “电流变化与电感、电压比例” 的系数。
含义:
K 1 = L q T P W M × I b a s e U b a s e K1 = \frac{L_q}{T_{PWM}} \times \frac{I_{base}}{U_{base}} K1=TPWMLq×UbaseIbase
它控制电流估算的响应速度:
- 数值越大 → 观测电流响应越快;
- 数值太大 → 系统震荡;
- 数值太小 → 响应滞后。
_Q11() 表示使用 Q11 定点格式(即 1bit符号 + 11bit小数)。
- OBS_K2T:电阻项
#define OBS_K2T _Q11(0.8*RS*HW_BOARD_CURR_BASE/HW_BOARD_VOLTAGE_BASE)
表示定子电阻 Rs 对电流变化的衰减作用。
含义:
K 2 = R s × I b a s e U b a s e K2 = R_s \times \frac{I_{base}}{U_{base}} K2=Rs×UbaseIbase
0.8 是经验调整系数(略低于理论值,使系统更稳定)。
- OBS_K3T:滑模观测增益项**
#define OBS_K3T _Q8(2.35)
这个参数是 滑模观测器(SMO)的增益项。
用于反电动势的逼近算法,例如:
e ^ = K 3 ⋅ s a t ( i − i ^ ) \hat{e} = K3 \cdot sat(i - \hat{i}) e^=K3⋅sat(i−i^)
K3 决定了估算器对电流误差的反应强度:
- 太小 → 反应慢,角度滞后;
- 太大 → 抖动严重。
通常通过实验调出来,2.0~3.0 是常见值。_Q8 表示 Q8 定点数(8位小数)。
- OBS_K4T:转速相关修正项
#define OBS_K4T _Q15(((LD-LQ)*TPWM_VALUE*MAX_OMEG_RAD_SEC)/(LD+RS*TPWM_VALUE))
当 Ld ≠ Lq(IPM 永磁同步电机)时,
电机模型里存在交轴耦合项:
v d = R i d + L d d i d d t − ω L q i q v_d = R i_d + L_d \frac{di_d}{dt} - \omega L_q i_q vd=Rid+Lddtdid−ωLqiq
v q = R i q + L q d i q d t + ω ( L d i d + ψ f ) v_q = R i_q + L_q \frac{di_q}{dt} + \omega (L_d i_d + \psi_f) vq=Riq+Lqdtdiq+ω(Ldid+ψf)
K4 就是用来补偿这一项的。
含义:
补偿电感差异 (Ld-Lq) 与转速 ω 引起的耦合效应。
通常这项在表贴式电机(Ld≈Lq)可以为0,
在IPM电机(Ld<Lq)时要保留。
12 小结
滑膜观测器后面代码中再看吧,先大致了解一下FOC寄存器相关内容。
更多推荐



所有评论(0)