Browse Source

Support for SW PWM and third motor

master
Maximilian Stiefel 3 years ago
parent
commit
c0f7b28bef
  1. 4
      include/a4988.h
  2. 29
      src/drivers/a4988.cpp

4
include/a4988.h

@ -4,6 +4,9 @@
#define CFG_SAMPLE_RATE_US 5 #define CFG_SAMPLE_RATE_US 5
#define CFG_PERIPHERAL_SRC_PCM 1 #define CFG_PERIPHERAL_SRC_PCM 1
#define CFG_DEPRECATED_ARG 0 #define CFG_DEPRECATED_ARG 0
#define PI_PWM_0 12
#define PI_PWM_1 13
#define PI_SW_PWM_RANGE 255
#include <queue> #include <queue>
#include <string> #include <string>
@ -75,6 +78,7 @@ namespace simon {
std::queue<std::shared_ptr<c_cmd>> m_queue; std::queue<std::shared_ptr<c_cmd>> m_queue;
unsigned m_pwm_freq; unsigned m_pwm_freq;
bool m_alive; bool m_alive;
bool m_hw_pwm_possible;
private: private:
void initialize(void); void initialize(void);
int set_pwm_freq(const unsigned pwm_freq); int set_pwm_freq(const unsigned pwm_freq);

29
src/drivers/a4988.cpp

@ -5,11 +5,17 @@
#include <thread> #include <thread>
#include <string> #include <string>
#include <memory> #include <memory>
#include <algorithm>
#include <iterator>
#include <iostream> #include <iostream>
namespace simon { namespace simon {
namespace a4988 { namespace a4988 {
// Anonymous namespace
namespace {
}
c_allegro_4988::c_allegro_4988(std::unique_ptr<a4988_settings_t> ptr_set) c_allegro_4988::c_allegro_4988(std::unique_ptr<a4988_settings_t> ptr_set)
: m_ptr_set(std::move(ptr_set)), m_initialized(false), m_alive(true) : 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))) { if (!set_pwm_freq(std::round(1e6/move->period_us))) {
// TODO: proper error handling // TODO: proper error handling
} }
gpioHardwarePWM(m_ptr_set->gpio_step, m_pwm_freq, PI_HW_PWM_RANGE/2); if (m_hw_pwm_possible) {
gpioWrite(m_ptr_set->gpio_dir, move->dir); 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; auto t_sleep = move->period_us*move->steps;
std::this_thread::sleep_for(std::chrono::microseconds(t_sleep)); 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") { else if (*cmd == "enable") {
auto enable = std::static_pointer_cast<c_enable>(cmd); auto enable = std::static_pointer_cast<c_enable>(cmd);
@ -83,7 +100,11 @@ namespace simon {
gpioWrite(m_ptr_set->gpio_dir, 0); gpioWrite(m_ptr_set->gpio_dir, 0);
// Set PWM to 0 // Set PWM to 0
m_pwm_freq = 1000; 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; m_initialized = true;
} }
int c_allegro_4988::enable(void) int c_allegro_4988::enable(void)

Loading…
Cancel
Save