Skip to content

Commit aa2f9a8

Browse files
committed
Update stm32_mcu.cpp
1 parent 4d1ee20 commit aa2f9a8

File tree

1 file changed

+98
-29
lines changed

1 file changed

+98
-29
lines changed

src/drivers/hardware_specific/stm32/stm32_mcu.cpp

Lines changed: 98 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -712,23 +712,31 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
712712
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
713713
htim1.Instance = TIM1;
714714
htim1.Init.Prescaler = 0;
715-
htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
716-
htim1.Init.Period = 65536;
715+
htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3;
716+
htim1.Init.Period = 4359;
717717
htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
718-
htim1.Init.RepetitionCounter = 0;
718+
htim1.Init.RepetitionCounter = 1;
719719
HAL_TIM_PWM_Init(&htim1);
720720

721721
htim8.Instance = TIM8;
722722
htim8.Init.Prescaler = 0;
723-
htim8.Init.CounterMode = TIM_COUNTERMODE_UP;
724-
htim8.Init.Period = 65536;
723+
htim8.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED3;
724+
htim8.Init.Period = 4359;
725725
htim8.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
726-
htim8.Init.RepetitionCounter = 0;
726+
htim8.Init.RepetitionCounter = 1;
727727
HAL_TIM_PWM_Init(&htim8);
728728

729729
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
730730
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
731-
HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig);
731+
if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig)!= HAL_OK)
732+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
733+
}else{Serial.println("Timer TIM1 Synced OK!");}
734+
735+
if (HAL_TIMEx_MasterConfigSynchronization(&htim8, &sMasterConfig)!= HAL_OK)
736+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
737+
}else{Serial.println("Timer TIM8 Synced OK!");}
738+
739+
732740

733741

734742
// Set TIM1 dead time values to 50 ns
@@ -739,7 +747,9 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
739747
sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
740748
sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
741749
sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
742-
HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig);
750+
if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig)!= HAL_OK)
751+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
752+
}else{Serial.println("TIM1 DeadTime Set");}
743753

744754
// Set TIM8 dead time values to 50 ns
745755
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfigTIM8 = {0};
@@ -750,9 +760,11 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
750760
sBreakDeadTimeConfigTIM8.BreakState = TIM_BREAK_DISABLE;
751761
sBreakDeadTimeConfigTIM8.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
752762
sBreakDeadTimeConfigTIM8.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
753-
HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfigTIM8);
763+
if (HAL_TIMEx_ConfigBreakDeadTime(&htim8, &sBreakDeadTimeConfigTIM8)!= HAL_OK)
764+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
765+
}else{Serial.println("TIM8 DeadTime Set");}
754766

755-
// Configure TIM1 channels 1-6 for PWM output
767+
// Configure TIM1 channels 1-6 for PWM output
756768
TIM_OC_InitTypeDef sConfigOC1 = {0};
757769
sConfigOC1.OCMode = TIM_OCMODE_PWM1;
758770
sConfigOC1.Pulse = 0;
@@ -762,34 +774,91 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
762774
TIM_OC_InitTypeDef sConfigOC2 = {0};
763775
sConfigOC2.OCMode = TIM_OCMODE_PWM2;
764776
sConfigOC2.Pulse = 0;
765-
sConfigOC2.OCPolarity = TIM_OCPOLARITY_HIGH;
777+
sConfigOC2.OCPolarity = TIM_OCPOLARITY_LOW;
766778
sConfigOC2.OCFastMode = TIM_OCFAST_DISABLE;
767779

768-
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC1, LL_TIM_CHANNEL_CH1);
769-
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC2, LL_TIM_CHANNEL_CH1N);
770-
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC1, LL_TIM_CHANNEL_CH2);
771-
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC2, LL_TIM_CHANNEL_CH2N);
772-
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC1, LL_TIM_CHANNEL_CH3);
773-
HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC2, LL_TIM_CHANNEL_CH3N);
780+
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC1, LL_TIM_CHANNEL_CH1)!= HAL_OK)
781+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
782+
}else{Serial.println("CH1 Config OK");}
783+
784+
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC2, LL_TIM_CHANNEL_CH1N)!= HAL_OK)
785+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
786+
}else{Serial.println("CH1N Config OK");}
787+
788+
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC1, LL_TIM_CHANNEL_CH2)!= HAL_OK)
789+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
790+
}else{Serial.println("CH2 Config OK");}
791+
792+
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC2, LL_TIM_CHANNEL_CH2N)!= HAL_OK)
793+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
794+
}else{Serial.println("CH2N Config OK");}
795+
796+
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC1, LL_TIM_CHANNEL_CH3)!= HAL_OK)
797+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
798+
}else{Serial.println("CH3 Config OK");}
799+
800+
if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC2, LL_TIM_CHANNEL_CH3N)!= HAL_OK)
801+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
802+
}else{Serial.println("CH3N Config OK");}
803+
774804

775805
// Configure PWM output on TIM8 channel 1 and additional channel
776-
HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC1, LL_TIM_CHANNEL_CH2);
777-
HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC2, LL_TIM_CHANNEL_CH2N);
806+
if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC1, LL_TIM_CHANNEL_CH2)!= HAL_OK)
807+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
808+
}else{Serial.println("TIM8_CH2 Config OK");}
809+
810+
if (HAL_TIM_PWM_ConfigChannel(&htim8, &sConfigOC2, LL_TIM_CHANNEL_CH2N)!= HAL_OK)
811+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
812+
}else{Serial.println("TIM8_CH2N Config OK");}
813+
814+
815+
/*
816+
817+
For TIM1, you have CH1 and CH1N as complementary outputs, CH2 and CH2N as complementary outputs,
818+
and CH3 and CH3N as complementary outputs.
819+
820+
For TIM8, you have CH2 and CH2N as complementary outputs.
778821
822+
Complementary outputs are a pair of signals where one is the inverse of the other,
823+
and they are used for driving push-pull outputs such as MOSFETs.
824+
825+
*/
779826

780827

781828
// Enable PWM outputs
782-
HAL_TIM_PWM_Start(&htim1, LL_TIM_CHANNEL_CH1);
783-
HAL_TIMEx_PWMN_Start(&htim1, LL_TIM_CHANNEL_CH1N);
829+
if( HAL_TIM_PWM_Start(&htim1, LL_TIM_CHANNEL_CH1)!= HAL_OK)
830+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
831+
}else{Serial.println("CH1 Start OK");}
832+
833+
if (HAL_TIMEx_PWMN_Start(&htim1, LL_TIM_CHANNEL_CH1N)!= HAL_OK)
834+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
835+
}else{Serial.println("CH1N Start OK");}
836+
837+
if (HAL_TIM_PWM_Start(&htim1, LL_TIM_CHANNEL_CH2)!= HAL_OK)
838+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
839+
}else{Serial.println("CH2 Start OK");}
840+
841+
if (HAL_TIMEx_PWMN_Start(&htim1, LL_TIM_CHANNEL_CH2N)!= HAL_OK)
842+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
843+
}else{Serial.println("CH2N Start OK");}
844+
845+
if(HAL_TIM_PWM_Start(&htim1, LL_TIM_CHANNEL_CH3)!= HAL_OK)
846+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
847+
}else{Serial.println("CH3 Start OK");}
848+
849+
if( HAL_TIMEx_PWMN_Start(&htim1, LL_TIM_CHANNEL_CH3N)!= HAL_OK)
850+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
851+
}else{Serial.println("CH3N Start OK");}
852+
784853

785-
HAL_TIM_PWM_Start(&htim1, LL_TIM_CHANNEL_CH2);
786-
HAL_TIMEx_PWMN_Start(&htim1, LL_TIM_CHANNEL_CH2N);
854+
if (HAL_TIM_PWM_Start(&htim8, LL_TIM_CHANNEL_CH2)!= HAL_OK)
855+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
856+
}else{Serial.println("TIM8_CH2 Start OK");}
787857

788-
HAL_TIM_PWM_Start(&htim1, LL_TIM_CHANNEL_CH3);
789-
HAL_TIMEx_PWMN_Start(&htim1, LL_TIM_CHANNEL_CH3N);
858+
if (HAL_TIMEx_PWMN_Start(&htim8, LL_TIM_CHANNEL_CH2N)!= HAL_OK)
859+
{return (STM32DriverParams*)SIMPLEFOC_DRIVER_INIT_FAILED;
860+
}else{Serial.println("TIM8_CH2N Start OK");}
790861

791-
HAL_TIM_PWM_Start(&htim8, LL_TIM_CHANNEL_CH2);
792-
HAL_TIMEx_PWMN_Start(&htim8, LL_TIM_CHANNEL_CH2N);
793862

794863

795864
// Configure TIM1 for PWM output
@@ -799,7 +868,7 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
799868
TIM1->CCMR2 |= TIM_CCMR2_OC3PE | TIM_CCMR2_OC4PE | TIM_CCMR2_OC3M_1 | TIM_CCMR2_OC3M_2 | TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2; // PWM mode 1 on OC3 and OC4
800869
TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC3E | TIM_CCER_CC4E; // Enable output on OC1, OC3, and OC4
801870
TIM1->PSC = 0; // Set prescaler to 0
802-
TIM1->ARR = (SystemCoreClock / (38000 * 2)) - 1; // Set auto-reload value for 38kHz frequency
871+
TIM1->ARR = (168000000 / (38000 * 2)) - 1; // Set auto-reload value for 38kHz frequency
803872
TIM1->CCR1 = 0; // Set duty cycle to 0%
804873
TIM1->CCR3 = 0; // Set duty cycle to 0%
805874
TIM1->CCR4 = 0; // Set duty cycle to 0%
@@ -811,7 +880,7 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
811880
TIM8->CCMR1 |= TIM_CCMR1_OC1PE | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM mode 1 on OC1
812881
TIM8->CCER |= TIM_CCER_CC1E; // Enable output on OC1
813882
TIM8->PSC = 0; // Set prescaler to 0
814-
TIM8->ARR = (SystemCoreClock / (38000 * 2)) - 1; // Set auto-reload value for 38kHz frequency
883+
TIM8->ARR = (168000000 / (38000 * 2)) - 1; // Set auto-reload value for 38kHz frequency
815884
TIM8->CCR1 = 0; // Set duty cycle to 0%
816885
TIM8->BDTR |= TIM_BDTR_MOE; // Main output enable
817886

0 commit comments

Comments
 (0)