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_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 <queue>
#include <string>
@ -75,6 +78,7 @@ namespace simon {
std::queue<std::shared_ptr<c_cmd>> 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);

29
src/drivers/a4988.cpp

@ -5,11 +5,17 @@
#include <thread>
#include <string>
#include <memory>
#include <algorithm>
#include <iterator>
#include <iostream>
namespace simon {
namespace a4988 {
// Anonymous namespace
namespace {
}
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)
{
@ -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<c_enable>(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)

Loading…
Cancel
Save