PID_Handle PID_init(void *pMemory,const size_t numBytes) { PID_Handle handle; if(numBytes < sizeof(PID_Obj)) return((PID_Handle)NULL); // assign the handle handle = (PID_Handle)pMemory; // set some defaults PID_setUi(handle,_IQ(0.0)); PID_setRefValue(handle,_IQ(0.0)); PID_setFbackValue(handle,_IQ(0.0)); return(handle); } // end of PID_init() function
void CTRL_setParams(CTRL_Handle handle,USER_Params *pUserParams) { CTRL_Obj *obj = (CTRL_Obj *)handle; _iq Kp,Ki,Kd; _iq outMin,outMax; _iq maxModulation; MATH_vec2 Iab_out_pu = {_IQ(0.0),_IQ(0.0)}; MATH_vec2 Idq_out_pu = {_IQ(0.0),_IQ(0.0)}; MATH_vec2 Idq_ref_pu = {_IQ(0.0),_IQ(0.0)}; MATH_vec2 Vab_in_pu = {_IQ(0.0),_IQ(0.0)}; MATH_vec2 Vab_out_pu = {_IQ(0.0),_IQ(0.0)}; MATH_vec2 Vdq_out_pu = {_IQ(0.0),_IQ(0.0)}; // assign the motor type CTRL_setMotorParams(handle,pUserParams->motor_type, pUserParams->motor_numPolePairs, pUserParams->motor_ratedFlux, pUserParams->motor_Ls_d, pUserParams->motor_Ls_q, pUserParams->motor_Rr, pUserParams->motor_Rs); // assign other controller parameters CTRL_setNumIsrTicksPerCtrlTick(handle,pUserParams->numIsrTicksPerCtrlTick); CTRL_setNumCtrlTicksPerCurrentTick(handle,pUserParams->numCtrlTicksPerCurrentTick); CTRL_setNumCtrlTicksPerSpeedTick(handle,pUserParams->numCtrlTicksPerSpeedTick); CTRL_setNumCtrlTicksPerTrajTick(handle,pUserParams->numCtrlTicksPerTrajTick); CTRL_setCtrlFreq_Hz(handle,pUserParams->ctrlFreq_Hz); CTRL_setTrajFreq_Hz(handle,pUserParams->trajFreq_Hz); CTRL_setTrajPeriod_sec(handle,_IQ(1.0/pUserParams->trajFreq_Hz)); CTRL_setCtrlPeriod_sec(handle,pUserParams->ctrlPeriod_sec); CTRL_setMaxVsMag_pu(handle,_IQ(pUserParams->maxVsMag_pu)); CTRL_setIab_in_pu(handle,&Iab_out_pu); CTRL_setIdq_in_pu(handle,&Idq_out_pu); CTRL_setIdq_ref_pu(handle,&Idq_ref_pu); CTRL_setIdRated_pu(handle,_IQ(pUserParams->IdRated/pUserParams->iqFullScaleCurrent_A)); CTRL_setVab_in_pu(handle,&Vab_in_pu); CTRL_setVab_out_pu(handle,&Vab_out_pu); CTRL_setVdq_out_pu(handle,&Vdq_out_pu); CTRL_setSpd_out_pu(handle,_IQ(0.0)); CTRL_setRhf(handle,0.0); CTRL_setLhf(handle,0.0); CTRL_setRoverL(handle,0.0); // reset the counters CTRL_resetCounter_current(handle); CTRL_resetCounter_isr(handle); CTRL_resetCounter_speed(handle); CTRL_resetCounter_state(handle); CTRL_resetCounter_traj(handle); // set the wait times for each state CTRL_setWaitTimes(handle,&pUserParams->ctrlWaitTime[0]); // set flags CTRL_setFlag_enablePowerWarp(handle,false); CTRL_setFlag_enableCtrl(handle,false); CTRL_setFlag_enableOffset(handle,true); CTRL_setFlag_enableSpeedCtrl(handle,true); CTRL_setFlag_enableUserMotorParams(handle,false); CTRL_setFlag_enableDcBusComp(handle,true); // initialize the controller error code CTRL_setErrorCode(handle,CTRL_ErrorCode_NoError); // set the default controller state CTRL_setState(handle,CTRL_State_Idle); // set the number of current sensors CTRL_setupClarke_I(handle,pUserParams->numCurrentSensors); // set the number of voltage sensors CTRL_setupClarke_V(handle,pUserParams->numVoltageSensors); // set the default Id PID controller parameters Kp = _IQ(0.1); Ki = _IQ(pUserParams->ctrlPeriod_sec/0.004); Kd = _IQ(0.0); outMin = _IQ(-0.95); outMax = _IQ(0.95); PID_setGains(obj->pidHandle_Id,Kp,Ki,Kd); PID_setUi(obj->pidHandle_Id,_IQ(0.0)); PID_setMinMax(obj->pidHandle_Id,outMin,outMax); CTRL_setGains(handle,CTRL_Type_PID_Id,Kp,Ki,Kd); // set the default the Iq PID controller parameters Kp = _IQ(0.1); Ki = _IQ(pUserParams->ctrlPeriod_sec/0.004); Kd = _IQ(0.0); outMin = _IQ(-0.95); outMax = _IQ(0.95); PID_setGains(obj->pidHandle_Iq,Kp,Ki,Kd); PID_setUi(obj->pidHandle_Iq,_IQ(0.0)); PID_setMinMax(obj->pidHandle_Iq,outMin,outMax); CTRL_setGains(handle,CTRL_Type_PID_Iq,Kp,Ki,Kd); // set the default speed PID controller parameters Kp = _IQ(0.02*pUserParams->maxCurrent*pUserParams->iqFullScaleFreq_Hz/pUserParams->iqFullScaleCurrent_A); Ki = _IQ(2.0*pUserParams->maxCurrent*pUserParams->iqFullScaleFreq_Hz*pUserParams->ctrlPeriod_sec/pUserParams->iqFullScaleCurrent_A); Kd = _IQ(0.0); outMin = _IQ(-1.0); outMax = _IQ(1.0); PID_setGains(obj->pidHandle_spd,Kp,Ki,Kd); PID_setUi(obj->pidHandle_spd,_IQ(0.0)); PID_setMinMax(obj->pidHandle_spd,outMin,outMax); CTRL_setGains(handle,CTRL_Type_PID_spd,Kp,Ki,Kd); // set the speed reference CTRL_setSpd_ref_pu(handle,_IQ(0.0)); // set the default Id current trajectory module parameters TRAJ_setIntValue(obj->trajHandle_Id,_IQ(0.0)); TRAJ_setTargetValue(obj->trajHandle_Id,_IQ(0.0)); TRAJ_setMinValue(obj->trajHandle_Id,_IQ(0.0)); TRAJ_setMaxValue(obj->trajHandle_Id,_IQ(0.0)); TRAJ_setMaxDelta(obj->trajHandle_Id,_IQ(0.0)); // set the default the speed trajectory module parameters TRAJ_setIntValue(obj->trajHandle_spd,_IQ(0.0)); TRAJ_setTargetValue(obj->trajHandle_spd,_IQ(0.0)); TRAJ_setMinValue(obj->trajHandle_spd,_IQ(0.0)); TRAJ_setMaxValue(obj->trajHandle_spd,_IQ(0.0)); TRAJ_setMaxDelta(obj->trajHandle_spd,_IQ(0.0)); // set the default maximum speed trajectory module parameters TRAJ_setIntValue(obj->trajHandle_spdMax,_IQ(0.0)); TRAJ_setTargetValue(obj->trajHandle_spdMax,_IQ(0.0)); TRAJ_setMinValue(obj->trajHandle_spdMax,_IQ(0.0)); // not used TRAJ_setMaxValue(obj->trajHandle_spdMax,_IQ(0.0)); // not used TRAJ_setMaxDelta(obj->trajHandle_spdMax,_IQ(0.0)); // not used // set the default estimator parameters CTRL_setEstParams(obj->estHandle,pUserParams); // set the maximum modulation for the SVGEN module maxModulation = _IQ(MATH_TWO_OVER_THREE); SVGEN_setMaxModulation(obj->svgenHandle,maxModulation); return; } // end of CTRL_setParams() function