6
6
7
7
#define SIMPLEFOC_DEBUG_RP2040
8
8
9
+ #include " ../hardware_api.h"
9
10
10
- #ifdef SIMPLEFOC_DEBUG_RP2040
11
11
12
- #ifndef SIMPLEFOC_RP2040_DEBUG_SERIAL
13
- #define SIMPLEFOC_RP2040_DEBUG_SERIAL Serial
14
- #endif
12
+ // these defines determine the polarity of the PWM output. Normally, the polarity is active-high,
13
+ // i.e. a high-level PWM output is expected to switch on the MOSFET. But should your driver design
14
+ // require inverted polarity, you can change the defines below, or set them via your build environment
15
+ // or board definition files.
15
16
17
+ // used for 2-PWM, 3-PWM, and 4-PWM modes
18
+ #ifndef SIMPLEFOC_PWM_ACTIVE_HIGH
19
+ #define SIMPLEFOC_PWM_ACTIVE_HIGH true
20
+ #endif
21
+ // used fof 6-PWM mode, high-side
22
+ #ifndef SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH
23
+ #define SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH true
24
+ #endif
25
+ // used fof 6-PWM mode, low-side
26
+ #ifndef SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH
27
+ #define SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH true
16
28
#endif
17
29
18
- #include " Arduino.h"
19
30
31
+ #define _PWM_FREQUENCY 24000
32
+ #define _PWM_FREQUENCY_MAX 66000
33
+ #define _PWM_FREQUENCY_MIN 5000
20
34
21
35
22
36
typedef struct RP2040DriverParams {
@@ -46,18 +60,18 @@ void setupPWM(int pin, long pwm_frequency, bool invert, RP2040DriverParams* para
46
60
pwm_set_phase_correct (slice, true );
47
61
uint16_t wrapvalue = ((125L * 1000L * 1000L ) / pwm_frequency) / 2L - 1L ;
48
62
if (wrapvalue < 999 ) wrapvalue = 999 ; // 66kHz, resolution 1000
49
- if (wrapvalue > 3299 ) wrapvalue = 3299 ; // 20kHz, resolution 3300
63
+ if (wrapvalue > 12499 ) wrapvalue = 12499 ; // 20kHz, resolution 12500
50
64
#ifdef SIMPLEFOC_DEBUG_RP2040
51
- SIMPLEFOC_RP2040_DEBUG_SERIAL. print (" Configuring pin " );
52
- SIMPLEFOC_RP2040_DEBUG_SERIAL. print (pin);
53
- SIMPLEFOC_RP2040_DEBUG_SERIAL. print (" slice " );
54
- SIMPLEFOC_RP2040_DEBUG_SERIAL. print (slice);
55
- SIMPLEFOC_RP2040_DEBUG_SERIAL. print (" channel " );
56
- SIMPLEFOC_RP2040_DEBUG_SERIAL. print (chan);
57
- SIMPLEFOC_RP2040_DEBUG_SERIAL. print (" frequency " );
58
- SIMPLEFOC_RP2040_DEBUG_SERIAL. print (pwm_frequency);
59
- SIMPLEFOC_RP2040_DEBUG_SERIAL. print (" top value " );
60
- SIMPLEFOC_RP2040_DEBUG_SERIAL. println (wrapvalue);
65
+ SimpleFOCDebug:: print (" Configuring pin " );
66
+ SimpleFOCDebug:: print (pin);
67
+ SimpleFOCDebug:: print (" slice " );
68
+ SimpleFOCDebug:: print (( int ) slice);
69
+ SimpleFOCDebug:: print (" channel " );
70
+ SimpleFOCDebug:: print (( int ) chan);
71
+ SimpleFOCDebug:: print (" frequency " );
72
+ SimpleFOCDebug:: print (( int ) pwm_frequency);
73
+ SimpleFOCDebug:: print (" top value " );
74
+ SimpleFOCDebug:: println (wrapvalue);
61
75
#endif
62
76
pwm_set_wrap (slice, wrapvalue);
63
77
wrapvalues[slice] = wrapvalue;
@@ -83,9 +97,11 @@ void syncSlices() {
83
97
84
98
void * _configure2PWM (long pwm_frequency, const int pinA, const int pinB) {
85
99
RP2040DriverParams* params = new RP2040DriverParams ();
100
+ if ( !pwm_frequency || !_isset (pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
101
+ else pwm_frequency = _constrain (pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
86
102
params->pwm_frequency = pwm_frequency;
87
- setupPWM (pinA, pwm_frequency, false , params, 0 );
88
- setupPWM (pinB, pwm_frequency, false , params, 1 );
103
+ setupPWM (pinA, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH , params, 0 );
104
+ setupPWM (pinB, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH , params, 1 );
89
105
syncSlices ();
90
106
return params;
91
107
}
@@ -94,10 +110,12 @@ void* _configure2PWM(long pwm_frequency, const int pinA, const int pinB) {
94
110
95
111
void * _configure3PWM (long pwm_frequency, const int pinA, const int pinB, const int pinC) {
96
112
RP2040DriverParams* params = new RP2040DriverParams ();
113
+ if ( !pwm_frequency || !_isset (pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
114
+ else pwm_frequency = _constrain (pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
97
115
params->pwm_frequency = pwm_frequency;
98
- setupPWM (pinA, pwm_frequency, false , params, 0 );
99
- setupPWM (pinB, pwm_frequency, false , params, 1 );
100
- setupPWM (pinC, pwm_frequency, false , params, 2 );
116
+ setupPWM (pinA, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH , params, 0 );
117
+ setupPWM (pinB, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH , params, 1 );
118
+ setupPWM (pinC, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH , params, 2 );
101
119
syncSlices ();
102
120
return params;
103
121
}
@@ -107,11 +125,13 @@ void* _configure3PWM(long pwm_frequency, const int pinA, const int pinB, const i
107
125
108
126
void * _configure4PWM (long pwm_frequency, const int pin1A, const int pin1B, const int pin2A, const int pin2B) {
109
127
RP2040DriverParams* params = new RP2040DriverParams ();
128
+ if ( !pwm_frequency || !_isset (pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
129
+ else pwm_frequency = _constrain (pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
110
130
params->pwm_frequency = pwm_frequency;
111
- setupPWM (pin1A, pwm_frequency, false , params, 0 );
112
- setupPWM (pin1B, pwm_frequency, false , params, 1 );
113
- setupPWM (pin2A, pwm_frequency, false , params, 2 );
114
- setupPWM (pin2B, pwm_frequency, false , params, 3 );
131
+ setupPWM (pin1A, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH , params, 0 );
132
+ setupPWM (pin1B, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH , params, 1 );
133
+ setupPWM (pin2A, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH , params, 2 );
134
+ setupPWM (pin2B, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH , params, 3 );
115
135
syncSlices ();
116
136
return params;
117
137
}
@@ -120,14 +140,16 @@ void* _configure4PWM(long pwm_frequency, const int pin1A, const int pin1B, const
120
140
void * _configure6PWM (long pwm_frequency, float dead_zone, const int pinA_h, const int pinA_l, const int pinB_h, const int pinB_l, const int pinC_h, const int pinC_l) {
121
141
// non-PIO solution...
122
142
RP2040DriverParams* params = new RP2040DriverParams ();
143
+ if ( !pwm_frequency || !_isset (pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY;
144
+ else pwm_frequency = _constrain (pwm_frequency, _PWM_FREQUENCY_MIN, _PWM_FREQUENCY_MAX);
123
145
params->pwm_frequency = pwm_frequency;
124
146
params->dead_zone = dead_zone;
125
- setupPWM (pinA_h, pwm_frequency, false , params, 0 );
126
- setupPWM (pinB_h, pwm_frequency, false , params, 2 );
127
- setupPWM (pinC_h, pwm_frequency, false , params, 4 );
128
- setupPWM (pinA_l, pwm_frequency, true , params, 1 );
129
- setupPWM (pinB_l, pwm_frequency, true , params, 3 );
130
- setupPWM (pinC_l, pwm_frequency, true , params, 5 );
147
+ setupPWM (pinA_h, pwm_frequency, !SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH , params, 0 );
148
+ setupPWM (pinB_h, pwm_frequency, !SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH , params, 2 );
149
+ setupPWM (pinC_h, pwm_frequency, !SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH , params, 4 );
150
+ setupPWM (pinA_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH , params, 1 );
151
+ setupPWM (pinB_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH , params, 3 );
152
+ setupPWM (pinC_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH , params, 5 );
131
153
syncSlices ();
132
154
return params;
133
155
}
0 commit comments