Wenn die Zeigernadel ausgerichtet ist, kann der richtige Code für den Drehzahlmesser geladen werden:
C
/* ///Drehzahlmesser_Micros-SWITEC///
// |**********************************************************************;
* Project : Digitaler Drehzahlmesser mit analoger Anzeige über Switec X.25 / X.27 Steppermotor für die
* Aprilia RS 125 MP + SF
*
* Program name : Drehzahlmesser_Micros-SWITEC.ino
*
* Author : InterlinkKnight
*
* Date created : 05/23/2019
*
* Modified by : el bodo es loco
*
* Revision History :
*
* Date modifiied Vers. Revision Date
* 06/08/2020 2.0 06/11/2020
*
|**********************************************************************;
*/
#include <Wire.h>
#include <SwitecX25.h>
#define STEPS (315*3)
#define LED_PIN 13 //
SwitecX25 motor1(STEPS,6,7,11,10);
//##### Kalibrierung #####//
//########################// Wichtige Parameter sind mit "####" gekennzeichnet
//Einstellung Drehzahlabnahme//
const byte PulsesPerRevolution = 1; // #### 1 für Drehzahlmessung am Pickup oder Zündspule; 6 für Drehzahlmessung an der Lima (ROTAX 122 und 123)
// bei der Mito ist der Wert an der Lichtmaschine und der Zündspule 2, es muss ggf. bei anderen Fahrzeugen die Drehzahl am Drehzahlmesser der Fahrzeugs
// und die Drehzahl auf der Skala verglichen werden und der PPR Wert von 1-6 angepasst werden bis die Drehzahlen übereinstimmen
//Timeout und Genauigkeit//
const unsigned long ZeroTimeout = 100000;
const byte numReadings = 1; //Anzahl der Messwertblöcke zur Mittelwert bildung Je höher des to genauer aber auch träger, für eine flüssige Nadelbewegung muss der Wert 1 sein
/////////////
// Variablen:
/////////////
volatile unsigned long LastTimeWeMeasured;
volatile unsigned long PeriodBetweenPulses = ZeroTimeout+1000;
volatile unsigned long PeriodAverage = ZeroTimeout+1000;
unsigned long FrequencyRaw;
unsigned long FrequencyReal;
unsigned long RPM;
unsigned int PulseCounter = 1;
unsigned long PeriodSum;
unsigned long LastTimeCycleMeasure = LastTimeWeMeasured;
unsigned long CurrentMicros = micros();
unsigned int AmountOfReadings = 1;
unsigned int ZeroDebouncingExtra;
unsigned long readings[numReadings];
unsigned long readIndex;
unsigned long total;
unsigned long average;
void setup()
{
Serial.begin(9600);
Wire.begin();
attachInterrupt(digitalPinToInterrupt(3), Pulse_Event, RISING);
pinMode (3, INPUT_PULLUP);
static int nextPos = 0;
motor1.zero();// run the motor against the stops
delay(200);
motor1.zero();
motor1.setPosition(STEPS/2); //STEPS/2
delay(100);
}
int pos=0; //Position in steps(0-630)= (0°-315°)
void loop()
{
LastTimeCycleMeasure = LastTimeWeMeasured;
CurrentMicros = micros();
if(CurrentMicros < LastTimeCycleMeasure)
{
LastTimeCycleMeasure = CurrentMicros;
}
FrequencyRaw = 10000000000 / PeriodAverage;
if(PeriodBetweenPulses > ZeroTimeout - ZeroDebouncingExtra || CurrentMicros - LastTimeCycleMeasure > ZeroTimeout - ZeroDebouncingExtra)
{
FrequencyRaw = 0;
ZeroDebouncingExtra = 2000;
}
else
{
ZeroDebouncingExtra = 0;
}
FrequencyReal = FrequencyRaw / 10000;
RPM = FrequencyRaw / PulsesPerRevolution * 60;
RPM = RPM / 10000;
total = total - readings[readIndex];
readings[readIndex] = RPM;
total = total + readings[readIndex];
readIndex = readIndex + 1;
if (readIndex >= numReadings)
{
readIndex = 0;
}
average = total / numReadings;
int r = RPM ; // set to 8000 to calibrate the needle
int set = map(r,1000,14000,112,810);
if (RPM <= 14000){ // aggle limit to max. 14.000 rpm
motor1.update();
motor1.setPosition(set);
}
if (RPM > 14000){ // aggle limit to max. 14.000 rpm , begrenzt den Ausschlag damit der Zeiger nicht in der Öl Kontroll LED hängen bleibt
motor1.update();
motor1.setPosition(810);
}
}
void Pulse_Event()
{
PeriodBetweenPulses = micros() - LastTimeWeMeasured;
LastTimeWeMeasured = micros();
if(PulseCounter >= AmountOfReadings)
{
PeriodAverage = PeriodSum / AmountOfReadings;
PulseCounter = 1;
PeriodSum = PeriodBetweenPulses;
int RemapedAmountOfReadings = map(PeriodBetweenPulses, 40000, 5000, 1, 10);
RemapedAmountOfReadings = constrain(RemapedAmountOfReadings, 1, 10);
AmountOfReadings = RemapedAmountOfReadings;
}
else
{
PulseCounter++;
PeriodSum = PeriodSum + PeriodBetweenPulses;
}
}
Alles anzeigen