From ce627e4963ab5b253401d59060d2aa467ae553b2 Mon Sep 17 00:00:00 2001 From: Nicolas Trimborn Date: Thu, 12 Aug 2021 12:33:46 +0200 Subject: [PATCH] VI controller added --- .../.atmelstart/atmel_start_config.atstart | 12 +-- .../Motor_Master/Config/hpl_eic_config.h | 12 +-- .../Motor_Master/EtherCAT_SlaveDef.h | 15 ++- .../Motor_Master/Ethercat_SlaveDef.h | 15 ++- .../Motor_Master/Motor_Master.cproj | 10 +- .../Motor_Master/Motor_Master/bldc.c | 95 ++++++++++++------- .../Motor_Master/Motor_Master/bldc.h | 6 +- .../Motor_Master/Motor_Master/bldc_types.h | 4 +- .../Motor_Master/Motor_Master/interrupts.h | 13 +++ .../Motor_Master/Motor_Master/main.c | 6 +- 10 files changed, 129 insertions(+), 59 deletions(-) diff --git a/2_Motor_Master/Motor_Master/Motor_Master/.atmelstart/atmel_start_config.atstart b/2_Motor_Master/Motor_Master/Motor_Master/.atmelstart/atmel_start_config.atstart index ce8529c..265b758 100644 --- a/2_Motor_Master/Motor_Master/Motor_Master/.atmelstart/atmel_start_config.atstart +++ b/2_Motor_Master/Motor_Master/Motor_Master/.atmelstart/atmel_start_config.atstart @@ -839,8 +839,8 @@ drivers: eic_arch_asynch11: false eic_arch_asynch12: false eic_arch_asynch13: false - eic_arch_asynch14: false - eic_arch_asynch15: false + eic_arch_asynch14: true + eic_arch_asynch15: true eic_arch_asynch2: false eic_arch_asynch3: false eic_arch_asynch4: false @@ -872,8 +872,8 @@ drivers: eic_arch_enable_irq_setting11: false eic_arch_enable_irq_setting12: false eic_arch_enable_irq_setting13: false - eic_arch_enable_irq_setting14: false - eic_arch_enable_irq_setting15: false + eic_arch_enable_irq_setting14: true + eic_arch_enable_irq_setting15: true eic_arch_enable_irq_setting2: false eic_arch_enable_irq_setting3: false eic_arch_enable_irq_setting4: false @@ -926,8 +926,8 @@ drivers: eic_arch_sense11: No detection eic_arch_sense12: No detection eic_arch_sense13: No detection - eic_arch_sense14: No detection - eic_arch_sense15: No detection + eic_arch_sense14: Both-edges detection + eic_arch_sense15: Both-edges detection eic_arch_sense2: No detection eic_arch_sense3: No detection eic_arch_sense4: No detection diff --git a/2_Motor_Master/Motor_Master/Motor_Master/Config/hpl_eic_config.h b/2_Motor_Master/Motor_Master/Motor_Master/Config/hpl_eic_config.h index d10ee51..059b167 100644 --- a/2_Motor_Master/Motor_Master/Motor_Master/Config/hpl_eic_config.h +++ b/2_Motor_Master/Motor_Master/Motor_Master/Config/hpl_eic_config.h @@ -749,7 +749,7 @@ // Interrupt 14 Settings // eic_arch_enable_irq_setting14 #ifndef CONF_EIC_ENABLE_IRQ_SETTING14 -#define CONF_EIC_ENABLE_IRQ_SETTING14 0 +#define CONF_EIC_ENABLE_IRQ_SETTING14 1 #endif // External Interrupt 14 Filter Enable @@ -783,14 +783,14 @@ // This defines input sense trigger // eic_arch_sense14 #ifndef CONF_EIC_SENSE14 -#define CONF_EIC_SENSE14 EIC_NMICTRL_NMISENSE_NONE_Val +#define CONF_EIC_SENSE14 EIC_NMICTRL_NMISENSE_BOTH_Val #endif // External Interrupt 14 Asynchronous Edge Detection Mode // Indicates the external interrupt 14 detection mode operated synchronously or asynchronousl // eic_arch_asynch14 #ifndef CONF_EIC_ASYNCH14 -#define CONF_EIC_ASYNCH14 0 +#define CONF_EIC_ASYNCH14 1 #endif // @@ -798,7 +798,7 @@ // Interrupt 15 Settings // eic_arch_enable_irq_setting15 #ifndef CONF_EIC_ENABLE_IRQ_SETTING15 -#define CONF_EIC_ENABLE_IRQ_SETTING15 0 +#define CONF_EIC_ENABLE_IRQ_SETTING15 1 #endif // External Interrupt 15 Filter Enable @@ -832,14 +832,14 @@ // This defines input sense trigger // eic_arch_sense15 #ifndef CONF_EIC_SENSE15 -#define CONF_EIC_SENSE15 EIC_NMICTRL_NMISENSE_NONE_Val +#define CONF_EIC_SENSE15 EIC_NMICTRL_NMISENSE_BOTH_Val #endif // External Interrupt 15 Asynchronous Edge Detection Mode // Indicates the external interrupt 15 detection mode operated synchronously or asynchronousl // eic_arch_asynch15 #ifndef CONF_EIC_ASYNCH15 -#define CONF_EIC_ASYNCH15 0 +#define CONF_EIC_ASYNCH15 1 #endif // diff --git a/2_Motor_Master/Motor_Master/Motor_Master/EtherCAT_SlaveDef.h b/2_Motor_Master/Motor_Master/Motor_Master/EtherCAT_SlaveDef.h index 7629170..ca22b89 100644 --- a/2_Motor_Master/Motor_Master/Motor_Master/EtherCAT_SlaveDef.h +++ b/2_Motor_Master/Motor_Master/Motor_Master/EtherCAT_SlaveDef.h @@ -167,7 +167,20 @@ static void update_telemetry(void) static void update_setpoints(void) { - //Motor1.motor_setpoints. = *desired_position; + Motor1.motor_setpoints.desired_position = *M1_Desired_pos; + Motor1.motor_setpoints.desired_speed = *M1_Desired_speed; + Motor1.motor_setpoints.desired_torque = *M1_Desired_current; + Motor1.motor_setpoints.max_current = *M1_Max_current; + Motor1.motor_setpoints.max_torque = *M1_Max_current; + Motor1.motor_setpoints.max_velocity = *M1_Max_velocity; + + Motor2.motor_setpoints.desired_position = *M2_Desired_pos; + Motor2.motor_setpoints.desired_speed = *M2_Desired_speed; + Motor2.motor_setpoints.desired_torque = *M2_Desired_current; + Motor2.motor_setpoints.max_current = *M2_Max_current; + Motor2.motor_setpoints.max_torque = *M2_Max_current; + Motor2.motor_setpoints.max_velocity = *M2_Max_velocity; + //volatile uint8_t a = *M1_Control_mode; //volatile uint8_t b = *M1_Control_set; //volatile int16_t c = *M1_Desired_pos; diff --git a/2_Motor_Master/Motor_Master/Motor_Master/Ethercat_SlaveDef.h b/2_Motor_Master/Motor_Master/Motor_Master/Ethercat_SlaveDef.h index 7629170..ca22b89 100644 --- a/2_Motor_Master/Motor_Master/Motor_Master/Ethercat_SlaveDef.h +++ b/2_Motor_Master/Motor_Master/Motor_Master/Ethercat_SlaveDef.h @@ -167,7 +167,20 @@ static void update_telemetry(void) static void update_setpoints(void) { - //Motor1.motor_setpoints. = *desired_position; + Motor1.motor_setpoints.desired_position = *M1_Desired_pos; + Motor1.motor_setpoints.desired_speed = *M1_Desired_speed; + Motor1.motor_setpoints.desired_torque = *M1_Desired_current; + Motor1.motor_setpoints.max_current = *M1_Max_current; + Motor1.motor_setpoints.max_torque = *M1_Max_current; + Motor1.motor_setpoints.max_velocity = *M1_Max_velocity; + + Motor2.motor_setpoints.desired_position = *M2_Desired_pos; + Motor2.motor_setpoints.desired_speed = *M2_Desired_speed; + Motor2.motor_setpoints.desired_torque = *M2_Desired_current; + Motor2.motor_setpoints.max_current = *M2_Max_current; + Motor2.motor_setpoints.max_torque = *M2_Max_current; + Motor2.motor_setpoints.max_velocity = *M2_Max_velocity; + //volatile uint8_t a = *M1_Control_mode; //volatile uint8_t b = *M1_Control_set; //volatile int16_t c = *M1_Desired_pos; diff --git a/2_Motor_Master/Motor_Master/Motor_Master/Motor_Master.cproj b/2_Motor_Master/Motor_Master/Motor_Master/Motor_Master.cproj index eaf15a1..3096d08 100644 --- a/2_Motor_Master/Motor_Master/Motor_Master/Motor_Master.cproj +++ b/2_Motor_Master/Motor_Master/Motor_Master/Motor_Master.cproj @@ -211,7 +211,7 @@ - + @@ -387,7 +387,6 @@ %24(PackRepoDir)\arm\CMSIS\5.4.0\CMSIS\Core\Include\ - %24(PackRepoDir)\atmel\SAME51_DFP\1.1.139\include ../Config ../ ../examples @@ -412,12 +411,13 @@ ../hpl/tc ../hpl/tcc ../hri + %24(PackRepoDir)\atmel\SAME51_DFP\1.1.139\include True Maximum (-g3) True - -std=gnu11 -mfloat-abi=hard -mfpu=fpv4-sp-d16 + -std=gnu99 -mfloat-abi=hard -mfpu=fpv4-sp-d16 True @@ -438,7 +438,6 @@ %24(PackRepoDir)\arm\CMSIS\5.4.0\CMSIS\Core\Include\ - %24(PackRepoDir)\atmel\SAME51_DFP\1.1.139\include ../Config ../ ../examples @@ -463,13 +462,13 @@ ../hpl/tc ../hpl/tcc ../hri + %24(PackRepoDir)\atmel\SAME51_DFP\1.1.139\include Default (-g) %24(PackRepoDir)\arm\CMSIS\5.4.0\CMSIS\Core\Include\ - %24(PackRepoDir)\atmel\SAME51_DFP\1.1.139\include ../Config ../ ../examples @@ -494,6 +493,7 @@ ../hpl/tc ../hpl/tcc ../hri + %24(PackRepoDir)\atmel\SAME51_DFP\1.1.139\include Default (-Wa,-g) diff --git a/2_Motor_Master/Motor_Master/Motor_Master/bldc.c b/2_Motor_Master/Motor_Master/Motor_Master/bldc.c index e097c42..d52ad43 100644 --- a/2_Motor_Master/Motor_Master/Motor_Master/bldc.c +++ b/2_Motor_Master/Motor_Master/Motor_Master/bldc.c @@ -33,15 +33,34 @@ void motor_StateMachine(BLDCMotor_t* const motor) motor->motor_state.currentstate = MOTOR_IDLE; break; case MOTOR_IDLE: - hri_tcc_write_PATTBUF_reg(motor->motor_param->pwm_desc->device.hw, DISABLE_PATTERN); + //hri_tcc_write_PATTBUF_reg(motor->motor_param->pwm_desc->device.hw, DISABLE_PATTERN); motor->motor_state.previousstate = motor->motor_state.currentstate; - motor->motor_state.currentstate = MOTOR_OPEN_LOOP_STATE; + motor->motor_state.currentstate = MOTOR_VI_CTRL_STATE; break; case MOTOR_OPEN_LOOP_STATE: BLDC_runOpenLoop(motor, *M1_Desired_dc); calculate_motor_speed(motor); motor->motor_state.previousstate = motor->motor_state.currentstate; break; + case MOTOR_V_CTRL_STATE: + calculate_motor_speed(motor); + BLDC_runSpeedCntl(motor, (float32_t)motor->motor_status.calc_rpm, (float32_t)motor->motor_setpoints.desired_speed); + motor->motor_state.previousstate = motor->motor_state.currentstate; + break; + case MOTOR_VI_CTRL_STATE: + switch (motor->regulation_loop_count) { + case 0: /* PWM FREQ / 25 - 1kHz */ + case 5: case 10: case 15: case 20:/* PWM FREQ / 5 - 5kHz */ + calculate_motor_speed(motor); + BLDC_runSpeedCntl(motor, (float32_t)motor->motor_status.calc_rpm, (float32_t)motor->motor_setpoints.desired_speed); + default: /* PWM FREQ - 25kHz */ + select_active_phase(motor); + BLDC_runCurrentCntl(motor,(float32_t)motor->Iphase_pu.Bus, (float32_t)motor->controllers.Pi_Idc.Ref_pu); + break; + } // end switch(regulation_loop_count) + if(motor->regulation_loop_count > 23) motor->regulation_loop_count = 0; + else motor->regulation_loop_count++; + break; case MOTOR_PVI_CTRL_STATE: switch (Motor1.regulation_loop_count) { case 0: /* PWM FREQ / 25 - 1kHz */ @@ -100,8 +119,10 @@ void BldcInitStruct(BLDCMotor_t* const motor, BLDCMotor_param_t * const motor_pa motor->motor_status.cur_comm_step = 0; motor->motor_status.currentHallPattern = 1; //motor->motor_status.nextHallPattern = 3; - motor->motor_setpoints.directionOffset = 0; + motor->motor_status.speed_average = 0; + motor->motor_status.count =1; + // ---------------------------------------------------------------------- // Initialize Phase Current Struct: // ---------------------------------------------------------------------- @@ -146,6 +167,7 @@ void BldcInitStruct(BLDCMotor_t* const motor, BLDCMotor_param_t * const motor_pa motor->motor_setpoints.max_current = 0.0; motor->motor_setpoints.max_torque = 0.0; motor->motor_setpoints.max_velocity = 0; + motor->motor_setpoints.directionOffset = 0; //// ------------------------------------------------------------------------------ //// Initialize PI current control @@ -160,14 +182,20 @@ void BldcInitStruct(BLDCMotor_t* const motor, BLDCMotor_param_t * const motor_pa //// Initialize PD Vel control //// ------------------------------------------------------------------------------ PID_objectInit(&motor->controllers.Pid_Speed); + /* V Control Gains */ + //motor->controllers.Pid_Speed.Kp = 0.005f; + //motor->controllers.Pid_Speed.Ki = 0.00001f; + //motor->controllers.Pid_Speed.Kd = 0.001f; /* VI Control Gains */ - //motor->controllers.Pid_Speed.Kp = 0.0003f; - //motor->controllers.Pid_Speed.Ki = 0.001f; - motor->controllers.Pid_Speed.Kp = 0.0005f; - motor->controllers.Pid_Speed.Ki = 0.0f; - motor->controllers.Pid_Speed.Kd = 0.0001f; - //motor->controllers.Pid_Speed.Ki = 0.0001f; + motor->controllers.Pid_Speed.Kp = 0.0002f; + motor->controllers.Pid_Speed.Ki = 0.0000001f; + + //motor->controllers.Pid_Speed.Kp = 0.0005f; + //motor->controllers.Pid_Speed.Ki = 0.0f; + //motor->controllers.Pid_Speed.Kd = 0.0001f; + + /* Limits */ motor->controllers.Pid_Speed.OutMax_pu = (motor_param->motor_Max_Current_IDC_A); motor->controllers.Pid_Speed.OutMin_pu = -(motor_param->motor_Max_Current_IDC_A); @@ -280,7 +308,7 @@ void calculate_motor_speed(BLDCMotor_t* const motor) ////uint32_t test = (SPEEDFACTOR, period_after_capture); ////temp_rpm = SPEEDFACTOR / period_after_capture; ////tic_port(DEBUG_3_PORT); - temp_rpm = HZ_TO_RPM / (period_after_capture * 42); + temp_rpm = HZ_TO_RPM / (period_after_capture * motor->motor_param->motor_commutationStates); //temp_rpm = HZ_TO_RPM * period_after_capture; ////toc_port(DEBUG_3_PORT); @@ -297,32 +325,31 @@ void calculate_motor_speed(BLDCMotor_t* const motor) temp_rpm = temp_rpm; } - motor->motor_status.calc_rpm = (int16_t)temp_rpm; + //motor->motor_status.calc_rpm = (int16_t)temp_rpm; #ifdef AVERAGE_SPEED_MEASURE - //volatile uint32_t speed_average = 0; - //volatile uint8_t count = 1; - //// To avoid noise an average is realized on 8 samples - //speed_average += temp_rpm; - //if(count >= n_SAMPLE) - //{ - //count = 1; - //motor->motor_status.calc_rpm = (speed_average >> 3); // divide by 8 - ////Motor1.motor_status.calc_rpm = (speed_average); // divide by 8 - //speed_average = 0; - ////*Spare_byte1 = motorState.actualDirection; - //if(motor->motor_status.actualDirection == CCW) /* Changed from CCW */ - //{ - ////*motor_speed = -1* Motor1.calc_rpm; - //motor->motor_status.calc_rpm = -1* motor->motor_status.calc_rpm; - //} else { - ////*motor_speed = Motor1.calc_rpm; - //motor->motor_status.calc_rpm = motor->motor_status.calc_rpm; - //} - //return; - //} - //else count++; + // To avoid noise an average is realized on 8 samples + motor->motor_status.speed_average += temp_rpm; + if(motor->motor_status.count >= n_SAMPLE) + { + + motor->motor_status.count = 1; + motor->motor_status.calc_rpm = (motor->motor_status.speed_average >> 3); // divide by 8 + //Motor1.motor_status.calc_rpm = (speed_average); // divide by 8 + motor->motor_status.speed_average = 0; + //*Spare_byte1 = motorState.actualDirection; + if(motor->motor_status.actualDirection == CCW) /* Changed from CCW */ + { + //*motor_speed = -1* Motor1.calc_rpm; + motor->motor_status.calc_rpm = -1* motor->motor_status.calc_rpm; + } else { + //*motor_speed = Motor1.calc_rpm; + motor->motor_status.calc_rpm = motor->motor_status.calc_rpm; + } + return; + } + else motor->motor_status.count++; #endif motor->motor_status.calc_rpm = (int16_t)temp_rpm; @@ -371,7 +398,7 @@ void BLDC_runSpeedCntl(BLDCMotor_t *motor, const float32_t speedfbk, const float motor->controllers.Pid_Speed.Ref_pu = f_clamp(speedRef, -motor->motor_param->motor_Max_Spd_RPM, motor->motor_param->motor_Max_Spd_RPM); - if (applicationStatus.currentstate == MOTOR_V_CTRL_STATE) + if (motor->motor_state.currentstate == MOTOR_V_CTRL_STATE) { /* Output Pu in Volts (PWM %) */ motor->controllers.Pid_Speed.OutMax_pu = motor->VdcBus_pu; diff --git a/2_Motor_Master/Motor_Master/Motor_Master/bldc.h b/2_Motor_Master/Motor_Master/Motor_Master/bldc.h index c917e17..e5ae0dc 100644 --- a/2_Motor_Master/Motor_Master/Motor_Master/bldc.h +++ b/2_Motor_Master/Motor_Master/Motor_Master/bldc.h @@ -17,7 +17,7 @@ #include "statemachine.h" #define PWM_TOP (1000) -#define MAX_PWM (600) +#define MAX_PWM (400) //#define MAX_VEL 3800 #define CW (0) //CBA @@ -29,7 +29,7 @@ #define INVALID_HALL_0 (0) #define INVALID_HALL_7 (7) -//#define AVERAGE_SPEED_MEASURE +//#define AVERAGE_SPEED_MEASURE 1 #define n_SAMPLE 8 // ---------------------------------------------------------------------- @@ -75,6 +75,7 @@ volatile BLDCMotor_t Motor2; volatile MOTOR_STATE_t Motor1_Status; volatile MOTOR_STATE_t Motor2_Status; + // ---------------------------------------------------------------------- // functions // ---------------------------------------------------------------------- @@ -92,6 +93,5 @@ static void BLDC_runPosCntl(BLDCMotor_t *motor, int16_t posfbk, int16_t posRef); static void BLDC_runOpenLoop(BLDCMotor_t *motor, int16_t duty); volatile uint8_t readHallSensorM1(void); volatile uint8_t readHallSensorM2(void); -volatile uint8_t readHallSensorM1v2(void); #endif /* BLDC_H_ */ \ No newline at end of file diff --git a/2_Motor_Master/Motor_Master/Motor_Master/bldc_types.h b/2_Motor_Master/Motor_Master/Motor_Master/bldc_types.h index d8b1b4c..db701a1 100644 --- a/2_Motor_Master/Motor_Master/Motor_Master/bldc_types.h +++ b/2_Motor_Master/Motor_Master/Motor_Master/bldc_types.h @@ -68,7 +68,7 @@ volatile typedef struct { volatile uint8_t actualDirection; //! The actual direction of rotation. volatile uint16_t duty_cycle; - volatile int16_t calc_rpm; + volatile int16_t calc_rpm; volatile int16_t Num_Steps; /* Hall States */ //volatile uint8_t prevHallPattern; @@ -77,6 +77,8 @@ volatile typedef struct /* Commutation State */ volatile uint8_t cur_comm_step; volatile uint8_t prev_comm_step; + volatile uint32_t speed_average; + volatile uint8_t count; } MOTOR_Status; // ---------------------------------------------------------------------- diff --git a/2_Motor_Master/Motor_Master/Motor_Master/interrupts.h b/2_Motor_Master/Motor_Master/Motor_Master/interrupts.h index 229a9c2..df2f689 100644 --- a/2_Motor_Master/Motor_Master/Motor_Master/interrupts.h +++ b/2_Motor_Master/Motor_Master/Motor_Master/interrupts.h @@ -47,6 +47,19 @@ void TC4_Handler(void) } +static void M1_RESET_BAR(void) +{ + volatile int x = 0; +} + +static void M2_RESET_BAR(void) +{ + volatile int x = 0; +} + + + + #endif /* INTERRUPTS_H_ */ \ No newline at end of file diff --git a/2_Motor_Master/Motor_Master/Motor_Master/main.c b/2_Motor_Master/Motor_Master/Motor_Master/main.c index a91aa00..5ce61d2 100644 --- a/2_Motor_Master/Motor_Master/Motor_Master/main.c +++ b/2_Motor_Master/Motor_Master/Motor_Master/main.c @@ -55,6 +55,7 @@ static void One_ms_cycle_callback(const struct timer_task *const timer_task) } update_telemetry(); + update_setpoints(); //run_ECAT = true; } @@ -79,8 +80,9 @@ void One_ms_timer_init(void) void enable_NVIC_IRQ(void) { - //hri_tc_clear_INTEN_OVF_bit(TC2); - //hri_tc_clear_INTEN_OVF_bit(TC4); + + ext_irq_register(M1_RST_Bar, M1_RESET_BAR); + ext_irq_register(M2_RST_Bar, M2_RESET_BAR); NVIC_EnableIRQ(TC2_IRQn); // TC2: M1_Speed_Timer NVIC_EnableIRQ(TC4_IRQn); // TC4: M2_Speed_Timer NVIC_EnableIRQ(DMAC_0_IRQn);