Skip to content

Commit 6ae438b

Browse files
John DoeJohn Doe
John Doe
authored and
John Doe
committed
add PWM Range control
setting freq to 50, range to 20000 and writing between 700 and 2200 gives servo control for example
1 parent b68dfbc commit 6ae438b

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

cores/esp8266/Arduino.h

+1
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,7 @@ int analogRead(uint8_t);
188188
void analogReference(uint8_t mode);
189189
void analogWrite(uint8_t, int);
190190
void analogWriteFreq(uint32_t freq);
191+
void analogWriteRange(uint32_t range);
191192

192193
unsigned long millis(void);
193194
unsigned long micros(void);

cores/esp8266/core_esp8266_wiring_pwm.c

+10-3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
uint32_t pwm_mask = 0;
2828
uint16_t pwm_values[17] = {0,};
2929
uint32_t pwm_freq = 1000;
30+
uint32_t pwm_range = PWMRANGE;
3031

3132
uint32_t pwm_multiplier = 0;
3233
uint16_t pwm_steps[17];
@@ -71,7 +72,7 @@ void prep_pwm_steps(){
7172
for(i=0; i<17; i++){
7273
if((pwm_mask & (1 << i)) != 0 && pwm_values[i] != 0) pwm_temp_steps[pwm_temp_steps_len++] = pwm_values[i];
7374
}
74-
pwm_temp_steps[pwm_temp_steps_len++] = PWMRANGE;
75+
pwm_temp_steps[pwm_temp_steps_len++] = pwm_range;
7576
pwm_temp_steps_len = pwm_sort_array(pwm_temp_steps, pwm_temp_steps_len) - 1;
7677
for(i=0; i<pwm_temp_steps_len; i++){
7778
pwm_temp_masks[i] = pwm_get_mask(pwm_temp_steps[i]);
@@ -83,7 +84,7 @@ void prep_pwm_steps(){
8384
pwm_steps_len = pwm_temp_steps_len;
8485
ets_memcpy(pwm_steps, pwm_temp_steps, (pwm_temp_steps_len + 1) * 2);
8586
ets_memcpy(pwm_steps_mask, pwm_temp_masks, pwm_temp_steps_len * 4);
86-
pwm_multiplier = ESP8266_CLOCK/(PWMRANGE * pwm_freq);
87+
pwm_multiplier = ESP8266_CLOCK/(pwm_range * pwm_freq);
8788
ETS_FRC1_INTR_ENABLE();
8889
}
8990

@@ -133,7 +134,7 @@ extern void __analogWrite(uint8_t pin, int value) {
133134
pinMode(pin, OUTPUT);
134135
digitalWrite(pin, LOW);
135136
}
136-
pwm_values[pin] = value % (PWMRANGE + 1);
137+
pwm_values[pin] = value % (pwm_range + 1);
137138
prep_pwm_steps();
138139
if(start_timer){
139140
pwm_start_timer();
@@ -145,5 +146,11 @@ extern void __analogWriteFreq(uint32_t freq){
145146
prep_pwm_steps();
146147
}
147148

149+
extern void __analogWriteRange(uint32_t range){
150+
pwm_range = range;
151+
prep_pwm_steps();
152+
}
153+
148154
extern void analogWrite(uint8_t pin, int val) __attribute__ ((weak, alias("__analogWrite")));
149155
extern void analogWriteFreq(uint32_t freq) __attribute__ ((weak, alias("__analogWriteFreq")));
156+
extern void analogWriteRange(uint32_t range) __attribute__ ((weak, alias("__analogWriteRange")));

0 commit comments

Comments
 (0)