stepper-motor-synth/motor_control.cpp

58 lines
1.4 KiB
C++

#include <Arduino.h>
#include "motor_control.h"
#include "pitch_table.h"
MotorControl::MotorControl(int pin_dir, int pin_step) :
pin_dir(pin_dir), pin_step(pin_step),
last_tick_micros(0), tick_period_micros(0)
{
// No actual constructor logic -- initialization is in Init()
}
void MotorControl::Init() {
// Initialize the pin state
pinMode(pin_dir, OUTPUT);
pinMode(pin_step, OUTPUT);
digitalWrite(pin_dir, LOW);
digitalWrite(pin_step, LOW);
}
void MotorControl::TickOn(unsigned long period_micros) {
tick_period_micros = period_micros;
// Force the next tick to happen
last_tick_micros = 0;
}
void MotorControl::TickAtPitch(unsigned int midi_pitch) {
// Bounds check
if (midi_pitch < midi_pitch_offset || midi_pitch >= midi_pitch_max) {
return;
}
TickOn(midi_pitch_period[midi_pitch - midi_pitch_offset]);
}
void MotorControl::TickOff() {
tick_period_micros = 0;
}
void MotorControl::Tick(unsigned long cur_micros) {
if (cur_micros == 0) {
return;
}
if (tick_period_micros == 0) {
return;
}
if (last_tick_micros == 0 || (cur_micros - last_tick_micros) >= tick_period_micros) {
DoTick();
last_tick_micros = cur_micros;
}
}
void MotorControl::DoTick() {
// Pulse the step pin once
digitalWrite(pin_step, HIGH);
digitalWrite(pin_step, LOW);
}