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