diff --git a/include/a4988.h b/include/a4988.h index 91ad5f2..b6424e4 100644 --- a/include/a4988.h +++ b/include/a4988.h @@ -4,6 +4,9 @@ #define CFG_SAMPLE_RATE_US 5 #define CFG_PERIPHERAL_SRC_PCM 1 #define CFG_DEPRECATED_ARG 0 +#define PI_PWM_0 12 +#define PI_PWM_1 13 +#define PI_SW_PWM_RANGE 255 #include #include @@ -75,6 +78,7 @@ namespace simon { std::queue> m_queue; unsigned m_pwm_freq; bool m_alive; + bool m_hw_pwm_possible; private: void initialize(void); int set_pwm_freq(const unsigned pwm_freq); diff --git a/src/drivers/a4988.cpp b/src/drivers/a4988.cpp index f385246..82245d8 100644 --- a/src/drivers/a4988.cpp +++ b/src/drivers/a4988.cpp @@ -5,11 +5,17 @@ #include #include #include +#include +#include #include namespace simon { namespace a4988 { + // Anonymous namespace + namespace { + + } c_allegro_4988::c_allegro_4988(std::unique_ptr ptr_set) : m_ptr_set(std::move(ptr_set)), m_initialized(false), m_alive(true) { @@ -30,11 +36,22 @@ namespace simon { if (!set_pwm_freq(std::round(1e6/move->period_us))) { // TODO: proper error handling } - gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, PI_HW_PWM_RANGE/2); - gpioWrite(m_ptr_set->gpio_dir, move->dir); + if (m_hw_pwm_possible) { + gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, PI_HW_PWM_RANGE/2); + } + else { + gpioSetPWMfrequency(m_ptr_set->gpio_step, m_pwm_freq); + gpioPWM(m_ptr_set->gpio_step, PI_SW_PWM_RANGE/2); + } + gpioWrite(m_ptr_set->gpio_dir, move->dir); auto t_sleep = move->period_us*move->steps; std::this_thread::sleep_for(std::chrono::microseconds(t_sleep)); - gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, 0); + if (m_hw_pwm_possible) { + gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, 0); + } + else { + gpioPWM(m_ptr_set->gpio_step, 0); + } } else if (*cmd == "enable") { auto enable = std::static_pointer_cast(cmd); @@ -83,7 +100,11 @@ namespace simon { gpioWrite(m_ptr_set->gpio_dir, 0); // Set PWM to 0 m_pwm_freq = 1000; - gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, 0); + unsigned pwms[] = {PI_PWM_0, PI_PWM_1}; + bool m_hw_pwm_possible = std::find(std::begin(pwms), std::end(pwms), m_ptr_set->gpio_step) != std::end(pwms); + if (m_hw_pwm_possible) { + gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, 0); + } m_initialized = true; } int c_allegro_4988::enable(void)