conk83
5
[code]
#include "SwitecX25.h"
#include "FreqMeasure.h"
const int UpdateInterval = 100;
const double StepsPerDegree = 3.0;
const unsigned int MaxMotorRotation = 315;
const unsigned int MaxMotorSteps = MaxMotorRotation * StepsPerDegree;
const double PulsesPerMile = 5764.0;
const double SecondsPerHour = 3600.0;
const double SpeedoDegreesPerMPH = 180.0 / 87.0;
unsigned long PreviousMillis = 0;
double MinMotorStep;
SwitecX25 Motor(MaxMotorSteps, 4,5,6,7);
void setup(void)
{
pinMode(8, INPUT_PULLUP);
Motor.zero();
Motor.setPosition(744);
MinMotorStep = PulseToStep(2 * (UpdateInterval / 1000.0) * F_CPU);
FreqMeasure.begin(); // Start freqmeasure library
}
double sum=0;
int count=0;
double avgPulseLength=0;
unsigned int motorStep = 0;
int noInputCount = 0;
void loop() {
unsigned long currentMillis = millis();
// Update the motor position every UpdateInterval milliseconds
if (currentMillis - PreviousMillis >= UpdateInterval) {
PreviousMillis = currentMillis;
count = 0;
sum = 0;
// Read all the pulses available so we can average them
while (FreqMeasure.available()) {
sum += FreqMeasure.read();
count++;
}
if (count) {
avgPulseLength = sum / count;
motorStep = PulseToStep(avgPulseLength);
noInputCount = 0;
}
else if (++noInputCount == 2) // force speed to zero after two missed intervals
motorStep = 0;
// Ignore speeds below the the two missed intervals speed so the motor doesn't jump
if (motorStep <= MinMotorStep)
motorStep = 0;
Motor.setPosition(motorStep);
}
Motor.update();
}
unsigned int PulseToStep(double pulseLength)
{
return (unsigned int)((F_CPU * SecondsPerHour * SpeedoDegreesPerMPH * StepsPerDegree) / (PulsesPerMile * pulseLength));
}
[/code]