@@ -712,23 +712,31 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
712
712
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0 };
713
713
htim1.Instance = TIM1;
714
714
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 ;
717
717
htim1.Init .ClockDivision = TIM_CLOCKDIVISION_DIV1;
718
- htim1.Init .RepetitionCounter = 0 ;
718
+ htim1.Init .RepetitionCounter = 1 ;
719
719
HAL_TIM_PWM_Init (&htim1);
720
720
721
721
htim8.Instance = TIM8;
722
722
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 ;
725
725
htim8.Init .ClockDivision = TIM_CLOCKDIVISION_DIV1;
726
- htim8.Init .RepetitionCounter = 0 ;
726
+ htim8.Init .RepetitionCounter = 1 ;
727
727
HAL_TIM_PWM_Init (&htim8);
728
728
729
729
sMasterConfig .MasterOutputTrigger = TIM_TRGO_RESET;
730
730
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
+
732
740
733
741
734
742
// Set TIM1 dead time values to 50 ns
@@ -739,7 +747,9 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
739
747
sBreakDeadTimeConfig .BreakState = TIM_BREAK_DISABLE;
740
748
sBreakDeadTimeConfig .BreakPolarity = TIM_BREAKPOLARITY_HIGH;
741
749
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" );}
743
753
744
754
// Set TIM8 dead time values to 50 ns
745
755
TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfigTIM8 = {0 };
@@ -750,9 +760,11 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
750
760
sBreakDeadTimeConfigTIM8 .BreakState = TIM_BREAK_DISABLE;
751
761
sBreakDeadTimeConfigTIM8 .BreakPolarity = TIM_BREAKPOLARITY_HIGH;
752
762
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" );}
754
766
755
- // Configure TIM1 channels 1-6 for PWM output
767
+ // Configure TIM1 channels 1-6 for PWM output
756
768
TIM_OC_InitTypeDef sConfigOC1 = {0 };
757
769
sConfigOC1 .OCMode = TIM_OCMODE_PWM1;
758
770
sConfigOC1 .Pulse = 0 ;
@@ -762,34 +774,91 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
762
774
TIM_OC_InitTypeDef sConfigOC2 = {0 };
763
775
sConfigOC2 .OCMode = TIM_OCMODE_PWM2;
764
776
sConfigOC2 .Pulse = 0 ;
765
- sConfigOC2 .OCPolarity = TIM_OCPOLARITY_HIGH ;
777
+ sConfigOC2 .OCPolarity = TIM_OCPOLARITY_LOW ;
766
778
sConfigOC2 .OCFastMode = TIM_OCFAST_DISABLE;
767
779
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
+
774
804
775
805
// 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.
778
821
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
+ */
779
826
780
827
781
828
// 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
+
784
853
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" );}
787
857
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" );}
790
861
791
- HAL_TIM_PWM_Start (&htim8, LL_TIM_CHANNEL_CH2);
792
- HAL_TIMEx_PWMN_Start (&htim8, LL_TIM_CHANNEL_CH2N);
793
862
794
863
795
864
// Configure TIM1 for PWM output
@@ -799,7 +868,7 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
799
868
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
800
869
TIM1->CCER |= TIM_CCER_CC1E | TIM_CCER_CC3E | TIM_CCER_CC4E; // Enable output on OC1, OC3, and OC4
801
870
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
803
872
TIM1->CCR1 = 0 ; // Set duty cycle to 0%
804
873
TIM1->CCR3 = 0 ; // Set duty cycle to 0%
805
874
TIM1->CCR4 = 0 ; // Set duty cycle to 0%
@@ -811,7 +880,7 @@ void* _configure8PWM(long pwm_frequency, float dead_zone)
811
880
TIM8->CCMR1 |= TIM_CCMR1_OC1PE | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM mode 1 on OC1
812
881
TIM8->CCER |= TIM_CCER_CC1E; // Enable output on OC1
813
882
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
815
884
TIM8->CCR1 = 0 ; // Set duty cycle to 0%
816
885
TIM8->BDTR |= TIM_BDTR_MOE; // Main output enable
817
886
0 commit comments