Skip to content

Commit 75d12a8

Browse files
committed
Add extended servoWrite that accepts min/max values in micros. Add getServoResolution().
Arduino allows for opening of the min/max RC PWM pulse. The previous 1ms/2ms min/max limited generic servos to only 90 degrees of movement. The Arduino defaults of 544/2400 open this to 180 degrees.
1 parent db8427a commit 75d12a8

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

cores/arduino/ard_sup/analog/ap3_analog.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -658,15 +658,28 @@ ap3_err_t servoWriteResolution(uint8_t res)
658658
return AP3_OK;
659659
}
660660

661+
uint8_t getServoResolution()
662+
{
663+
return(_servoWriteBits);
664+
}
665+
661666
ap3_err_t servoWrite(uint8_t pin, uint32_t val)
667+
{
668+
return(servoWrite(pin, val, 544, 2400)); //Call servoWrite with Arduino default min/max microseconds. See: https://www.arduino.cc/en/Reference/ServoAttach
669+
}
670+
671+
ap3_err_t servoWrite(uint8_t pin, uint32_t val, uint16_t minMicros, uint16_t maxMicros)
662672
{
663673
// Determine the high time based on input value and the current resolution setting
664674
uint32_t fsv = (0x01 << _servoWriteBits); // full scale value for the current resolution setting
665675
val = val % fsv; // prevent excess
666676
uint32_t clk = AM_HAL_CTIMER_HFRC_3MHZ; // Using 3 MHz to get fine-grained control up to 20 ms wide
667677
uint32_t fw = 60000; // 20 ms wide frame
668-
uint32_t max = 6000; // max width of RC pwm pulse is 2 ms or 6000 counts
669-
uint32_t min = 3000; // min width of RC pwm pulse is 1 ms or 3000 counts
678+
679+
//Convert microSeconds to PWM counts.
680+
uint32_t min = minMicros * 3;
681+
uint32_t max = maxMicros * 3;
682+
670683
uint32_t th = (uint32_t)(((max - min) * val) / fsv) + min;
671684

672685
return ap3_pwm_output(pin, th, fw, clk);

cores/arduino/ard_sup/ap3_analog.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@ ap3_err_t ap3_pwm_output(uint8_t pin, uint32_t th, uint32_t fw, uint32_t clk);
4949
ap3_err_t analogWriteResolution(uint8_t res);
5050
ap3_err_t analogWrite(uint8_t pin, uint32_t val);
5151
ap3_err_t servoWriteResolution(uint8_t res);
52+
uint8_t getServoResolution();
5253
ap3_err_t servoWrite(uint8_t pin, uint32_t val);
54+
ap3_err_t servoWrite(uint8_t pin, uint32_t val, uint16_t minMicros, uint16_t maxMicros);
5355

5456
ap3_err_t tone(uint8_t pin, uint32_t freq);
5557
ap3_err_t tone(uint8_t pin, uint32_t freq, uint32_t duration);

0 commit comments

Comments
 (0)