9.0脱离WorkBench直接修改电路及电机的参数实现调试
WorkBench生成代码工程,以及设定参数非常方便。但是由于workbench生成再由cubeMX生成代码,最后由Keil执行编译这个过程太麻烦,或许还会生成或编译出错;所以,采用直接修改源代码的方式来调试或更改电机的参数,效率更高。
或者,在作为产品发布使用时,需要动态的配置这些参数,更需要清晰的知道这些参数的原理、修改位置和影响的工作状态。
所修改的源码位置,我记录出所在的文件及行数,再贴出关键的几行代码。
1. 修改电机的参数内容
在workbench中的位置是这个界面:
pmsm_motor_parameters.h 整个文件都是电机的参数相关
/**************************
*** Motor 1 Parameters ***
**************************/
/***************** MOTOR ELECTRICAL PARAMETERS ******************************/
#define POLE_PAIR_NUM 2 /* Number of motor pole pairs *//*电机的极对数*/
#define RS 3.50 /* Stator resistance , ohm*/
#define LS 0.001650 /* Stator inductance, H
For I-PMSM it is equal to Lq */
/* When using Id = 0, NOMINAL_CURRENT is utilized to saturate the output of the
PID for speed regulation (i.e. reference torque).
Transformation of real currents (A) into int16_t format must be done accordingly with
formula:
Phase current (int16_t 0-to-peak) = (Phase current (A 0-to-peak)* 32767 * Rshunt *
*Amplifying network gain)/(MCU supply voltage/2)
*/
#define NOMINAL_CURRENT 3038
#define MOTOR_MAX_SPEED_RPM 3000 /*!< Maximum rated speed */
#define MOTOR_VOLTAGE_CONSTANT 7.5 /*!< Volts RMS ph-ph /kRPM */
#define ID_DEMAG -3038 /*!< Demagnetization current */
/***************** MOTOR SENSORS PARAMETERS ******************************/
/* Motor sensors parameters are always generated but really meaningful only
if the corresponding sensor is actually present in the motor */
/*** Hall sensors ***/
#define HALL_SENSORS_PLACEMENT DEGREES_120 /*!<Define here the
mechanical position of the sensors
withreference to an electrical cycle.
It can be either DEGREES_120 or
DEGREES_60 */
#define HALL_PHASE_SHIFT 300 /*!< Define here in degrees
the electrical phase shift between
the low to high transition of
signal H1 and the maximum of
the Bemf induced on phase A */
/*** Quadrature encoder ***/
#define M1_ENCODER_PPR 1024 /*!< Number of pulses per
revolution */
2. 修改电机的驱动参数
改完电机的机械及电气参数后,电机还不能正确的控制,因为还有驱动参数没有做调整。
drive_parameters.h文件中,全是电机的驱动参数。在调整电机的参数之后,workbench会自动计算调整在控制电流环、力矩环、速度环的PID参数。我们在脱离workbench修改这些参数时,最好从workbench的Drive Setting里面Copy过来。
- 图1 Workbench中的DriveSettings
- drive_parameters.h文件中 69行代码开始
/* Gains values for torque and flux control loops */
#define PID_TORQUE_KP_DEFAULT 2650
#define PID_TORQUE_KI_DEFAULT 1988
#define PID_TORQUE_KD_DEFAULT 100
#define PID_FLUX_KP_DEFAULT 2650
#define PID_FLUX_KI_DEFAULT 1988
#define PID_FLUX_KD_DEFAULT 100
/* Torque/Flux control loop gains dividers*/
#define TF_KPDIV 512
#define TF_KIDIV 16384
#define TF_KDDIV 8192
#define TF_KPDIV_LOG LOG2(512)
#define TF_KIDIV_LOG LOG2(16384)
#define TF_KDDIV_LOG LOG2(8192)
#define TFDIFFERENTIAL_TERM_ENABLING DISABLE
/* Speed control loop */
#define SPEED_LOOP_FREQUENCY_HZ 500 /*!<Execution rate of speed
regulation loop (Hz) */
#define PID_SPEED_KP_DEFAULT 2506/(SPEED_UNIT/10) /* Workbench compute the gain for 01Hz unit*/
#define PID_SPEED_KI_DEFAULT 403/(SPEED_UNIT/10) /* Workbench compute the gain for 01Hz unit*/
#define PID_SPEED_KD_DEFAULT 0/(SPEED_UNIT/10) /* Workbench compute the gain for 01Hz unit*/
/* Speed PID parameter dividers */
#define SP_KPDIV 512
#define SP_KIDIV 16384
#define SP_KDDIV 16
#define SP_KPDIV_LOG LOG2(512)
#define SP_KIDIV_LOG LOG2(16384)
#define SP_KDDIV_LOG LOG2(16)
/* USER CODE BEGIN PID_SPEED_INTEGRAL_INIT_DIV */
#define PID_SPEED_INTEGRAL_INIT_DIV 1 /* */
/* USER CODE END PID_SPEED_INTEGRAL_INIT_DIV */
#define SPD_DIFFERENTIAL_TERM_ENABLING DISABLE
#define IQMAX 8102
代码中的参数都是来自于workbench中的数据,这部分数据是根据特定计算方法生成的,在workbench的使用手册中有单独介绍。大致的思路是根据电机的机械电气特性参数,控制系统的传递函数,最后简化出的一个公式,计算出来一个数据。但是这个数据可能会含有小数,MCU计算小数的能力有限,所以直接用一个分数的形式来表示这个数字。分母都是2的几次方数,在计算的时候可以直接用移位的方法进行除法运算。这样做了之后,MCU计算速度可以加快很多,计算结果的精度也能符合需求。
如果要自行改动,最好也是遵循这个思路来进行。具体的计算公式,在后续整理时,会补充到文章里来。
在代码里面改完如上两张图片里的设置内容,就能让电机正常旋转起来了。
电机的机械电气参数,如何测得可以参考 4.电机参数的含义及测量方法电机驱动文章在CSDN的分享计划