MCSDK电流环PI参数整定

使用MCSDK配置基于STM32的电机控制工程,里面会自动配置很多参数。其中就有电流环的PI控制参数。FOC控制的情况下,默认是Id=0的控制模式。MCSDK里面默认Id和Iq的PI控制器参数是一样的,下面这个图里面自动生成的参数基本能跑,但是性能没有保障。因而我们需要明白这些参数设置的原理,才能更好的提高电流环控制性能,乃至整个系统的性能。

电流环PI控制器的原理图如下,控制器的输入是电流误差,输出是电压的指令值。需要注意的是,这里的PI是模拟量,PI输出到电压值时需要做模数转换(A/D),采集得到的电流误差值给进PI控制器之前需要做数模转换(D/A),这些转换需要给PI乘上相应的系数,最终体现在PI值上。

ST电机代码库的电流环PI跟电流环带宽(rad/s)有关,它的表达式如下,

  

其中,ωc是电流环带宽(rad/s),Rs是定子电阻,Ls是定子电感,Ts是电流环采样时间,Kcv是转换系数。

这个式子中,Rshunt是采样电阻,Aop是运放系数,Vbusdc是母线电压,Vdd是芯片工作电压。

那么回到代码里,

/* Gains values for torque and flux control loops */
#define PID_TORQUE_KP_DEFAULT         2477
#define PID_TORQUE_KI_DEFAULT         3456
#define PID_TORQUE_KD_DEFAULT         100
#define PID_FLUX_KP_DEFAULT           2477
#define PID_FLUX_KI_DEFAULT           3456
#define PID_FLUX_KD_DEFAULT           100

/* Torque/Flux control loop gains dividers*/
#define TF_KPDIV                      256
#define TF_KIDIV                      8192
#define TF_KDDIV                      8192
#define TF_KPDIV_LOG                  LOG2((256))
#define TF_KIDIV_LOG                  LOG2((8192))
#define TF_KDDIV_LOG                  LOG2((8192))

我们可以看到设置里不止有PIDKP, PIDKI,还有DIV,这里就涉及到嵌入式的定点数知识了,实际的KP = PID_TORQUE_KP_DEFAULT/ TF_KPDIV,这个设置增大的PI参数的精准度。

感兴趣的朋友可以试着计算一下。

<think>嗯,用户现在想了解双环控制中速度环和电流环的工作原理,以及PID控制器在速度控制中的应用。之前我已经回答过关于PID如何将速度误差转换为转矩输出的问题,用户现在进一步深入询问双闭环的配合机制。需要结合用户提供的引用内容,尤其是引用[2]提到的双闭环结构和引用[1]中的PI控制简化方法。 首先,用户的问题核心在于双环控制中的速度环和电流环如何协作,以及目标速度与实际速度的差值经过PID后能否直接输出转矩。根据之前的回答,已经提到双环控制的结构,外环速度环输出电流设值,内环电流环跟踪该设值,进而生成转矩。但用户现在可能需要更详细的工作原理和步骤,特别是两者的配合过程。 需要参考引用[2]中的描述,说明有传感器和无传感器情况下转子位置的获取方式,以及速度闭环如何与电流环结合。引用[1]中提到实际使用PI控制而非完PID,因为系统模型可能简化为一阶惯性环节,这可能影响控制器的设计。因此,在解释双环控制时,需要强调为什么通常使用PI而不是PID,尤其是在电流环中可能只需要比例控制的情况。 此外,用户的问题还涉及到PID输出的结果是否可以直接作为转矩值。根据之前的回答,转矩输出与电流相关,而PID的输出通常是电流指令,因此需要转换。但用户可能想知道这个过程的具体实现,比如是否需要额外的参数或模型补偿。 需要合引用中的信息,例如引用[2]中的双闭环框图,虽然用户没有提供图,但可以描述其结构:外环速度环的误差经过PI控制器生成Iq_ref(q轴电流参考值),然后内环电流环通过PI控制调电压,进而控制实际电流,最终产生转矩。同时,引用[1]提到通过零极点对消简化PI参数,只需控制电流带宽,这可能影响电流环的设计,使其更高效。 用户可能存在的深层需求是理解双闭环如何提升系统性能,比如动态响应和抗干扰能力,以及在实际应用中的参数方法。需要结合代码示例,如之前的增量式PI控制,说明电流环如何跟踪设值,并转换为转矩。 最后,确保回答结构清晰,分步骤解释双环的工作原理,结合引用内容,并解答PID输出到转矩的转换过程。同时,注意用户可能存在的误区,例如直接输出转矩是否需要考虑电机模型中的其他因素,如反电动势或电枢电阻,这在之前的回答中已提及,需再次强调。</think>### 双环控制中速度环与电流环的协同工作原理及PID应用 #### 一、双环控制架构与分工 在电机控制系统中,速度环(外环)与电流环(内环)的协同工作通过**分层控制**实现,其核心目标是**精准跟踪速度指令**并**动态抑制扰动**。以下是两者配合的详细流程: 1. **速度环(外环)** - **输入**:目标速度$v_{\text{ref}}$与实际速度$v_{\text{actual}}$的偏差 - **输出**:电流参考值$I_{\text{ref}}$(通过PID/PI调节) - **关键公式**(引用[2]中的速度闭环逻辑): $$I_{\text{ref}} = K_{p\_speed} \cdot e_v + K_{i\_speed} \int e_v dt$$ 其中$e_v = v_{\text{ref}} - v_{\text{actual}}$。 2. **电流环(内环)** - **输入**:电流参考值$I_{\text{ref}}$与实际电流$I_{\text{actual}}$的偏差 - **输出**:电压指令$V_{\text{cmd}}$(通常仅用P或PI控制) - **关键公式**(引用[1]中的一阶惯性模型简化): $$V_{\text{cmd}} = K_{p\_current} \cdot e_i + K_{i\_current} \int e_i dt$$ 其中$e_i = I_{\text{ref}} - I_{\text{actual}}$。 3. **转矩生成** 最终转矩由实际电流$I_{\text{actual}}$决: $$T_{\text{output}} = K_t \cdot I_{\text{actual}}$$ 因此,**目标速度误差通过PID输出的本质是间接控制转矩**,但需通过电流环的精确跟踪实现(引用[2]中的双闭环框图逻辑)。 --- #### 二、PID在速度控制中的特殊设计 由于电机系统的动力学特性,实际应用中PID参数需根据**系统模型**和**带宽需求**调: 1. **为何通常省略微分项(D)?** - 引用[1]指出:电机的电压-电流传递函数可简化为**一阶惯性环节**: $$G(s) = \frac{1}{Ls + R}$$ 对于此类系统,PI控制器已可实现零稳态误差,且通过**零极点对消**(令$K_i/K_p = R/L$)可简化参数设计,仅需调节电流带宽[^1]。 2. **速度环与电流环的带宽匹配** - **电流环带宽**:通常设置为速度环的5~10倍,以确保电流快速跟踪指令 - **速度环参数设计**:根据机械时间常数$J/B$(转动惯量/阻尼系数)选择积分时间常数,例如: $$K_{i\_speed} = K_{p\_speed} \cdot \frac{B}{J}$$ --- #### 三、目标速度误差到转矩输出的实现路径 1. **理论路径** $$e_v \xrightarrow{\text{速度环PID}} I_{\text{ref}} \xrightarrow{\text{电流环控制}} I_{\text{actual}} \xrightarrow{\text{转矩公式}} T_{\text{output}}$$ 2. **实际限制与补偿** - **反电动势影响**:高速时反电动势$V_{\text{emf}} = K_e \cdot \omega$会降低有效电压,需在电流环中补偿(引用[1]的电压-电流模型): $$V_{\text{cmd}} = R_a \cdot I_{\text{ref}} + K_e \cdot \omega$$ - **非线性摩擦**:低速时需加入摩擦补偿项,例如: $$I_{\text{ref\_comp}} = I_{\text{ref}} + \text{sign}(\omega) \cdot T_{\text{friction}} / K_t$$ --- #### 四、代码实现示例(基于引用[2]的双闭环逻辑) ```c // 电机参数 #define Kt 0.05 // 转矩常数 (N·m/A) #define R_a 2.0 // 电枢电阻 (Ω) #define K_e 0.048 // 反电动势常数 (V/(rad/s)) // 速度环PI控制器 float Speed_PI(float v_ref, float v_actual) { static float integral = 0; float Kp = 0.8, Ki = 0.2; float error = v_ref - v_actual; integral += Ki * error * dt; // dt为控制周期 return Kp * error + integral; // 输出I_ref } // 电流环P控制器(引用[1]的简化设计) float Current_P(float I_ref, float I_actual, float omega) { float Kp_current = R_a; // 通过零极点对消简化 float V_comp = K_e * omega; // 反电动势补偿 return Kp_current * (I_ref - I_actual) + V_comp; // 输出V_cmd } // 最终转矩计算 float GetTorque(float I_actual) { return Kt * I_actual; } ``` --- #### 五、关键问题解答 **目标速度误差通过PID能否直接输出转矩?** - **不能直接输出**,需通过两步转换: 1. 速度环PID将速度误差映射为电流参考值$I_{\text{ref}}$ 2. 电流环控制实际电流$I_{\text{actual}}$,最终由$T=K_t \cdot I_{\text{actual}}$得到转矩 - **物理限制**:实际转矩受电机最大电流$I_{\text{max}}$限制,需在代码中对$I_{\text{ref}}$进行限幅: $$|I_{\text{ref}}| \leq I_{\text{max}}$$ --- ### 相关问题 1. 为什么电流环通常不需要积分项(I)? 2. 如何通过实验测量电机的机械时间常数$J/B$? 3. 无传感器控制中,位置观测器如何影响双环控制性能? [^1]: 一阶系统使用PI控制时,零极点对消可消除系统极点,使闭环传递函数变为纯积分环节。 [^2]: 速度环带宽一般设置为机械系统自然频率的1/5,以避免与电流环耦合振荡。 [^3]: 反电动势补偿在高速时尤为重要,否则会导致电流环跟踪误差显著增大。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值