Skip to content

Commit 7d04fa5

Browse files
committed
separation of the esp32 mcpwm and ledc implementation
1 parent 94c102b commit 7d04fa5

File tree

2 files changed

+71
-1
lines changed

2 files changed

+71
-1
lines changed

src/drivers/hardware_specific/esp32_mcu.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "../hardware_api.h"
22

3-
#if defined(ESP_H) && defined(ARDUINO_ARCH_ESP32)
3+
#if defined(ESP_H) && defined(ARDUINO_ARCH_ESP32) && defined(SOC_MCPWM_SUPPORTED)
44

55
#include "driver/mcpwm.h"
66
#include "soc/mcpwm_reg.h"
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
#include "../hardware_api.h"
2+
3+
#if defined(ESP_H) && defined(ARDUINO_ARCH_ESP32) !defined(SOC_MCPWM_SUPPORTED)
4+
5+
#include "driver/ledc.h"
6+
7+
#define _PWM_FREQUENCY 25000 // 25khz
8+
#define _PWM_FREQUENCY_MAX 38000 // 38khz max to be able to have 10 bit pwm resolution
9+
#define _PWM_RES_BIT 10 // 10 bir resolution
10+
#define _PWM_RES 1023 // 2^10-1 = 1023-1
11+
12+
13+
// configure High PWM frequency
14+
void _setHighFrequency(const long freq, const int pin, const int channel){
15+
ledcSetup(channel, freq, _PWM_RES_BIT );
16+
ledcAttachPin(pin, channel);
17+
}
18+
19+
void _configure2PWM(long pwm_frequency, const int pinA, const int pinB) {
20+
if(!pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
21+
else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to 50kHz max
22+
_setHighFrequency(pwm_frequency, pinA, LEDC_CHANNEL_0);
23+
_setHighFrequency(pwm_frequency, pinB, LEDC_CHANNEL_1);
24+
}
25+
26+
void _configure3PWM(long pwm_frequency,const int pinA, const int pinB, const int pinC) {
27+
if(!pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
28+
else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to 50kHz max
29+
_setHighFrequency(pwm_frequency, pinA, LEDC_CHANNEL_0);
30+
_setHighFrequency(pwm_frequency, pinB, LEDC_CHANNEL_1);
31+
_setHighFrequency(pwm_frequency, pinC, LEDC_CHANNEL_2);
32+
}
33+
34+
void _configure4PWM(long pwm_frequency,const int pinA, const int pinB, const int pinC, const int pinD) {
35+
if(!pwm_frequency || !_isset(pwm_frequency) ) pwm_frequency = _PWM_FREQUENCY; // default frequency 25khz
36+
else pwm_frequency = _constrain(pwm_frequency, 0, _PWM_FREQUENCY_MAX); // constrain to 50kHz max
37+
_setHighFrequency(pwm_frequency, pinA, LEDC_CHANNEL_0);
38+
_setHighFrequency(pwm_frequency, pinB, LEDC_CHANNEL_1);
39+
_setHighFrequency(pwm_frequency, pinC, LEDC_CHANNEL_2);
40+
_setHighFrequency(pwm_frequency, pinD, LEDC_CHANNEL_3);
41+
}
42+
43+
void _writeDutyCycle2PWM(float dc_a, float dc_b, int pinA, int pinB){
44+
uint32_t dutyA = _constrain(_PWM_RES*dc_a, 0, _PWM_RES);
45+
uint32_t dutyB = _constrain(_PWM_RES*dc_b, 0, _PWM_RES);
46+
ledcWrite(LEDC_CHANNEL_0, dutyA);
47+
ledcWrite(LEDC_CHANNEL_1, dutyB);
48+
}
49+
50+
void _writeDutyCycle3PWM(float dc_a, float dc_b, float dc_c, int pinA, int pinB, int pinC){
51+
uint32_t dutyA = _constrain(_PWM_RES*dc_a, 0, _PWM_RES);
52+
uint32_t dutyB = _constrain(_PWM_RES*dc_b, 0, _PWM_RES);
53+
uint32_t dutyC = _constrain(_PWM_RES*dc_c, 0, _PWM_RES);
54+
ledcWrite(LEDC_CHANNEL_0, dutyA);
55+
ledcWrite(LEDC_CHANNEL_1, dutyB);
56+
ledcWrite(LEDC_CHANNEL_2, dutyC);
57+
}
58+
59+
void _writeDutyCycle4PWM(float dc_1a, float dc_1b, float dc_2a, float dc_2b, int pin1A, int pin1B, int pin2A, int pin2B){
60+
uint32_t duty1A = _constrain(_PWM_RES*dc_1a, 0, _PWM_RES);
61+
uint32_t duty1B = _constrain(_PWM_RES*dc_1b, 0, _PWM_RES);
62+
uint32_t duty2A = _constrain(_PWM_RES*dc_2a, 0, _PWM_RES);
63+
uint32_t duty2B = _constrain(_PWM_RES*dc_2b, 0, _PWM_RES);
64+
ledcWrite(LEDC_CHANNEL_0, duty1A);
65+
ledcWrite(LEDC_CHANNEL_1, duty1B);
66+
ledcWrite(LEDC_CHANNEL_2, duty2A);
67+
ledcWrite(LEDC_CHANNEL_3, duty2B);
68+
}
69+
70+
#endif

0 commit comments

Comments
 (0)