Fix multiple servos with STM32 (#16151)
This commit is contained in:
parent
31fdaea269
commit
96cf556139
3 changed files with 20 additions and 13 deletions
|
@ -28,25 +28,30 @@
|
||||||
|
|
||||||
#include "Servo.h"
|
#include "Servo.h"
|
||||||
|
|
||||||
uint8_t servoPin[MAX_SERVOS] = { 0 };
|
static uint_fast8_t servoCount = 0;
|
||||||
|
constexpr millis_t servoDelay[] = SERVO_DELAY;
|
||||||
|
static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
|
||||||
|
|
||||||
|
libServo::libServo()
|
||||||
|
: delay(servoDelay[servoCount++])
|
||||||
|
{}
|
||||||
|
|
||||||
int8_t libServo::attach(const int pin) {
|
int8_t libServo::attach(const int pin) {
|
||||||
if (servoIndex >= MAX_SERVOS) return -1;
|
if (servoCount >= MAX_SERVOS) return -1;
|
||||||
if (pin > 0) servoPin[servoIndex] = pin;
|
if (pin > 0) servo_pin = pin;
|
||||||
return super::attach(servoPin[servoIndex]);
|
return super::attach(servo_pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t libServo::attach(const int pin, const int min, const int max) {
|
int8_t libServo::attach(const int pin, const int min, const int max) {
|
||||||
if (pin > 0) servoPin[servoIndex] = pin;
|
if (servoCount >= MAX_SERVOS) return -1;
|
||||||
return super::attach(servoPin[servoIndex], min, max);
|
if (pin > 0) servo_pin = pin;
|
||||||
|
return super::attach(servo_pin, min, max);
|
||||||
}
|
}
|
||||||
|
|
||||||
void libServo::move(const int value) {
|
void libServo::move(const int value) {
|
||||||
constexpr uint16_t servo_delay[] = SERVO_DELAY;
|
|
||||||
static_assert(COUNT(servo_delay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long.");
|
|
||||||
if (attach(0) >= 0) {
|
if (attach(0) >= 0) {
|
||||||
write(value);
|
write(value);
|
||||||
safe_delay(servo_delay[servoIndex]);
|
safe_delay(delay);
|
||||||
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
|
#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE)
|
||||||
detach();
|
detach();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,11 +27,13 @@
|
||||||
// Inherit and expand on the official library
|
// Inherit and expand on the official library
|
||||||
class libServo : public Servo {
|
class libServo : public Servo {
|
||||||
public:
|
public:
|
||||||
|
libServo();
|
||||||
int8_t attach(const int pin);
|
int8_t attach(const int pin);
|
||||||
int8_t attach(const int pin, const int min, const int max);
|
int8_t attach(const int pin, const int min, const int max);
|
||||||
void move(const int value);
|
void move(const int value);
|
||||||
private:
|
private:
|
||||||
typedef Servo super;
|
typedef Servo super;
|
||||||
uint16_t min_ticks, max_ticks;
|
|
||||||
uint8_t servoIndex; // index into the channel data for this servo
|
int servo_pin = 0;
|
||||||
|
millis_t delay = 0;
|
||||||
};
|
};
|
||||||
|
|
|
@ -246,11 +246,11 @@ extern "C" {
|
||||||
|
|
||||||
// Timer Definitions
|
// Timer Definitions
|
||||||
//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c
|
//Do not use timer used by PWM pins when possible. See PinMap_PWM in PeripheralPins.c
|
||||||
#define TIMER_TONE TIM6
|
#define TIMER_TONE TIM2
|
||||||
#define TIMER_SERIAL TIM7
|
#define TIMER_SERIAL TIM7
|
||||||
|
|
||||||
// Do not use basic timer: OC is required
|
// Do not use basic timer: OC is required
|
||||||
#define TIMER_SERVO TIM2 //TODO: advanced-control timers don't work
|
#define TIMER_SERVO TIM6 //TODO: advanced-control timers don't work
|
||||||
|
|
||||||
// UART Definitions
|
// UART Definitions
|
||||||
// Define here Serial instance number to map on Serial generic name
|
// Define here Serial instance number to map on Serial generic name
|
||||||
|
|
Reference in a new issue