Skip to content

Commit 581af18

Browse files
author
Richard Unger
committed
add ability to reverse PWM polarity on RP2040
1 parent 84cc799 commit 581af18

File tree

1 file changed

+44
-31
lines changed

1 file changed

+44
-31
lines changed

src/drivers/hardware_specific/rp2040_mcu.cpp

Lines changed: 44 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,28 @@
77
#define SIMPLEFOC_DEBUG_RP2040
88

99

10-
#ifdef SIMPLEFOC_DEBUG_RP2040
1110

12-
#ifndef SIMPLEFOC_RP2040_DEBUG_SERIAL
13-
#define SIMPLEFOC_RP2040_DEBUG_SERIAL Serial
14-
#endif
11+
#include "Arduino.h"
12+
#include "communication/SimpleFOCDebug.h"
1513

16-
#endif
1714

18-
#include "Arduino.h"
15+
// these defines determine the polarity of the PWM output. Normally, the polarity is active-high,
16+
// i.e. a high-level PWM output is expected to switch on the MOSFET. But should your driver design
17+
// require inverted polarity, you can change the defines below, or set them via your build environment
18+
// or board definition files.
19+
20+
// used for 2-PWM, 3-PWM, and 4-PWM modes
21+
#ifndef SIMPLEFOC_PWM_ACTIVE_HIGH
22+
#define SIMPLEFOC_PWM_ACTIVE_HIGH true
23+
#endif
24+
// used fof 6-PWM mode, high-side
25+
#ifndef SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH
26+
#define SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH true
27+
#endif
28+
// used fof 6-PWM mode, low-side
29+
#ifndef SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH
30+
#define SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH true
31+
#endif
1932

2033

2134

@@ -48,16 +61,16 @@ void setupPWM(int pin, long pwm_frequency, bool invert, RP2040DriverParams* para
4861
if (wrapvalue < 999) wrapvalue = 999; // 66kHz, resolution 1000
4962
if (wrapvalue > 3299) wrapvalue = 3299; // 20kHz, resolution 3300
5063
#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);
64+
SimpleFOCDebug::print("Configuring pin ");
65+
SimpleFOCDebug::print(pin);
66+
SimpleFOCDebug::print(" slice ");
67+
SimpleFOCDebug::print((int)slice);
68+
SimpleFOCDebug::print(" channel ");
69+
SimpleFOCDebug::print((int)chan);
70+
SimpleFOCDebug::print(" frequency ");
71+
SimpleFOCDebug::print((int)pwm_frequency);
72+
SimpleFOCDebug::print(" top value ");
73+
SimpleFOCDebug::println(wrapvalue);
6174
#endif
6275
pwm_set_wrap(slice, wrapvalue);
6376
wrapvalues[slice] = wrapvalue;
@@ -84,8 +97,8 @@ void syncSlices() {
8497
void* _configure2PWM(long pwm_frequency, const int pinA, const int pinB) {
8598
RP2040DriverParams* params = new RP2040DriverParams();
8699
params->pwm_frequency = pwm_frequency;
87-
setupPWM(pinA, pwm_frequency, false, params, 0);
88-
setupPWM(pinB, pwm_frequency, false, params, 1);
100+
setupPWM(pinA, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH, params, 0);
101+
setupPWM(pinB, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH, params, 1);
89102
syncSlices();
90103
return params;
91104
}
@@ -95,9 +108,9 @@ void* _configure2PWM(long pwm_frequency, const int pinA, const int pinB) {
95108
void* _configure3PWM(long pwm_frequency, const int pinA, const int pinB, const int pinC) {
96109
RP2040DriverParams* params = new RP2040DriverParams();
97110
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);
111+
setupPWM(pinA, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH, params, 0);
112+
setupPWM(pinB, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH, params, 1);
113+
setupPWM(pinC, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH, params, 2);
101114
syncSlices();
102115
return params;
103116
}
@@ -108,10 +121,10 @@ void* _configure3PWM(long pwm_frequency, const int pinA, const int pinB, const i
108121
void* _configure4PWM(long pwm_frequency, const int pin1A, const int pin1B, const int pin2A, const int pin2B) {
109122
RP2040DriverParams* params = new RP2040DriverParams();
110123
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);
124+
setupPWM(pin1A, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH, params, 0);
125+
setupPWM(pin1B, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH, params, 1);
126+
setupPWM(pin2A, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH, params, 2);
127+
setupPWM(pin2B, pwm_frequency, !SIMPLEFOC_PWM_ACTIVE_HIGH, params, 3);
115128
syncSlices();
116129
return params;
117130
}
@@ -122,12 +135,12 @@ void* _configure6PWM(long pwm_frequency, float dead_zone, const int pinA_h, cons
122135
RP2040DriverParams* params = new RP2040DriverParams();
123136
params->pwm_frequency = pwm_frequency;
124137
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);
138+
setupPWM(pinA_h, pwm_frequency, !SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 0);
139+
setupPWM(pinB_h, pwm_frequency, !SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 2);
140+
setupPWM(pinC_h, pwm_frequency, !SIMPLEFOC_PWM_HIGHSIDE_ACTIVE_HIGH, params, 4);
141+
setupPWM(pinA_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 1);
142+
setupPWM(pinB_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 3);
143+
setupPWM(pinC_l, pwm_frequency, SIMPLEFOC_PWM_LOWSIDE_ACTIVE_HIGH, params, 5);
131144
syncSlices();
132145
return params;
133146
}

0 commit comments

Comments
 (0)