#include //-------DrehzahlMesser von Max Hueber---------------------------------------------- //-------Kalibrierung-------------------------------------------------------------- const int aIn = A0; //Analoger Eingang A0 const int cyl = 20; //Motor, für 4 Cyl.= 30 / 6 Cyl. = 20/ 8 Cyl = 15 const int sw = 512; //Spannungsschwellwert beim Messen am Analogen Port const double maxdrehzahl=4000.0; //Maximale Motordrehzahl const double maxgrad=240.0; //Anzeigebereich in Grad 0-max RPM const int stepsrv = 945; //945 1/3Grad per Step für 315Grad Drehung für den Stepper X27.168 SwitecX25 tacho(stepsrv, 4, 5, 6, 7); //Zuweisung Motor auf die Pins 4-7 //-------System------------------------------------------------------------------- unsigned long period; //Mikrosekunden des Impulses unsigned long periods; //Mikrosekunden den Impulses gemittelt unsigned long mark; int tachogenau=5; double drehzahl=0; double tachoist=0.0; long myTimer=0; int tachosteps; double tachostepsmulti; int i=0; int f; void setup(){ tachostepsmulti= (maxdrehzahl/(maxgrad*3.0)); tacho.currentStep=tacho.steps-920; tacho.setPosition(0); while(tacho.currentStep>0)tacho.update(); } void loop(){ tacho.updateBlocking(); f=0; periods=0; for(i=0;i<5;i++){ while((analogRead(aIn)>sw)&&(millis()<100+myTimer)); while((analogRead(aIn)sw)&&(millis()<100+myTimer)); while((analogRead(aIn)4000){ periods=periods+period; //Signal mittelwert f++; } myTimer=millis(); } period=periods/f; //Singal mittelwer drehzahl=(1/(period*0.000001))*cyl; //Ausrechnen der Drehzahl if(drehzahl>=maxdrehzahl){ //Drehzahl auf 0 ohne Signal oder über MAX drehzahl=0.0; } if(drehzahl>2000){ tachogenau=12; //Tachogenauigkeit ab 2000RPM } else { tachogenau=5; //Tachogenauigkeit bis 2000RPM } if(drehzahl>=(tachoist+tachogenau)|| drehzahl<=(tachoist-tachogenau)){ tachosteps=drehzahl/tachostepsmulti; tacho.setPosition(tachosteps); tachoist=drehzahl; } tachoist=drehzahl; myTimer=millis(); }