前言

峰岹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 参数寄存器

  1. FOC__EMF:估算器估算的反电动势,等于FOC__EALP的平方加FOC__EBETA的平方开根号
  2. FOC_DMAX:d轴PI控制器的输出最大值
  3. FOC__OMEEST:FOC估算器计算速度值
  4. FOC_DMIN:d轴PI控制器的输出最小值
  5. FOC__ATAN_THETA:ATAN模式下计算角度,由FOC__EALP/FOC__EBET直接计算得出
  6. FOC_QMAX:q轴PI控制器的输出最大值
  7. FOC_QMIN:q轴PI控制器的输出最小值
  8. FOC__UD:d轴PI控制器算出的d轴电压
  9. FOC__UQ:q轴PI控制器算出的q轴电压
  10. FOC__ID:采样电流经过坐标变换得到的d轴电流
  11. FOC__IQ:采样电流经过坐标变换得到的q轴电流
  12. FOC__IBET:采样电流经过坐标变换得到的β轴电流
  13. FOC_IQ_LPFK:FOC_IQ低通滤波系数,默认值为0xFF
  14. FOC_ID_LPFK:FOC_ID低通滤波系数,默认值为0xFF
  15. FOC__VBET:FOC模块输出β轴电压
  16. FOC_UDCPS:d轴电压补偿值,d轴PI计算的结果FOC__UD与FOC_UDCPS相加后送到下一模块
  17. FOC_UQCPS:q轴的电压补偿值,q轴PI计算的结果FOC__UQ与FOC_UQCPS相加后送到下一模块
  18. FOC__VALP:FOC模块输出α轴电压
  19. FOC_FLUX:电机磁通量
  20. FOC__IC:采样获得的C相相电流
  21. FOC_LQ:Q轴电感值
  22. FOC__IB:采样获得的B相相电流
  23. FOC_LD:D轴电感值
  24. FOC__IA:采样获得的A相相电流
  25. FOC__EALP:估算器估算的α轴反电动势
  26. FOC__EBET:估算器估算的β轴反电动势
  27. FOC__EOME:估算器输出速度
  28. FOC__UQEX:Q轴PI控制器溢出值,公式: FOC__UQ - FOC_QMAX,使用FOC__UQEX可实现弱磁控制
  29. FOC_KFG:FG的计算系数
  30. FOC__POW:电机功率
  31. FOC_EOMEKLPF:估算器滤波估算速度FOC_EOMELPF的低通滤波系数,LPF的计算频率为载波周期,范围[1,255]对应滤波系数范围[1/32768,255/32768]。
  32. FOC__IAMAX:A相电流最大值
  33. FOC__IBMAX:B相电流最大值
  34. FOC__ICMAX:C相电流最大值
  35. FOC_EFREQMAX:omega最大值。
  36. FOC_DKP:D轴PI的比例参数
  37. FOC_EKP:估算器的角度估算PI控制器的Kp系数
  38. FOC_EKI:估算器的角度估算PI控制器的KI系数
  39. FOC_KSLIDE:FOC_CR2[ESEL] = 0: 为SMO的增益系数,Q15格式
    FOC_CR2[ESEL] = 1: 为PLL的PI控制器的KP系数,Q12格式 取值范围[0,32767],最高位恒为0
  40. FOC_EKLPFMIN:FOC_CR2[ESEL] = 0: 为SMO的反电动势低通滤波系数的最小值。当估算器算出的低通滤波系数小于该值时,强制等于最小值,Q15格式。
    FOC_CR2[ESEL] = 1: PLL的PI控制器的KI系数,Q15格式 取值范围[0,32767],最高位恒为0
  41. FOC_DKI:D轴PI的积分参数
  42. FOC_OMEKLPF:估算器估算速度的低通滤波系数
  43. 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=fbaseTs32768
  44. FOC_EFREQACC:估算器强制角度模式的速度增量
  45. FOC_EFREQMIN:估算角度切换阈值
  46. FOC_EFREQHOLD:估算器强制速度最大值
  47. FOC_EK3:估算器估算电流的第三个系数
  48. FOC_EK4:估算器估算电流的第四个系数
  49. FOC_EK1:估算器估算电流的第一个系数
  50. FOC_EK2:估算器估算电流的第二个系数
  51. FOC_IDREF:用户给定的d轴电流指令值
  52. FOC_IQREF:用户给定的q轴电流指令值
  53. FOC_QKP:q轴PI控制器的KP系数
  54. FOC_QKI:q轴PI控制器的KI系数
  55. 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 逐个解释代码里的宏定义
  1. 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小数)。


  1. 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 是经验调整系数(略低于理论值,使系统更稳定)。

  1. 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^=K3sat(ii^)

K3 决定了估算器对电流误差的反应强度:

  • 太小 → 反应慢,角度滞后;
  • 太大 → 抖动严重。

通常通过实验调出来,2.0~3.0 是常见值。
_Q8 表示 Q8 定点数(8位小数)。


  1. 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寄存器相关内容。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐