diff --git a/Inc/main.h b/Inc/main.h index d15cd843..ab117fc0 100644 --- a/Inc/main.h +++ b/Inc/main.h @@ -50,9 +50,9 @@ /* USER CODE END Includes */ /* Private define ------------------------------------------------------------*/ -#define TIM_CLOCK_HZ 168000000 -#define TIM_PERIOD_CLOCKS 8192 -// #define TIM_PERIOD_CLOCKS 4096 +#define TIM_1_8_CLOCK_HZ 168000000 +// #define TIM_1_8_PERIOD_CLOCKS 4096 +#define TIM_1_8_PERIOD_CLOCKS 8192 #define TIM_DEADTIME_CLOCKS 20 #define M0_nCS_Pin GPIO_PIN_13 @@ -137,8 +137,8 @@ #define M1_ENC_B_GPIO_Port GPIOB /* USER CODE BEGIN Private defines */ -#define CURRENT_MEAS_PERIOD ((float)(2*TIM_PERIOD_CLOCKS)/(float)TIM_CLOCK_HZ) -#define CURRENT_MEAS_HZ (TIM_CLOCK_HZ/(2*TIM_PERIOD_CLOCKS)) +#define CURRENT_MEAS_PERIOD ((float)(2*TIM_1_8_CLOCK_HZ)/(float)TIM_1_8_CLOCK_HZ) +#define CURRENT_MEAS_HZ (TIM_1_8_CLOCK_HZ/(2*TIM_1_8_CLOCK_HZ)) /* USER CODE END Private defines */ diff --git a/MotorControl/low_level.c b/MotorControl/low_level.c index 42b5468d..f8ffeabd 100644 --- a/MotorControl/low_level.c +++ b/MotorControl/low_level.c @@ -35,8 +35,8 @@ Motor_t motors[] = { .motor_thread = 0, .thread_ready = false, .motor_timer = &htim1, - .next_timings = {TIM_PERIOD_CLOCKS/2, TIM_PERIOD_CLOCKS/2, TIM_PERIOD_CLOCKS/2}, - .control_deadline = TIM_PERIOD_CLOCKS, + .next_timings = {TIM_1_8_PERIOD_CLOCKS/2, TIM_1_8_PERIOD_CLOCKS/2, TIM_1_8_PERIOD_CLOCKS/2}, + .control_deadline = TIM_1_8_PERIOD_CLOCKS, .current_meas = {0.0f, 0.0f}, .DC_calib = {0.0f, 0.0f}, .gate_driver = { @@ -72,8 +72,8 @@ Motor_t motors[] = { .motor_thread = 0, .thread_ready = false, .motor_timer = &htim8, - .next_timings = {TIM_PERIOD_CLOCKS/2, TIM_PERIOD_CLOCKS/2, TIM_PERIOD_CLOCKS/2}, - .control_deadline = (3*TIM_PERIOD_CLOCKS)/2, + .next_timings = {TIM_1_8_PERIOD_CLOCKS/2, TIM_1_8_PERIOD_CLOCKS/2, TIM_1_8_PERIOD_CLOCKS/2}, + .control_deadline = (3*TIM_1_8_PERIOD_CLOCKS)/2, .current_meas = {0.0f, 0.0f}, .DC_calib = {0.0f, 0.0f}, .gate_driver = { @@ -211,12 +211,14 @@ static void start_adc_pwm(){ start_pwm(&htim1); start_pwm(&htim8); //TODO: explain why this offset - sync_timers(&htim1, &htim8, TIM_CLOCKSOURCE_ITR0, TIM_PERIOD_CLOCKS/2 - 1*128); + sync_timers(&htim1, &htim8, TIM_CLOCKSOURCE_ITR0, TIM_1_8_PERIOD_CLOCKS/2 - 1*128); + + HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_3); } static void start_pwm(TIM_HandleTypeDef* htim){ //Init PWM - int half_load = TIM_PERIOD_CLOCKS/2; + int half_load = TIM_1_8_PERIOD_CLOCKS/2; htim->Instance->CCR1 = half_load; htim->Instance->CCR2 = half_load; htim->Instance->CCR3 = half_load; @@ -461,8 +463,8 @@ static uint16_t check_timing(TIM_HandleTypeDef* htim, volatile uint16_t* log, vo uint16_t timing = htim->Instance->CNT; bool down = htim->Instance->CR1 & TIM_CR1_DIR; if (down) { - uint16_t delta = TIM_PERIOD_CLOCKS - timing; - timing = TIM_PERIOD_CLOCKS + delta; + uint16_t delta = TIM_1_8_PERIOD_CLOCKS - timing; + timing = TIM_1_8_PERIOD_CLOCKS + delta; } if (log != NULL && idx != NULL) { @@ -503,9 +505,9 @@ static float measure_phase_resistance(Motor_t* motor, float test_current, float static void queue_modulation_timings(Motor_t* motor, float mod_alpha, float mod_beta) { float tA, tB, tC; SVM(mod_alpha, mod_beta, &tA, &tB, &tC); - motor->next_timings[0] = (uint16_t)(tA * (float)TIM_PERIOD_CLOCKS); - motor->next_timings[1] = (uint16_t)(tB * (float)TIM_PERIOD_CLOCKS); - motor->next_timings[2] = (uint16_t)(tC * (float)TIM_PERIOD_CLOCKS); + motor->next_timings[0] = (uint16_t)(tA * (float)TIM_1_8_PERIOD_CLOCKS); + motor->next_timings[1] = (uint16_t)(tB * (float)TIM_1_8_PERIOD_CLOCKS); + motor->next_timings[2] = (uint16_t)(tC * (float)TIM_1_8_PERIOD_CLOCKS); } static void queue_voltage_timings(Motor_t* motor, float v_alpha, float v_beta) { diff --git a/Odrive.ioc b/Odrive.ioc index 50bdd67b..0952d8fe 100755 --- a/Odrive.ioc +++ b/Odrive.ioc @@ -157,7 +157,7 @@ Mcu.Pin7=PC2 Mcu.Pin8=PC3 Mcu.Pin9=PA0-WKUP Mcu.PinsNb=55 -Mcu.UserConstants=TIM_CLOCK_HZ,168000000;TIM_PERIOD_CLOCKS,8192;TIM_DEADTIME_CLOCKS,20 +Mcu.UserConstants=TIM_1_8_CLOCK_HZ,168000000;TIM_1_8_PERIOD_CLOCKS,8192;TIM_DEADTIME_CLOCKS,20 Mcu.UserName=STM32F405RGTx MxCube.Version=4.19.0 MxDb.Version=DB.4.0.190 @@ -500,7 +500,7 @@ TIM1.OCNPolarity_2=TIM_OCNPOLARITY_HIGH TIM1.OCNPolarity_3=TIM_OCNPOLARITY_HIGH TIM1.OffStateIDLEMode=TIM_OSSI_ENABLE TIM1.OffStateRunMode=TIM_OSSR_ENABLE -TIM1.Period=TIM_PERIOD_CLOCKS +TIM1.Period=TIM_1_8_PERIOD_CLOCKS TIM1.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE TIM2.Channel-PWM\ Generation3\ CH3=TIM_CHANNEL_3 TIM2.Channel-PWM\ Generation4\ CH4=TIM_CHANNEL_4 @@ -509,8 +509,8 @@ TIM2.IPParameters=Channel-PWM Generation3 CH3,Channel-PWM Generation4 CH4,Counte TIM2.OCMode_PWM-PWM\ Generation3\ CH3=TIM_OCMODE_PWM2 TIM2.OCMode_PWM-PWM\ Generation4\ CH4=TIM_OCMODE_PWM2 TIM2.OCPolarity_3=TIM_OCPOLARITY_LOW -TIM2.Period=TIM_PERIOD_CLOCKS -TIM2.Pulse-PWM\ Generation4\ CH4=TIM_PERIOD_CLOCKS+1 +TIM2.Period=TIM_1_8_PERIOD_CLOCKS +TIM2.Pulse-PWM\ Generation4\ CH4=TIM_1_8_PERIOD_CLOCKS+1 TIM3.EncoderMode=TIM_ENCODERMODE_TI12 TIM3.IC1Filter=4 TIM3.IC1Polarity=TIM_ICPOLARITY_RISING @@ -536,7 +536,7 @@ TIM8.OCMode_PWM-PWM\ Generation2\ CH2\ CH2N=TIM_OCMODE_PWM2 TIM8.OCMode_PWM-PWM\ Generation3\ CH3\ CH3N=TIM_OCMODE_PWM2 TIM8.OffStateIDLEMode=TIM_OSSI_ENABLE TIM8.OffStateRunMode=TIM_OSSR_ENABLE -TIM8.Period=TIM_PERIOD_CLOCKS +TIM8.Period=TIM_1_8_PERIOD_CLOCKS TIM8.TIM_MasterOutputTrigger=TIM_TRGO_UPDATE VP_FREERTOS_VS_ENABLE.Mode=Enabled VP_FREERTOS_VS_ENABLE.Signal=FREERTOS_VS_ENABLE diff --git a/Src/tim.c b/Src/tim.c index 1cd9d28a..d7d6949c 100644 --- a/Src/tim.c +++ b/Src/tim.c @@ -86,7 +86,7 @@ void MX_TIM1_Init(void) htim1.Instance = TIM1; htim1.Init.Prescaler = 0; htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3; - htim1.Init.Period = TIM_PERIOD_CLOCKS; + htim1.Init.Period = TIM_1_8_PERIOD_CLOCKS; htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; if (HAL_TIM_Base_Init(&htim1) != HAL_OK) @@ -169,7 +169,7 @@ void MX_TIM2_Init(void) htim2.Instance = TIM2; htim2.Init.Prescaler = 0; htim2.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3; - htim2.Init.Period = TIM_PERIOD_CLOCKS; + htim2.Init.Period = TIM_1_8_PERIOD_CLOCKS; htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; if (HAL_TIM_PWM_Init(&htim2) != HAL_OK) { @@ -192,7 +192,7 @@ void MX_TIM2_Init(void) Error_Handler(); } - sConfigOC.Pulse = TIM_PERIOD_CLOCKS+1; + sConfigOC.Pulse = TIM_1_8_PERIOD_CLOCKS+1; sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_4) != HAL_OK) { @@ -279,7 +279,7 @@ void MX_TIM8_Init(void) htim8.Instance = TIM8; htim8.Init.Prescaler = 0; htim8.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3; - htim8.Init.Period = TIM_PERIOD_CLOCKS; + htim8.Init.Period = TIM_1_8_PERIOD_CLOCKS; htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim8.Init.RepetitionCounter = 0; if (HAL_TIM_Base_Init(&htim8) != HAL_OK)