@@ -26,7 +26,15 @@ PinMap* timerPinsUsed[SIMPLEFOC_STM32_MAX_PINTIMERSUSED];
26
26
27
27
28
28
29
+ bool _getPwmState (void * params) {
30
+ // assume timers are synchronized and that there's at least one timer
31
+ HardwareTimer* pHT = ((STM32DriverParams*)params)->timers [0 ];
32
+ TIM_HandleTypeDef* htim = pHT->getHandle ();
33
+
34
+ bool dir = __HAL_TIM_IS_TIM_COUNTING_DOWN (htim);
29
35
36
+ return dir;
37
+ }
30
38
31
39
32
40
// setting pwm to hardware pin - instead analogWrite()
@@ -230,7 +238,7 @@ int _getInternalSourceTrigger(HardwareTimer* master, HardwareTimer* slave) { //
230
238
#endif
231
239
return -1 ;
232
240
}
233
- #elif defined(STM32F4xx) || defined(STM32F1xx) || defined(STM32L4xx)
241
+ #elif defined(STM32F4xx) || defined(STM32F1xx) || defined(STM32L4xx) || defined(STM32F7xx)
234
242
235
243
// function finds the appropriate timer source trigger for the master/slave timer combination
236
244
// returns -1 if no trigger source is found
@@ -303,6 +311,30 @@ int _getInternalSourceTrigger(HardwareTimer* master, HardwareTimer* slave) {
303
311
}
304
312
#endif
305
313
314
+ void syncTimerFrequency (long pwm_frequency, HardwareTimer *timers[], uint8_t num_timers) {
315
+ uint32_t max_frequency = 0 ;
316
+ uint32_t min_frequency = UINT32_MAX;
317
+ for (size_t i=0 ; i<num_timers; i++) {
318
+ uint32_t freq = timers[i]->getTimerClkFreq ();
319
+ if (freq > max_frequency) {
320
+ max_frequency = freq;
321
+ } else if (freq < min_frequency) {
322
+ min_frequency = freq;
323
+ }
324
+ }
325
+ if (max_frequency==min_frequency) return ;
326
+ uint32_t overflow_value = min_frequency/pwm_frequency;
327
+ for (size_t i=0 ; i<num_timers; i++) {
328
+ uint32_t prescale_factor = timers[i]->getTimerClkFreq ()/min_frequency;
329
+ #ifdef SIMPLEFOC_DEBUG
330
+ SIMPLEFOC_DEBUG (" STM32-DRV: Setting prescale to " , (float )prescale_factor);
331
+ SIMPLEFOC_DEBUG (" STM32-DRV: Setting Overflow to " , (float )overflow_value);
332
+ #endif
333
+ timers[i]->setPrescaleFactor (prescale_factor);
334
+ timers[i]->setOverflow (overflow_value,TICK_FORMAT);
335
+ timers[i]->refresh ();
336
+ }
337
+ }
306
338
307
339
void _alignTimersNew () {
308
340
int numTimers = 0 ;
@@ -382,7 +414,7 @@ void _alignTimersNew() {
382
414
// enable timer clock
383
415
for (int i=0 ; i<numTimers; i++) {
384
416
timers[i]->pause ();
385
- // timers[i]->refresh();
417
+ // timers[i]->refresh();
386
418
#ifdef SIMPLEFOC_STM32_DEBUG
387
419
SIMPLEFOC_DEBUG (" STM32-DRV: Restarting timer " , getTimerNumber (get_timer_index (timers[i]->getHandle ()->Instance )));
388
420
#endif
@@ -735,6 +767,8 @@ void* _configure2PWM(long pwm_frequency, const int pinA, const int pinB) {
735
767
736
768
HardwareTimer* HT1 = _initPinPWM (pwm_frequency, pinTimers[0 ]);
737
769
HardwareTimer* HT2 = _initPinPWM (pwm_frequency, pinTimers[1 ]);
770
+ HardwareTimer *timers[2 ] = {HT1, HT2};
771
+ syncTimerFrequency (pwm_frequency, timers, 2 );
738
772
// allign the timers
739
773
_alignPWMTimers (HT1, HT2, HT2);
740
774
@@ -779,6 +813,9 @@ void* _configure3PWM(long pwm_frequency,const int pinA, const int pinB, const in
779
813
HardwareTimer* HT2 = _initPinPWM (pwm_frequency, pinTimers[1 ]);
780
814
HardwareTimer* HT3 = _initPinPWM (pwm_frequency, pinTimers[2 ]);
781
815
816
+ HardwareTimer *timers[3 ] = {HT1, HT2, HT3};
817
+ syncTimerFrequency (pwm_frequency, timers, 3 );
818
+
782
819
uint32_t channel1 = STM_PIN_CHANNEL (pinTimers[0 ]->function );
783
820
uint32_t channel2 = STM_PIN_CHANNEL (pinTimers[1 ]->function );
784
821
uint32_t channel3 = STM_PIN_CHANNEL (pinTimers[2 ]->function );
@@ -821,6 +858,8 @@ void* _configure4PWM(long pwm_frequency,const int pinA, const int pinB, const in
821
858
HardwareTimer* HT2 = _initPinPWM (pwm_frequency, pinTimers[1 ]);
822
859
HardwareTimer* HT3 = _initPinPWM (pwm_frequency, pinTimers[2 ]);
823
860
HardwareTimer* HT4 = _initPinPWM (pwm_frequency, pinTimers[3 ]);
861
+ HardwareTimer *timers[4 ] = {HT1, HT2, HT3, HT4};
862
+ syncTimerFrequency (pwm_frequency, timers, 4 );
824
863
// allign the timers
825
864
_alignPWMTimers (HT1, HT2, HT3, HT4);
826
865
@@ -918,6 +957,8 @@ void* _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, cons
918
957
HardwareTimer* HT4 = _initPinPWMLow (pwm_frequency, pinTimers[3 ]);
919
958
HardwareTimer* HT5 = _initPinPWMHigh (pwm_frequency, pinTimers[4 ]);
920
959
HardwareTimer* HT6 = _initPinPWMLow (pwm_frequency, pinTimers[5 ]);
960
+ HardwareTimer *timers[6 ] = {HT1, HT2, HT3, HT4, HT5, HT6};
961
+ syncTimerFrequency (pwm_frequency, timers, 6 );
921
962
uint32_t channel1 = STM_PIN_CHANNEL (pinTimers[0 ]->function );
922
963
uint32_t channel2 = STM_PIN_CHANNEL (pinTimers[1 ]->function );
923
964
uint32_t channel3 = STM_PIN_CHANNEL (pinTimers[2 ]->function );
0 commit comments