峰岹 FU6866 高频注入学习
前言在上一篇博客中对高频注入有了大致了解其实了解的也不是很深入感觉现在都没有映像。实操一下不会再回头看看。资料后续我会把博客中用到的资料放在百度网盘中。提取码: pmr3。硬件见网盘中的硬件设计我也是按里面的demo画的。后面有问题及时记录软件直接看代码吧。1.1 初始化参考电压配置开P32和P35使能P35输出配置参考电压5V偏置电压2.5V使能输出。硬件过流保护配置P27位模拟模式P27是AMP0的输出口AMP0用于采样电流的电流放大设置单比较器模式。设置DAC输出电压范围为半电压转换模式设置DAC1_DR对应比较值使能DAC。配置15mV迟滞电压过流保护关闭MOE24clock滤波使能CMP3。CMP3中断上升沿中断优先级别3。整体和FU6532相同。硬件初始化GPIO:GP07、GP43设置为输出拉高具体干嘛还不知道。ADC根据引脚来看见上图GP20AD0、IU电流放大器输出GP23AD1、IV电流放大器输出GP24AD2、DC电压采集芯片内部FOC工作需要DC电压值不能只用于过欠压保护。GP25AD3、TmosMOS管的温度检测GP26AD11、DAC模拟量结果输出打开P26可以看打不打开都会送入CMP3M参与硬件过流保护。GP27AD4、Ibus硬件过流保护口GP34AD7、模拟量调速输入口。GP46AD15、未知采样周期为3数据左对齐中断不使能FOC触发中断由FOC模块控制使能ADC。AMPP16、P17、P20AMP1、U相电流放大组。P21、P22、P23AMP2、V相电流放大组。DAC1输出到GP23需要使能GP23方向为输出规格书上AMP3中没看到必须设置GP23为输入先按实例代码来。P31、P30、P27AMP0、Ibus电流放大组。使能AMP0\1\2设置放大倍数放大倍数根据自己电机最大限流来算见FU6532中的描述。driver载波频率ARR 24MMCU CLOCK* 2 / 24KPWM CLOCK死区死区时间DTR1*41.67nsUVW上下桥互补模式高电平有效上下桥反向失能。DRV中断向下计数中断比较中断值设置为((2000 3) (2000 4)) 325优先级为2每个计数周期产生中断工作在BLDC模式MOE的输入来源是FOC模块VBB_DIS比较值预装载计数器不使能DRV使能输出。system2ms一次中断使能系统时钟中断MDU低通滤波器初始化软件初始化主要用到的几个结构体mcFaultDect故障mcProtectTime保护触发次数mcCurVarible软件过流McStaSet电机模式选择mcFocCtrlFOC参数IsRefMax启动电流参数AdcSampleValueADC采样值mcUbusLpfDC滤波mcVspLpf模拟量控制滤波应该是NTCtempLpf热敏电阻滤波mcCurOffset偏置电压全局中断EA 1_nop_();1.2 偏置电压采样对UVIbus三路采样偏置电压1.3 MC_ControlmcReadyMotor_Ready();里面上电初始化都做过。偏置校验准确收到启动命令未欠压进入mcInit。mcInitVariablesPreInitmcFaultDect故障清零mcSpeedRamp速度mcFRState转向信息LPF温度、速度、电流、速度环、相电流mcFocCtrl_1速度、高频滤波值20启动电流初始位置采样点高频注入采样点估算器采样点。Ud_2Us_2HighFrequencyInjectionInit先看HighFrequencyInjectionVarible_1typedef struct { int16 HighFrequencyInjectionTargetDeltaUD; ΔUd高频注入到d轴上的电压幅值目标 int16 HighFrequencyInjectionTargetDeltaUDTemp; int16 HighFrequencyInjectionTargetDeltaUDIncAndDec; 注入电压增减步长HFI启动时慢慢把注入电压拉上去退出时慢慢减下来 uint8 HighFrequencyInjectionDeltaUDClearFlag; ΔUd清零标记位 uint8 FocModeToHighFrequencyInjectionDelay; 模式切换延时 uint8 HighFrequencyInjectionThetaCalEnableDelay; 角度计算使能延时HFI刚启动的几个周期信号不干净结果不准确 int16 HighFrequencyInjectionPllKp_1; 锁相环参数 int16 HighFrequencyInjectionPllKi_1; int16 HighFrequencyInjectionPllKpKiSpeed_1; 切换的速度阈值 int16 HighFrequencyInjectionPllKp_2; int16 HighFrequencyInjectionPllKi_2; int16 HighFrequencyInjectionPllKpKiSpeed_2; int16 HighFrequencyInjectionPllKp; int16 HighFrequencyInjectionPllKi; int16 HighFrequencyInjectionPllKp_Run; int16 HighFrequencyInjectionPllKi_Run; uint8 HighFrequencyInjectionCycle; 注入轮次 int16 HighFrequencyInjectionSpeed1; int16 HighFrequencyInjectionSpeed2; int16 HighFrequencyInjectionSpeed3; int16 HighFrequencyInjectionSpeed4; int16 HighFrequencyInjectionIdRef; int16 HighFrequencyInjectionIdRefTemp; int16 HighFrequencyInjectionIdRef1; int16 HighFrequencyInjectionIdRef2; uint8 HighFrequencyInjectionEomeFilter0; 角速度滤波 uint8 HighFrequencyInjectionEomeFilter1; uint8 HighFrequencyInjectionStartFlag; 启动标志 int16 HighFrequencyInjectionMult3Temp; 乘法零时变量 int16 HighFrequencyInjectionDiv0Temp; 除法临时变量 uint8 HighFrequencyInjectionStatus; 高频注入状态 } HighFrequencyInjectionVarible_1;再看HighFrequencyInjectionVarible_2typedef struct { int16 HighFrequencyInjectionThetaCompIQMin; 补偿最小 Iq 点。 // int16 HighFrequencyInjectionThetaCompIQMid1; // int16 HighFrequencyInjectionThetaCompIQMid2; int16 HighFrequencyInjectionThetaCompIQMid; 补偿中间 Iq 点。 int16 HighFrequencyInjectionThetaCompIQMax; 补偿最大 Iq 点。 int16 HighFrequencyInjectionThetaCompAngleMin; 在最小 Iq 时对应的角度补偿值。 // int16 HighFrequencyInjectionThetaCompAngleMid1; // int16 HighFrequencyInjectionThetaCompAngleMid2; int16 HighFrequencyInjectionThetaCompAngleMid; 在中间 Iq 时对应的角度补偿值。 int16 HighFrequencyInjectionThetaCompIQToAngleK1; 第一段斜率从 IQMin 到 IQMidIq 变化 1 个单位对应角度补偿变化多少 int16 HighFrequencyInjectionThetaCompIQToAngleK2; 第二段斜率从 IQMid 到 IQMax // int16 HighFrequencyInjectionThetaCompIQToAngleK3; int16 HighFrequencyInjectionThetaComp; 当前最终角度补偿值 int16 HighFrequencyInjectionThetaCompTemp; int8 HighFrequencyInjectionThetaCompTempIncAndDec; 角度补偿增减步长 uint16 HighFrequencyInjectionUinjAndDcbusK; // ps: 注入电压与母线电压关系系数HFI 注入电压实际不是绝对恒定的会受Udc 变化、PWM 占空比、调制度 影响。 // 所以通常会有一个系数做类似Uinj_actual Uinj_cmd * K(Udc) 或者 Uinj Udc * 某比例系数就是这个参数。 } HighFrequencyInjectionVarible_2;接着是HighFrequencyInjectionVarible_3typedef struct { int16 HighFrequencyInjectionOmegaAbs; 前速度绝对值 int16 HighFrequencyInjectionStartUQ; HFI 启动时的 Uq 初值。 int16 HighFrequencyInjectionToFocSpeed; 从 HFI 模式切到普通 FOC 模式的速度阈值。 int16 FocToHighFrequencyInjectionSpeed; 从普通 FOC 退回 HFI 模式的速度阈值。 uint8 FocModeToHighFrequencyInjectionModeCount; 从 FOC 切到 HFI 的计数器连续满足条件多少次才允许切换防止速度在门限附近抖动时来回切换 uint8 HighFrequencyInjectionModeToFocModeCount; 从 HFI 切到 FOC 的计数器。 uint8 HighFrequencyInjectionModeToFocModeFirstFlag; 从 HFI 切 FOC 的首次进入标志。 uint8 FocModeToHighFrequencyInjectionModeFirstFlag; 从 FOC 切 HFI 的首次进入标志。 int16 HighFrequencyInjectionPhaseCurrentValueLpf; 相电流低通滤波后的值。 uint8 HighFrequencyToLowFrequencyFlag; 高频切低频标志。 uint8 LowFrequencyToHighFrequencyFlag; int16 HighFrequencyToLowFrequencySpeed; 从高频切到低频的速度阈值。 int16 LowFrequencyToHighFrequencySpeed; uint8 HighFrequencyToLowFrequencyFilter; 高频切低频时用的滤波计数。 uint8 LowFrequencyToHighFrequencyFilter; uint16 HighFrequencyPosiCheckTime; 位置检查持续时间 uint8 HighFrequencyInjectionPosiCheckNSCheckStartFlag; 位置检查启动标志 uint8 HighFrequencyInjectionPosiCheckState; 位置检查状态机状态 int16 HighFrequencyPosiCheckTheta; 位置检查时使用或记录的角度。 // “正负方向注入后电流变化量比较”用来判断磁极方向或者角度正确性。 int16 HighFrequencyPositiveDeltaId; 正向注入时 d 轴电流变化量。 int16 HighFrequencyNegativeDeltaId; 负向注入时 d 轴电流变化量。 uint8 HighFrequencyPositiveDeltaIdCnt; 正向 DeltaId 的计数器累加多次采样连续统计若干次正向响应 uint8 HighFrequencyNegativeDeltaIdCnt; 负向 DeltaId int16 HighFrequencyInjectionBaseUDValue; 基础注入 Ud 值 uint16 HighFrequencyInjectionBaseUDPulseWidthCnt; 基础注入 Ud 的脉宽计数。 // 顺逆风处理 uint8 HighFrequencyInjectionTailwindFlag; uint8 HighFrequencyInjectionUpwindFlag; int16 HighFrequencyInjectionMult1TempH; uint16 HighFrequencyInjectionDiv1Temp; } HighFrequencyInjectionVarible_3;HighFrequencyInjectionVarible_1、2在做1控制高频注入电压大小2切换 HFI 阶段 / 启停状态3用 PLL 跟踪转子角度4按速度切换不同参数5按 Iq 做角度补偿6保存一些中间变量和状态量HighFrequencyInjectionVarible_3在做1HFI 和普通 FOC 之间何时切换2高频注入和低频注入之间何时切换3注入法得到的位置是否可信要不要做位置检查4启动时是否在顺风/逆风状态函数中的赋值HighFrequencyInjection_1部分1HighFrequencyInjectionTargetDeltaUD UinjPosiCheck_Q15#define UinjPosiCheck (0.3) #define UinjPosiCheck_Q15 _Q15(UinjPosiCheck)HFI 注入电压目标幅值初值设为 0.3 pu。控制 HFI 注入强度通常是位置检查时的注入脉冲幅值、HFI 初始运行时的 d 轴注入电压幅值。偏“比较有力”的注入。优点位置检测更明显信噪比更高缺点电流纹波、噪声、啸叫更明显发热也更大。如果启动时有这些现象电机明显抖动、啸叫很大、电流尖峰偏大。第一怀疑对象就是这个 0.3 pu 偏大。2PLL 切换速度点#define MOTOR_SPEED_BASE (8000.0) #define HighFrequencyInjectionPllKpKiSpeed_1_Q15 _Q15(100.0 / MOTOR_SPEED_BASE) #define HighFrequencyInjectionPllKpKiSpeed_2_Q15 _Q15(120.0 / MOTOR_SPEED_BASE)PllKpKiSpeed_1 0.0125 pu 410PllKpKiSpeed_2 0.015 pu 492PLL 参数切换的速度阈值。当速度超过 100基速单位时可能切一组参数超过 120 时再切另一组参数。3PLL 两组参数#define HighFrequencyInjection_OBSW_KP_GAIN_1 (1900) #define HighFrequencyInjection_OBSW_KI_GAIN_1 (90) #define HighFrequencyInjection_OBSW_KP_GAIN_2 (1900) #define HighFrequencyInjection_OBSW_KI_GAIN_2 (90)两组 PLL 参数现在一样。如果遇到某一速度段锁角快但抖另一速度段锁角慢且拖沓那就把这两组参数分开调。4速度阈值 1~4#define HighFrequencyInjectionSpeed1_Q15 _Q15(-50.0 / MOTOR_SPEED_BASE) #define HighFrequencyInjectionSpeed2_Q15 _Q15(-40.0 / MOTOR_SPEED_BASE) #define HighFrequencyInjectionSpeed3_Q15 _Q15(40.0 / MOTOR_SPEED_BASE) #define HighFrequencyInjectionSpeed4_Q15 _Q15(50.0 / MOTOR_SPEED_BASE)这里可能是低速零速的一些判断后面再看。5HighFrequencyInjectionIdRef1 / IdRef2#define HighFrequencyInjectionIdRef1_Q15 I_Value(0.0) #define HighFrequencyInjectionIdRef2_Q15 I_Value(0.0) // 必须为正用于降低D轴电感提高信噪比6HighFrequencyInjectionStartFlag 1HFI 启动使能标志置位。7HighFrequencyInjectionTargetDeltaUDIncAndDec 200注入幅值变化的步进值控制 DeltaUD 递增/递减的斜率。可能是Q15的格式200 / 32768 ≈ 0.0061 pu这样到目标值是 0.3 pu那大概需要0.3 / 0.0061 ≈ 49 次控制周期。HighFrequencyInjection_2部分大部分赋值为0暂时不做分析。1HighFrequencyInjectionThetaCompTempIncAndDec 30补偿角的渐变步进。意思通常不是立刻把补偿角跳到目标值而是每个控制周期按步长 30 慢慢逼近。2HighFrequencyInjection_2.HighFrequencyInjectionUinjAndDcbusK HighFrequencyInjectionUinjAndDcbusK_Run;#define Uinj (0.2) #define MotorRatedVoltage (12.0) #define HighFrequencyInjectionUinjAndDcbusK_Run _Q15(Uinj *MotorRatedVoltage / HW_BOARD_VOLT_MAX / 2.0) #define RV1 (2000.0) #define RV2 (0.0) #define RV3 (470.0) #define RV ((RV1 RV2 RV3) / RV3)UinjAndDcbusK大概是“目标注入电压”和“母线电压量程”之间的换算系数”。后面运行时可能会做类似Uinj_cmd Dcbus_meas * K DeltaUd f(Dcbus, K)这样母线电压变化时注入强度能保持相对一致。HighFrequencyInjection_3部分1HighFrequencyInjectionBaseUDValue Ubase_Q15#define Ubase (0.3) #define Ubase_Q15 _Q15(Ubase)基础注入电压幅值也就是 HFI 里作为“底座”的 Ud 注入量。作用高频注入的基础幅值、位置检查时的基础脉冲幅值、高频/低频注入切换时的默认注入幅值注这套代码里很可能有三层幅值概念BaseUDValue 0.3基础注入底值TargetDeltaUD 0.3目标增量/位置检查注入值UinjAndDcbusK运行中随母线动态换算的注入系数2HighFrequencyToLowFrequencyFlag 1允许从高频注入切到低频注入3HFI 和普通 FOC 的切换门限InjectionToFocSpeed 400FocSpeedToInjection 3004高频注入和低频注入之间的切换门限HighFrequencyToLow 600LowFrequencyToHigh 5005从设计意图上看这套逻辑大概是a. 很低速时用高频注入b. 速度再高一点切到低频注入c. 再高一点切到普通 FOC这是一个典型的“多阶段无感低速启动”思路。不过这里参数似乎有问题之后再看。速度环、电流环PID设置速度环参数设置SpeedLimitControl.SpeedLimitLoopOutputValue SpeedLimitOutMax; //速度环限幅PID参数初始化电流环参数设置IbusCurrentLimitControl.IbusCurrentLimitValue EnterIbusCurrentLimitValue; // 电流环限幅PID参数初始化。mcCharge到这里可以先开IPMtest切记不要接电机看下UVW上下桥输出对不对正确后确定硬件没有问题再关闭IPMtest进入下一步mcPosiCheck。黄色为UH、蓝色为UL、紫色为U相三相的输出都是这个样子。这里也可以看下设计的死区是否符合要求这里是错误示范6866有预驱UH的实际波形参考要选择U相输出口UL的实际波形要选择地这里大致看下就行差不多0.8us和我们设置的一样。切记不要接电机。mcPosiCheck这里面分两步走case 0: { if(McStaSet.SetFlag.PosiCheckSetOneFlag0) { McStaSet.SetFlag.PosiCheckSetOneFlag1; HighFrequencyInjection_1.HighFrequencyInjectionTargetDeltaUDTemp Divider_2(HighFrequencyInjectionUinjAndDcbusK_mcPosiCheck_1 , ADC2_DR); HighFrequencyInjection_1.HighFrequencyInjectionTargetDeltaUD HighFrequencyInjection_1.HighFrequencyInjectionTargetDeltaUDTemp; HighFrequencyInjection_1.HighFrequencyInjectionThetaCalEnableDelay 10;//先注入再10个载波周期再开始使用高频电流计算角度 FOC_Init(); Hfi_Init(); ClrBit(FOC_CR1 ,ANGM);//不需要锁相环 SetBit(DRV_CR , DRVEN); DRV_CMR | 0x0abF; MOE 1; HighFrequencyInjection_3.HighFrequencyPosiCheckTime 150; }else { if(HighFrequencyInjection_3.HighFrequencyPosiCheckTime 0) { SetBit(FOC_CR2 , UDD);//D轴电流不闭环 HighFrequencyInjection_3.HighFrequencyInjectionBaseUDValue Divider_2(HighFrequencyInjectionUinjAndDcbusK_mcPosiCheck_2 , ADC2_DR); HighFrequencyInjection_3.HighFrequencyInjectionPosiCheckState 1; } } } break;HighFrequencyInjectionTargetDeltaUD按母线换算后的检测注入电压。延迟10再用高频电流计算角度FOC初始化Hfi_Init无角度来源使能DRV第一阶段等待150D轴电流不闭环HighFrequencyInjectionBaseUDValuecase 2: { HighFrequencyPositiveDeltaIdbufSum HighFrequencyPositiveDeltaIdbuf[0] - HighFrequencyPositiveDeltaIdbuf[1] HighFrequencyPositiveDeltaIdbuf[2] - HighFrequencyPositiveDeltaIdbuf[3] HighFrequencyPositiveDeltaIdbuf[4]; HighFrequencyNegativeDeltaIdbufSum HighFrequencyNegativeDeltaIdbuf[0] - HighFrequencyNegativeDeltaIdbuf[1] HighFrequencyNegativeDeltaIdbuf[2] - HighFrequencyNegativeDeltaIdbuf[3] HighFrequencyNegativeDeltaIdbuf[4]; if(HighFrequencyPositiveDeltaIdbufSum HighFrequencyNegativeDeltaIdbufSum) { FOC__THETA HighFrequencyInjection_3.HighFrequencyPosiCheckTheta 32767; } FOC__ETHETA FOC__THETA; SetBit(FOC_CR1 ,ANGM); HighFrequencyInjection_1.HighFrequencyInjectionThetaCalEnableDelay 36;//先注入再10个载波周期再开始使用高频电流计算角度10 FOC_TRGDLY mcFocCtrl_1.FocTrgdly1;//初始位置检测电压占空比大采样点不能太后检测完后恢复采样点 mcState mcStart; } break;这里采用加减分离法感兴趣可以看我的[高频注入](https://blog.csdn.net/qq_51299107/article/details/159432033?spm1011.2124.3001.6209)里面提到。HighFrequencyPositiveDeltaIdbufSum HighFrequencyPositiveDeltaIdbuf[0] - HighFrequencyPositiveDeltaIdbuf[1] HighFrequencyPositiveDeltaIdbuf[2] - HighFrequencyPositiveDeltaIdbuf[3] HighFrequencyPositiveDeltaIdbuf[4]; HighFrequencyNegativeDeltaIdbufSum HighFrequencyNegativeDeltaIdbuf[0] - HighFrequencyNegativeDeltaIdbuf[1] HighFrequencyNegativeDeltaIdbuf[2] - HighFrequencyNegativeDeltaIdbuf[3] HighFrequencyNegativeDeltaIdbuf[4];把与注入极性“同相”的响应被保留下来与注入无关的慢变化量被抵消掉一部分。再用正向测试的结果与反向测试结果比较若正向弱于反向说明极性是反的角度转180°。角度赋值设置角度来源于估算器注入等待采样点设置进入mcStart。mcStart开D轴电流闭环赋值Pll的Kp、Ki先不管顺逆风直接赋值启动电流给IqRef。进入mcRunmcRun在这里看下两个中断DRV_ISR和SYStick_INTDRV_ISR主要做HfiController低速更新角度。SYStick_INTadc采样NTC、DC、速度、反电动势VSP模拟量调速一次中断根据当前速度判断用SMO还是HFI一次跑外环。故障检测小结好像没啥需要改的调试试试就了解下HFI的运行过程就行后续看看ST的开源代码。1.4 调试IPMState一定要改成NormalRun否则烧MOS。电机参数电机是X2820 KV570P 7Rs0.032ΩLq 9.6 uHLd 6.2 uHKeVpp 2.44 VKeT 12.6 msKeVpp 、KeT 测量就是用示波器一端参考接V一端测量接U匀速转动电机快速转一下找个稳定区间取值就行。Lq/Ld 1.5做HFI才有很好效果。还有其他的采样电阻、DC分压电阻根据实际情况设置初次调试按前面配置后上电就工作但是进入速度环之后有问题这里图中是初始位置检测的一个波形。后面速度环有问题加负载电机会瞬间加速注意直流源电流确保板子安全就行。试了下2000转启动结束后直接硬件过流了。调了#define SOUTMAX I_Value(20.0) /// (A) 外环电流最大限幅值其他没动200转玩了一会儿。手动加负载电机会有停顿停顿但是不死机、应该是在加PWM脉宽。电机24V注入比例调整了一下。#define Ubase (0.1) #define Ubase_Q15 _Q15(Ubase) #define Uinj (0.12) // 0.325 #define Uinj_Q15 _Q15(Uinj) #define UinjPosiCheck (0.12) #define UinjPosiCheck_Q15 _Q15(UinjPosiCheck) #define MotorRatedVoltage (24.0)其他的我再调试一下暂时没啥头绪。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2502776.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!