/* (C) Dipl. Phys. H. Weber // // Wie genau ist die Netzfrequenz von 50 Hz ? // // Das kann sich unter www.netzfrequenzmessung.de ansehen. // // Stimmt die Ausgabe dort ? Ein längerer Draht in Digitalport 8 des Arduino zeigt es */ /* * Programmet modifierat för att visa frekvensen på ett visarinstrument eller servo * 2016 01 17 Johnny Apell * 2020 03 18 Justerat för servovisning */ #include Servo VisarServo; // skapa servo int net = 8; // Antenn för 50Hz brum int Instrument = 11; // PWM-utgång till visarinstrument int VisarValue; // Visarvärdet efter olika beräkningar till servot unsigned long lastmicro, micro; void setup() { // initialize ports. pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, LOW); // släck lysdioden på kortet pinMode(net, INPUT); // Brum 50Hz antenn pinMode(Instrument, OUTPUT); // PWM utgång till instrumentet //Serial.begin(115200); // seriemonitorn micro=micros(); lastmicro=micro; //Serial.println("Start ..."); VisarServo.attach(10); // attaches the servo on pin 10 VisarServo.write(180); // Ställ visarservot i nolläge delay(5000); // Vänta VisarServo.write(90); // Ställ visarservot i mitten delay(5000); // Vänta VisarServo.write(10); // Ställ visarservot i maxläge delay(5000); // Vänta VisarServo.write(90); // Ställ visarservot i neutral-läge mitten delay(10000); // Vänta } void loop() { byte i; double freq; // flyttal long x; // tal större än 32768 int y; // Synchronize: low-high-low while (0==digitalRead(net)); // leta reda på när 50Hz går låg while (1==digitalRead(net)); // just now changed to LOW lastmicro=micros(); // kopiera timern till lastmicro // Wait 50 periods for (i=0;i<100;i++) { while (1==digitalRead(net)); // mät tiden för 50 perioder = 100 pulser while (0==digitalRead(net)); } // just now changed to HIGH // measure the time needed micro=micros(); // kopiera timern // compute frequency, freq=100000000.0/(micro-lastmicro); //dividera 1 sek med tiden för 100 pulser freq-=0.256; // vet ej vad detta är?? micros har upplösningen av 4 µs if ((freq >49.800) and (freq< 50.200)){ // sortera bort felaktiga mätvärden //Serial.println(freq,3); // skriv tiden till seriemonitorn med tre decimaler } //**************************************************************************************** // beräkna värdet för att visa det på ett visarinstrument via PWM utgången eller servoutgången x= freq * 1000; //multiplicera med 1000 så får vi alla fem siffrorna i heltal // x är long heltalvariabel, freq är flyttal x= x - 49800; // dra bort 49800 så får vi "0" vid lägsta värde // och 400 vid 50200, nu har vi ett värde mellan 0 - 400 y=x; // kopiera värdet till servovisningen x = map(x, 0,400,0, 255); // mappa, skala detta värde så att det passar PWM utgången 0...255 // x = 255; // för att trimma instrumentet till max // analogWrite(Instrument, x); // skriv det beräknade PWM-värdet till instrumentet //************************************************************************************** // Visa frekvnsen med hjälp av ett servo VisarValue = map(y, 0, 400, 180, 0); // mappa frekvensen värde till 0 - 180 grader, spegelvänt! VisarServo.attach(10); // attaches the servo on pin 10 VisarServo.write(VisarValue); // Ställ visarservot i position delay(50); // tid för att köra servot till positionen VisarServo.detach(); // detaches the servo, stäng av servot! delay(500); // stäng av servot... det surrar annars o vänta 0,5 sek } // end