pimoroni-pico/drivers/motor/motor.hpp

152 wiersze
4.5 KiB
C++

2022-03-28 17:32:05 +00:00
#pragma once
#include "pico/stdlib.h"
#include "hardware/pwm.h"
2022-04-05 15:53:36 +00:00
#include "common/pimoroni_common.hpp"
2022-04-04 19:00:03 +00:00
#include "motor_state.hpp"
2022-03-28 17:32:05 +00:00
2022-04-05 15:53:36 +00:00
using namespace pimoroni;
2022-04-04 19:00:03 +00:00
namespace motor {
2022-03-28 17:32:05 +00:00
class Motor {
//--------------------------------------------------
// Subclasses
//--------------------------------------------------
private:
class Driver {
//--------------------------------------------------
// Variables
//--------------------------------------------------
protected:
pin_pair motor_pins;
uint16_t pwm_period;
//--------------------------------------------------
// Constructors/Destructor
//--------------------------------------------------
public:
Driver(const pin_pair &pins);
virtual ~Driver();
//--------------------------------------------------
// Methods
//--------------------------------------------------
public:
const pin_pair& pins() const;
virtual void init(pwm_config *pwm_cfg, uint16_t period) = 0;
virtual void update_frequency(uint8_t div, uint8_t mod, uint16_t period, float duty, DecayMode mode) = 0;
virtual void apply_duty(float duty, DecayMode mode) = 0;
};
class DualPWMDriver : public Driver {
//--------------------------------------------------
// Constructors/Destructor
//--------------------------------------------------
public:
DualPWMDriver(pin_pair pins) : Driver(pins) {}
virtual ~DualPWMDriver() {}
//--------------------------------------------------
// Methods
//--------------------------------------------------
public:
virtual void init(pwm_config *pwm_cfg, uint16_t period);
virtual void update_frequency(uint8_t div, uint8_t mod, uint16_t period, float duty, DecayMode mode);
virtual void apply_duty(float duty, DecayMode mode);
};
class PhEnDriver : public Driver {
//--------------------------------------------------
// Methods
//--------------------------------------------------
public:
PhEnDriver(pin_pair pins) : Driver(pins) {}
virtual ~PhEnDriver() {}
//--------------------------------------------------
// Methods
//--------------------------------------------------
public:
virtual void init(pwm_config *pwm_cfg, uint16_t period);
virtual void update_frequency(uint8_t div, uint8_t mod, uint16_t period, float duty, DecayMode mode);
virtual void apply_duty(float duty, DecayMode mode);
};
2022-03-28 17:32:05 +00:00
//--------------------------------------------------
// Variables
//--------------------------------------------------
private:
Driver *driver;
2022-04-22 12:59:40 +00:00
MotorState state;
2022-03-28 17:32:05 +00:00
pwm_config pwm_cfg;
2022-04-22 12:59:40 +00:00
float pwm_frequency;
DecayMode motor_mode;
2022-03-28 17:32:05 +00:00
2022-03-28 17:32:05 +00:00
//--------------------------------------------------
// Constructors/Destructor
//--------------------------------------------------
public:
Motor(const pin_pair &pins, Direction direction = NORMAL_DIR, float speed_scale = MotorState::DEFAULT_SPEED_SCALE, float zeropoint = MotorState::DEFAULT_ZEROPOINT,
float deadzone = MotorState::DEFAULT_DEADZONE, float freq = MotorState::DEFAULT_FREQUENCY, DecayMode mode = MotorState::DEFAULT_DECAY_MODE,
bool ph_en_driver = false);
2022-03-28 17:32:05 +00:00
~Motor();
//--------------------------------------------------
// Methods
//--------------------------------------------------
public:
bool init();
2022-04-22 12:59:40 +00:00
// For print access in micropython
pin_pair pins() const;
2022-03-28 17:32:05 +00:00
2022-04-22 12:59:40 +00:00
void enable();
void disable();
bool is_enabled() const;
2022-03-28 17:32:05 +00:00
2022-04-22 12:59:40 +00:00
float duty() const;
void duty(float duty);
float speed() const;
void speed(float speed);
float frequency() const;
bool frequency(float freq);
//--------------------------------------------------
2022-03-28 17:32:05 +00:00
void stop();
2022-04-22 12:59:40 +00:00
void coast();
void brake();
void full_negative();
void full_positive();
void to_percent(float in, float in_min = MotorState::ZERO_PERCENT, float in_max = MotorState::ONEHUNDRED_PERCENT);
void to_percent(float in, float in_min, float in_max, float speed_min, float speed_max);
//--------------------------------------------------
Direction direction() const;
void direction(Direction direction);
float speed_scale() const;
void speed_scale(float speed_scale);
float zeropoint() const;
void zeropoint(float zeropoint);
2022-04-22 12:59:40 +00:00
float deadzone() const;
void deadzone(float deadzone);
DecayMode decay_mode();
void decay_mode(DecayMode mode);
2022-03-28 17:32:05 +00:00
};
2022-04-22 12:59:40 +00:00
}