PWM Signal generieren und auslesen

Manchmal hat man was programmiert und traut dem Braten nicht, man will sehen ob der Arduino noch lebt.
Ich nutze dazu meist einen Heartbeat an einer LED, damit kann man sehr gut sehen ob der Arduino noch arbeitet und es wirkt angenehmer wie „Blink without delay“.

/*
 Heartbeat with PWM.h

 Created:	09.06.2017
 Author:	Ralf Bohnen - www.Arduinoclub.de
 This example code is in the public domain.

*/
#include <PWM.h>

//UNO PWM PINS : 3, 5, 6, 9, 10, 11
//Read more for other boards
//https://www.arduino.cc/en/Main/Products
int frequencyOutputPin = 9;

//Heardbead Timing
const long settingStepMicrosec = 19000; //<-- play with it
volatile unsigned long nextSetPulseWidthMicrosec;
volatile int actPulseWidthPercent;
volatile bool goToZero = false;

//Calculate CPU time required
volatile long start;
volatile long end;
volatile bool StopCPUMeasurement = false;

void setup() {
    //Start Serial I/O
    Serial.begin(115200);
    delay(500);
    Serial.println("\nHeadbeat with PWM.h");
    Serial.println(F("-------------------------------------------"));
    //Init Timers
    InitTimersSafe();
    //Set Frequency to 10kHz
    SetPinFrequency(frequencyOutputPin, 10000);
    //Set Width + to 0% LED off
    actPulseWidthPercent = 0;
    pwmWrite(frequencyOutputPin, actPulseWidthPercent * 2.55f);
} //end setup

void setLEDBrightness() {
    if (actPulseWidthPercent == 100 && !goToZero) {
        goToZero = true;
    }
    else {
        if (actPulseWidthPercent == 0 && goToZero) {
            goToZero = false;
        }
    }
    if (goToZero) {
        actPulseWidthPercent--;
    }
    else {
        actPulseWidthPercent++;
    }
    //Set Pulsewidth+
    pwmWrite(frequencyOutputPin, actPulseWidthPercent * 2.55f);

    nextSetPulseWidthMicrosec = micros() + settingStepMicrosec;

    //Calculate CPU time required END
    end = micros() - start;
    //-----------------------------------------

    //Show CPU time required
    //1 µs = 0,000001 sec
    if (!StopCPUMeasurement) {
        Serial.println("Required CPU time for LED 0% \nto LED 100% of brightness:");
        Serial.print(end * 100); Serial.print(" microseconds");
        StopCPUMeasurement = true;
    }

}

void loop() {
    if (micros() > nextSetPulseWidthMicrosec) {
        //Calculate CPU time required START
        start = micros();
        //-----------------------------------------
        setLEDBrightness();
    }
    //your Code .... >



} //end loop

Hier haben wir das Ergebnis des Programms auf dem Oszilloskop als Video.

Man kann hier sehr schön sehen wie sich die Spannung an der LED verändert, desto weiter der Tastgrad, desto größer die Spannung.

Hier eine zweite Version des Codes, der exakt das selbe macht  und auch auf dem Oszilloskop genau so aussieht aber das mit einem gewaltigen Unterschied.

/*
 Headrbead without library

 Created:	11.06.2017
 Author:	Ralf Bohnen - www.Arduinoclub.de
 This example code is in the public domain.

*/
int ledPin = 9;
unsigned int i = 0;
boolean rise = true;
int period = 1800;

//Calculate CPU time required
volatile long start;
volatile long end;
volatile bool StopCPUMeasurement = false;

void setup() {
    Serial.begin(115200);
    pinMode(ledPin, OUTPUT);
}


void loop() {
    if (i == period) {
        i = 1;
        rise = !rise;  
    }
    if (rise == false) {
        start = micros();
        digitalWrite(ledPin, LOW);
        delayMicroseconds(i);
        digitalWrite(ledPin, HIGH);
        delayMicroseconds(period - i);
        i = i + 1;
    }
    if (rise == true) {
        //Start CPU Time measurement
        start = micros();
        //---------------------------------------
        digitalWrite(ledPin, LOW);
        delayMicroseconds(period - i);
        digitalWrite(ledPin, HIGH);
        delayMicroseconds(i);
        i = i + 1;
        //Calculate CPU time required END
        end = micros() - start;
        //-----------------------------------------

        //Show CPU time required
        //1 µs = 0,000001 sec
        if (!StopCPUMeasurement) {
            Serial.println("Required CPU time for LED 0% \nto LED 100% of brightness:");
            Serial.print(end * period); Serial.print(" microseconds");
            StopCPUMeasurement = true;
        }
    }
}

Der erste Code benötigt um die LED von 0% ihrer Helligkeit auf 100% zu bringen genau : 8000 Micro Sekunden (0,008 Sek) CPU Zeit,
Der zweite Code der den internen Timer nicht benutzt sondern alles „händisch“ macht benötigt : 3276000 Micro Sekunden (3,276 Sek) CPU Zeit.

Beide Codes sind so eingestellt das es bei Beiden gleich lange dauert die LED von 0 auf 100% zu bringen.

Auf der nächsten Seite beginnen wir mit dem „Frequenz Leser„.

Das könnte dich auch interessieren …

Eine Antwort

  1. klaus sagt:

    Moin.

    Komme mit dieser Zeile aus Frequenzgenerator nicht klar:

    pwmWrite(frequencyOutputPin, width * 2.55f);

    2.55f?? Was bedeutet das‘ f ‚??

    Vielen Dank

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.