在线时间178 小时
UID3096266
注册时间2015-1-27
NXP金币0
TA的每日心情 | 郁闷 2021-3-10 19:44 |
---|
签到天数: 7 天 [LV.3]偶尔看看II
金牌会员
- 积分
- 2018
- 最后登录
- 2023-12-25
|
速度评估和控制
下图中的速度控制器在每隔1 ms设置的定时器中断中执行。首先,通过最后 6 个过零点周期计算得出实际速度,并采用折算格式,将其作为实际速度存储。过零点周期的质量通过函数(StallCheck())评估,如果超出限值,错误将会被存储。在闭环模式下,将会计算实际速度与所需速度之间的速度误差。这种计算得出的速度误差将代入PI控制器函数。 PI控制器是飞思卡尔电机控制库的一部分 PI控制器函数的输入包括速度误差和PI 控制器的各种参数,例如比例和积分常数。 PI控制器的输出为占空比,与PWM分辨率呈比例。在速度控制函数末尾处,占空比将指派给PMF模块,此外还会根据占空比计算新触发点并在PTU模块中更新。
- INTERRUPT void TIMchan3_ISR(void)
- {
- tFrac16 PIOut;
- EnableInterrupts;
- TIM0TC3 = TIM0TC3 + TIMER_1MS;
- if (driveStatus.bit.StallCheckReq == 1) {
- driveStatus.bit.StallCheckReq = 0;
- StallCheck();
- }
- if (driveStatus.bit.Sensorless == 1) {
- period6ZC = periodZC_F_PhA + periodZC_R_PhA +
- periodZC_F_PhB + periodZC_R_PhB +
- periodZC_F_PhC + periodZC_R_PhC;
- actualSpeed = SPEED_CALC_NUMERATOR / period6ZC;
- speedErr = requiredSpeed - (tFrac16) actualSpeed;
- speedPIOut = GFLIB_ControllerPIrAW(speedErr,
- &speedPIPrms, F16);
- duty_cycle = MLIB_Mul(PIOut, PWM_MODULO, F16);
- UpdateDutycycle();
- }
- CheckManualInterface();
- UpdateCurrentLimitingLed();
- TIM0TFLG1 = TIM0TFLG1_C3F_MASK;
- }
复制代码 电流限制控制器
电流限制控制器与速度控制器位于同一个1 ms定时器中断内,这是因为两个控制器的输入和输出相互链接。计算得出实际速度时,可以通过代入实际电流与电机最大允许电流之间的差值来调用电流限制PI控制器。 PI控制器的输出将缩放到与PWM周期成比例的值。在电流PI控制器计算出占空比后,
两个占空比输出值将相互比较。
如果速度PI控制器占空比输出高于电流限制PI控制器输出,速度PI控制器占空比输出值将限制为电流限制PI控制器的值;否则,速度PI占空比输出将用作占空比更新值。占空比值将用于更新PMF模块和PTU单元中的触发延迟值。
最后,两个PI控制器的积分部分值需要进行同步,避免其中之一的内部值增加到上限。如果占空比受电流PI占空比输出的限制,则电流PI控制器的积分部分将复制到积分控制器的积分部分,反之亦然。下图中也描述了上述过程。
- INTERRUPT void TIMchan3_ISR(void)
- {
- tFrac16 PIOut;
- EnableInterrupts;
- TIM0TC3 = TIM0TC3 + TIMER_1MS;
- if (driveStatus.bit.StallCheckReq == 1) {
- driveStatus.bit.StallCheckReq = 0;
- StallCheck();
- }
- if (driveStatus.bit.Sensorless == 1) {
- period6ZC = periodZC_F_PhA + periodZC_R_PhA +
- periodZC_F_PhB + periodZC_R_PhB +
- periodZC_F_PhC + periodZC_R_PhC;
- actualSpeed = SPEED_CALC_NUMERATOR / period6ZC;
- speedErr = requiredSpeed - (tFrac16) actualSpeed;
- speedPIOut = GFLIB_ControllerPIrAW(speedErr,
- &speedPIPrms, F16);
- currentErr = DCBusCurrentLimit - DCBusCurrentFiltered;
- currentPIOut = GFLIB_ControllerPIrAW(currentErr,
- ¤tPIPrms, F16);
- if (currentPIOut >= speedPIOut) {
- currentPIPrms.f32Acc = ((tFrac32) speedPIOut) << 16;
- currentPIPrms.f16InErrK1 = 0;
- PIOut = speedPIOut;
- driveStatus.bit.CurrentLimiting = 0;
- }
- else{
- speedPIPrms.f32Acc = ((tFrac32) currentPIOut) << 16;
- speedPIPrms.f16InErrK1 = 0;
- PIOut = currentPIOut;
- driveStatus.bit.CurrentLimiting = 1;
- }
- duty_cycle = MLIB_Mul(PIOut, PWM_MODULO, F16);
- UpdateDutycycle();
- }
- else if ((appState == APP_START) ||
- (appState == APP_ALIGNMENT))
- {
- currentErr = ALIGN_CURRENT_SCALED - DCBusCurrent;
- PIOut = GFLIB_ControllerPIrAW(currentErr,
- AlignCurrentPIPrms, F16);
- duty_cycle = MLIB_Mul(PIOut, PWM_MODULO, F16);
- UpdateDutycycle();
- }
- CheckManualInterface();
- UpdateCurrentLimitingLed();
- TIM0TFLG1 = TIM0TFLG1_C3F_MASK;
- }
复制代码 MC库
应用源代码使用面向MC9S12ZVML128微控制器的飞思卡尔电机控制库(参见MC9S12ZVMMCLUG,MC9S12ZVML128数学和电机控制库用户指南)。这个库中包含三个独立库模块: GFLIB、 GDFLIB和GMCLIB。 GFLIB包含基本数学函数(例如正弦、余弦、斜坡等)。高级滤波器函数是常规数字滤波器
库的一部分,标准电机控制算法是常规电机控制库的一部分。
连载结束,关于BLDC的详细控制策略及方法就这么多,欢迎补充及拍砖!
|
|