4 changed files with 201 additions and 0 deletions
@ -0,0 +1,41 @@ |
|||||
|
|
||||
|
main |
||||
|
|
||||
|
# Created by https://www.toptal.com/developers/gitignore/api/c++ |
||||
|
# Edit at https://www.toptal.com/developers/gitignore?templates=c++ |
||||
|
|
||||
|
### C++ ### |
||||
|
# Prerequisites |
||||
|
*.d |
||||
|
|
||||
|
# Compiled Object files |
||||
|
*.slo |
||||
|
*.lo |
||||
|
*.o |
||||
|
*.obj |
||||
|
|
||||
|
# Precompiled Headers |
||||
|
*.gch |
||||
|
*.pch |
||||
|
|
||||
|
# Compiled Dynamic libraries |
||||
|
*.so |
||||
|
*.dylib |
||||
|
*.dll |
||||
|
|
||||
|
# Fortran module files |
||||
|
*.mod |
||||
|
*.smod |
||||
|
|
||||
|
# Compiled Static libraries |
||||
|
*.lai |
||||
|
*.la |
||||
|
*.a |
||||
|
*.lib |
||||
|
|
||||
|
# Executables |
||||
|
*.exe |
||||
|
*.out |
||||
|
*.app |
||||
|
|
||||
|
# End of https://www.toptal.com/developers/gitignore/api/c++ |
@ -0,0 +1,87 @@ |
|||||
|
#include <include/a4988.h> |
||||
|
#include <pigpio.h> |
||||
|
#include <queue> |
||||
|
#include <cmath> |
||||
|
#include <thread> |
||||
|
|
||||
|
#include <iostream> |
||||
|
|
||||
|
namespace simon { |
||||
|
c_allegro_4988::c_allegro_4988(a4988_settings_t* pset) |
||||
|
: m_pset(pset), m_initialized(false), m_alive(true) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
void c_allegro_4988::run(void) |
||||
|
{ |
||||
|
if (!m_initialized) { |
||||
|
initialize(); |
||||
|
} |
||||
|
while(m_alive) |
||||
|
{ |
||||
|
std::cout << "In thread" << std::endl; |
||||
|
if (!m_queue.empty()) { |
||||
|
auto& move = m_queue.front(); |
||||
|
if (!set_pwm_freq(std::round(1e6/move.period_us))) { |
||||
|
// TODO: proper error handling
|
||||
|
} |
||||
|
gpioHardwarePWM(m_pset->gpio_step, m_pwm_freq, PI_HW_PWM_RANGE/2); |
||||
|
gpioWrite(m_pset->gpio_dir, move.dir); |
||||
|
std::cout << move.period_us << " - " << move.steps << std::endl; |
||||
|
auto t_sleep = move.period_us*move.steps; |
||||
|
std::this_thread::sleep_for(std::chrono::microseconds(t_sleep)); |
||||
|
gpioHardwarePWM(m_pset->gpio_step, m_pwm_freq, 0); |
||||
|
m_queue.pop(); |
||||
|
} |
||||
|
else { |
||||
|
m_alive = false; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
void c_allegro_4988::post(move_t move) |
||||
|
{ |
||||
|
m_queue.push(move); |
||||
|
} |
||||
|
void c_allegro_4988::initialize(void) |
||||
|
{ |
||||
|
// TODO: proper error management throwing exceptions
|
||||
|
if(m_pset == nullptr) { |
||||
|
return; |
||||
|
} |
||||
|
// Configure clock source for PWM
|
||||
|
gpioCfgClock(CFG_SAMPLE_RATE_US, CFG_PERIPHERAL_SRC_PCM, CFG_DEPRECATED_ARG); |
||||
|
// Initialize pigpio library
|
||||
|
gpioInitialise(); |
||||
|
// Configure as outputs
|
||||
|
gpioSetMode(m_pset->gpio_en, PI_OUTPUT); |
||||
|
gpioSetMode(m_pset->gpio_dir, PI_OUTPUT); |
||||
|
// Initialize outputs
|
||||
|
enable(); |
||||
|
gpioWrite(m_pset->gpio_dir, 0); |
||||
|
// Set PWM to 0
|
||||
|
m_pwm_freq = 1000; |
||||
|
gpioHardwarePWM(m_pset->gpio_step, m_pwm_freq, 0); |
||||
|
m_initialized = true; |
||||
|
} |
||||
|
int c_allegro_4988::enable(void) |
||||
|
{ |
||||
|
// TODO: proper error handling
|
||||
|
gpioWrite(m_pset->gpio_en, 0); |
||||
|
return 0; |
||||
|
} |
||||
|
int c_allegro_4988::disable(void) |
||||
|
{ |
||||
|
// TODO: proper error handling
|
||||
|
gpioWrite(m_pset->gpio_en, 1); |
||||
|
return 0; |
||||
|
} |
||||
|
int c_allegro_4988::set_pwm_freq(const unsigned pwm_freq) |
||||
|
{ |
||||
|
if (pwm_freq > PI_HW_PWM_MAX_FREQ) { |
||||
|
return 1; |
||||
|
} |
||||
|
m_pwm_freq = pwm_freq; |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,49 @@ |
|||||
|
#ifndef INCLUDED_DRIVER_ALLEGRO_4988 |
||||
|
#define INCLUDED_DRIVER_ALLEGRO_4988 |
||||
|
|
||||
|
#define CFG_SAMPLE_RATE_US 5 |
||||
|
#define CFG_PERIPHERAL_SRC_PCM 1 |
||||
|
#define CFG_DEPRECATED_ARG 0 |
||||
|
|
||||
|
#include <queue> |
||||
|
|
||||
|
namespace simon { |
||||
|
|
||||
|
typedef struct |
||||
|
{ |
||||
|
const unsigned gpio_en; |
||||
|
const unsigned gpio_step; |
||||
|
const unsigned gpio_dir; |
||||
|
const bool gpio_microsteps[3]; |
||||
|
} a4988_settings_t; |
||||
|
|
||||
|
typedef struct |
||||
|
{ |
||||
|
unsigned steps; |
||||
|
bool dir; |
||||
|
unsigned period_us; |
||||
|
} move_t; |
||||
|
|
||||
|
|
||||
|
class c_allegro_4988 |
||||
|
{ |
||||
|
public: |
||||
|
c_allegro_4988(a4988_settings_t* set); |
||||
|
int enable(void); |
||||
|
int disable(void); |
||||
|
void post(move_t move); |
||||
|
void run(void); |
||||
|
private: |
||||
|
a4988_settings_t* m_pset; |
||||
|
bool m_initialized; |
||||
|
std::queue<move_t> m_queue; |
||||
|
unsigned m_pwm_freq; |
||||
|
bool m_alive; |
||||
|
private: |
||||
|
void initialize(void); |
||||
|
int set_pwm_freq(const unsigned pwm_freq); |
||||
|
}; |
||||
|
|
||||
|
} // namespace simon
|
||||
|
|
||||
|
#endif /*INCLUDED_DRIVER_ALLEGRO_4988*/ |
@ -0,0 +1,24 @@ |
|||||
|
#include <iostream> |
||||
|
#include <include/a4988.h> |
||||
|
#include <thread> |
||||
|
#include <functional> |
||||
|
|
||||
|
int main() |
||||
|
{ |
||||
|
using namespace simon; |
||||
|
a4988_settings_t a4988_set{ |
||||
|
.gpio_en = 17, |
||||
|
.gpio_step = 18, |
||||
|
.gpio_dir = 22, |
||||
|
.gpio_microsteps{ |
||||
|
true, true, true |
||||
|
} |
||||
|
}; |
||||
|
c_allegro_4988 a4988(&a4988_set); |
||||
|
move_t move{32768, true, 100}; |
||||
|
std::thread t1(std::bind(&c_allegro_4988::run, &a4988)); |
||||
|
a4988.post(move); |
||||
|
t1.join(); |
||||
|
std::cout << "Hello camera" << std::endl; |
||||
|
return 0; |
||||
|
} |
Loading…
Reference in new issue