9
9
#include " ../../hardware_api.h"
10
10
#include " ./rp2040_mcu.h"
11
11
#include " hardware/pwm.h"
12
+ #include " hardware/clocks.h"
12
13
13
14
#define _PWM_FREQUENCY 24000
14
15
#define _PWM_FREQUENCY_MAX 66000
15
- #define _PWM_FREQUENCY_MIN 5000
16
+ #define _PWM_FREQUENCY_MIN 1
16
17
17
18
18
19
@@ -30,12 +31,12 @@ void setupPWM(int pin, long pwm_frequency, bool invert, RP2040DriverParams* para
30
31
params->pins [index] = pin;
31
32
params->slice [index] = slice;
32
33
params->chan [index] = chan;
33
- uint32_t sysclock_hz = machine. freq () ;
34
+ uint32_t sysclock_hz = frequency_count_khz (CLOCKS_FC0_SRC_VALUE_CLK_SYS) * 1000 ;
34
35
uint32_t factor = 4096 * 2 * pwm_frequency;
35
36
uint32_t div = sysclock_hz / factor;
36
37
if (sysclock_hz % factor !=0 ) div+=1 ;
37
38
if (div < 16 ) div = 16 ;
38
- uint32_t wrapvalue = sysclock_hz *16 / div / pwm_frequency - 1 ;
39
+ uint32_t wrapvalue = ( sysclock_hz * 8 ) / div / pwm_frequency - 1 ;
39
40
#ifdef SIMPLEFOC_DEBUG_RP2040
40
41
SimpleFOCDebug::print (" Configuring pin " );
41
42
SimpleFOCDebug::print (pin);
@@ -50,7 +51,7 @@ void setupPWM(int pin, long pwm_frequency, bool invert, RP2040DriverParams* para
50
51
SimpleFOCDebug::print (" ." );
51
52
SimpleFOCDebug::print ((int )(div&0xF ));
52
53
SimpleFOCDebug::print (" top value " );
53
- SimpleFOCDebug::println (wrapvalue);
54
+ SimpleFOCDebug::println (( int ) wrapvalue);
54
55
#endif
55
56
if (wrapvalue < 999 )
56
57
SimpleFOCDebug::println (" Warning: PWM resolution is low." );
0 commit comments