mirror of
https://github.com/esp8266/Arduino.git
synced 2025-04-21 10:26:06 +03:00
add PWM Range control
setting freq to 50, range to 20000 and writing between 700 and 2200 gives servo control for example
This commit is contained in:
parent
b68dfbc7ce
commit
6ae438b035
@ -188,6 +188,7 @@ int analogRead(uint8_t);
|
|||||||
void analogReference(uint8_t mode);
|
void analogReference(uint8_t mode);
|
||||||
void analogWrite(uint8_t, int);
|
void analogWrite(uint8_t, int);
|
||||||
void analogWriteFreq(uint32_t freq);
|
void analogWriteFreq(uint32_t freq);
|
||||||
|
void analogWriteRange(uint32_t range);
|
||||||
|
|
||||||
unsigned long millis(void);
|
unsigned long millis(void);
|
||||||
unsigned long micros(void);
|
unsigned long micros(void);
|
||||||
|
@ -27,6 +27,7 @@
|
|||||||
uint32_t pwm_mask = 0;
|
uint32_t pwm_mask = 0;
|
||||||
uint16_t pwm_values[17] = {0,};
|
uint16_t pwm_values[17] = {0,};
|
||||||
uint32_t pwm_freq = 1000;
|
uint32_t pwm_freq = 1000;
|
||||||
|
uint32_t pwm_range = PWMRANGE;
|
||||||
|
|
||||||
uint32_t pwm_multiplier = 0;
|
uint32_t pwm_multiplier = 0;
|
||||||
uint16_t pwm_steps[17];
|
uint16_t pwm_steps[17];
|
||||||
@ -71,7 +72,7 @@ void prep_pwm_steps(){
|
|||||||
for(i=0; i<17; i++){
|
for(i=0; i<17; i++){
|
||||||
if((pwm_mask & (1 << i)) != 0 && pwm_values[i] != 0) pwm_temp_steps[pwm_temp_steps_len++] = pwm_values[i];
|
if((pwm_mask & (1 << i)) != 0 && pwm_values[i] != 0) pwm_temp_steps[pwm_temp_steps_len++] = pwm_values[i];
|
||||||
}
|
}
|
||||||
pwm_temp_steps[pwm_temp_steps_len++] = PWMRANGE;
|
pwm_temp_steps[pwm_temp_steps_len++] = pwm_range;
|
||||||
pwm_temp_steps_len = pwm_sort_array(pwm_temp_steps, pwm_temp_steps_len) - 1;
|
pwm_temp_steps_len = pwm_sort_array(pwm_temp_steps, pwm_temp_steps_len) - 1;
|
||||||
for(i=0; i<pwm_temp_steps_len; i++){
|
for(i=0; i<pwm_temp_steps_len; i++){
|
||||||
pwm_temp_masks[i] = pwm_get_mask(pwm_temp_steps[i]);
|
pwm_temp_masks[i] = pwm_get_mask(pwm_temp_steps[i]);
|
||||||
@ -83,7 +84,7 @@ void prep_pwm_steps(){
|
|||||||
pwm_steps_len = pwm_temp_steps_len;
|
pwm_steps_len = pwm_temp_steps_len;
|
||||||
ets_memcpy(pwm_steps, pwm_temp_steps, (pwm_temp_steps_len + 1) * 2);
|
ets_memcpy(pwm_steps, pwm_temp_steps, (pwm_temp_steps_len + 1) * 2);
|
||||||
ets_memcpy(pwm_steps_mask, pwm_temp_masks, pwm_temp_steps_len * 4);
|
ets_memcpy(pwm_steps_mask, pwm_temp_masks, pwm_temp_steps_len * 4);
|
||||||
pwm_multiplier = ESP8266_CLOCK/(PWMRANGE * pwm_freq);
|
pwm_multiplier = ESP8266_CLOCK/(pwm_range * pwm_freq);
|
||||||
ETS_FRC1_INTR_ENABLE();
|
ETS_FRC1_INTR_ENABLE();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -133,7 +134,7 @@ extern void __analogWrite(uint8_t pin, int value) {
|
|||||||
pinMode(pin, OUTPUT);
|
pinMode(pin, OUTPUT);
|
||||||
digitalWrite(pin, LOW);
|
digitalWrite(pin, LOW);
|
||||||
}
|
}
|
||||||
pwm_values[pin] = value % (PWMRANGE + 1);
|
pwm_values[pin] = value % (pwm_range + 1);
|
||||||
prep_pwm_steps();
|
prep_pwm_steps();
|
||||||
if(start_timer){
|
if(start_timer){
|
||||||
pwm_start_timer();
|
pwm_start_timer();
|
||||||
@ -145,5 +146,11 @@ extern void __analogWriteFreq(uint32_t freq){
|
|||||||
prep_pwm_steps();
|
prep_pwm_steps();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern void __analogWriteRange(uint32_t range){
|
||||||
|
pwm_range = range;
|
||||||
|
prep_pwm_steps();
|
||||||
|
}
|
||||||
|
|
||||||
extern void analogWrite(uint8_t pin, int val) __attribute__ ((weak, alias("__analogWrite")));
|
extern void analogWrite(uint8_t pin, int val) __attribute__ ((weak, alias("__analogWrite")));
|
||||||
extern void analogWriteFreq(uint32_t freq) __attribute__ ((weak, alias("__analogWriteFreq")));
|
extern void analogWriteFreq(uint32_t freq) __attribute__ ((weak, alias("__analogWriteFreq")));
|
||||||
|
extern void analogWriteRange(uint32_t range) __attribute__ ((weak, alias("__analogWriteRange")));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user