Forum: Mikrocontroller und Digitale Elektronik Arduino PWM als Schleife


von Marc S. (marcst)


Lesenswert?

Hallo zusammen,
ich habe ein Problem bei der Arduino Uno Programmierung. Habe ein PWM 
Programm geschrieben (dieses funktioniert auch). Nun möchte ich das die 
PWM 75 mal läuft, und dann den nachfolgenden Programmteil ausführt. 
Momentan läuft die PWM unendlich. Ich habe es auch schon mit einem Timer 
versucht diese funktioniert auch nicht.

Wer kann mir helfen?

Gruß Marc

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Marc Straub schrieb:
>  Nun möchte ich das die PWM 75 mal läuft
Eine PWM läuft immer, die wird nicht nach 75 Zyklen abgeschaltet...
> Ich habe es auch schon mit einem Timer versucht diese funktioniert auch
> nicht.
Dann hast du es falsch gemacht. Was du falsch gemacht hast, kann leider 
niemand sagen, weil der Quellcode fehlt.

Um es kurz zu fassen:
WAS willst du machen?
WIE sieht dein Quellcode aus?
WELCHEN uC verwendest du?

von Karl H. (kbuchegg)


Lesenswert?

Und vor allen Dingen: Warum 75 mal
Das ist nämlich ziemlich ungewöhnlich, falls das aus Lothars Beitrag 
nicht klar hervorgegangen ist.

von Jürgen S. (jurs)


Lesenswert?

Marc Straub schrieb:
> ich habe ein Problem bei der Arduino Uno Programmierung. Habe ein PWM
> Programm geschrieben (dieses funktioniert auch). Nun möchte ich das die
> PWM 75 mal läuft, und dann den nachfolgenden Programmteil ausführt.
> Momentan läuft die PWM unendlich. Ich habe es auch schon mit einem Timer
> versucht diese funktioniert auch nicht.

Ich weiß zwar auch nicht ganz genau was Du möchtest.

Aber wenn Du nur einen Pegel 75 mal in schneller Folge hoch- und 
runtersetzen möchtest, verwende dafür einen Digitalausgang und die 
Funktion delayMicroseconds() zwischen den Pegelwechseln!

Ansonsten erkläre bitte mal genauer, was das werden soll!

@Lothar Miller wg. uC: Auf einem Arduino Uno sitzt ein Atmega328P-PU

von Hannes L. (hannes)


Lesenswert?

Jürgen S. schrieb:
> Ich weiß zwar auch nicht ganz genau was Du möchtest.

Ich vermute mal, der Controller soll nebenher noch etwas Anderes tun als 
nur mit dem Schwanz ääähhh Pin zu wackeln. Aber für Genaueres braucht es 
mehr Info.

...

von Marc S. (marcst)


Lesenswert?

Ich habe jetzt selbst gemerkt das ich ein paar Infos vergessen habe. Bin 
neu hier und deswegen noch nicht so gefestigt was für Infos am besten 
sind.
Die µC Welt ist sowieso komplett neu für mich!

Unten dargestellt ist das PWM Programm. Die PWM soll nur 75 Zyklen 
machen und danach in ein weiteres Unterprogramm springen. Ich habe eben 
keine Ahnung wie ich das machen kann!

Vielen Dank für eure Hilfe!




#define INLENGTH 5       //maximale Größe der Zahl
#define INTERMINATOR 'H' //'H' von 'Hz'

char inString[INLENGTH+2];
int inCount;




#define MinFreq 33
#define MaxFreq 65535
#define Ausgangspin 13  //Ausgang für die Frequenz


unsigned int Frequenz = 5500 ; //Hz

void setup(){


  Serial.begin(9600);
  Serial.println("5500Hz");

  tone(Ausgangspin, Frequenz);
}

void loop(){


  Eingabe();  //Eingabe-Funktion, die Eingabe-String entgegennimmt

  //Zeichenkette -> Zahl
  Frequenz=atol(inString);

  //Bereich prüfen
  Frequenz=constrain(Frequenz, MinFreq, MaxFreq);

  Serial.print("Es wird gesetzt: ");
  Serial.print(Frequenz,DEC);
  Serial.println("Hz!");

  tone(Ausgangspin, Frequenz);
}

void Eingabe(){
  inCount=0;          //Ziffern-Zähler rücksetzen

  do
  {
    while (Serial.available()==0);
    inString[inCount] = Serial.read();
    if(inString[inCount]==INTERMINATOR) break;
    if((inString[inCount]<'0')||(inString[inCount]>'9')){
      inCount75;      //-> Workaround
    }
  }
  while(++inCount < (INLENGTH+1));
  Serial.flush();
}

von Karl H. (kbuchegg)


Lesenswert?

Marc Straub schrieb:
> Ich habe jetzt selbst gemerkt das ich ein paar Infos vergessen habe. Bin
> neu hier und deswegen noch nicht so gefestigt was für Infos am besten
> sind.
> Die µC Welt ist sowieso komplett neu für mich!
>
> Unten dargestellt ist das PWM Programm. Die PWM soll nur 75 Zyklen
> machen und danach in ein weiteres Unterprogramm springen. Ich habe eben
> keine Ahnung wie ich das machen kann!

Das erklärt aber immer noch keine der obigen Fragen.

Schau. Die Sache ist die.
Die Erfahreneren fangen in den meisten Fällen damit an, sich zu 
überlegen, ob denn die 'angedachte Lösung' für das zu lösende Problem 
überhaupt adäquat ist. Und deine Lösungsstrategie klingt so seltsam, 
dass sich viele hier fragen, ob du da nicht überhaupt auf dem falschen 
Dampfer bist.

von Karl H. (kbuchegg)


Lesenswert?

1
  Serial.print("Es wird gesetzt: ");
2
  Serial.print(Frequenz,DEC);
3
  Serial.println("Hz!");
4
5
  tone(Ausgangspin, Frequenz);
6
}

und wo ist da jetzt die PWM?

Sagtest du nicht #DU# hättest die PWM geschrieben?

Uh, oh
> Habe ein PWM Programm geschrieben (dieses funktioniert auch).
Das hab wohl nicht nur ich misverstanden.

Du hast die tone() Funktion benutzt! Dann sag das auch!

Tja. Jetzt hast du ein Problem. Wenn du tone() nicht vorgeben kannst, 
wieviele Zyklen es erzeugen soll, dann wirst du dir wohl selber einen 
Ersatz für tone machen müssen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.