Zähler für PWM-Signal

OP #6055567
Lesenswert?
• ▲
▼
Hallo Leute,

ich hätte mal eine Frage zum PWM-Signal an meinem Teensy 3.5
Und zwar habe ich einen PID-Regler programmiert, der soweit auch 
funktioniert und einen Stellwert (y_value1) liefert, den ich wie im Code 
zu erkennen auf max.100 gedeckelt ist.
Nun bin ich noch relativer Anfänger, und habe mir gedacht ich mache aus 
meinem Stellwert ein PWM-Signal. Ich wollte eine Periodendauer von 2s 
haben, also wenn der Stellwert 100 ist will ich 100% HIGH-TIME und bei 
Stellwert 50 z.B 50% HIGH-TIME und 50% LOW-TIME. Das soll dann über 
einen digitalen PIN geschalten werden.
Nur leide fehlt mir die Programmiererfahrung das Ganze zu realiesieren.

Ansatz wäre eine if-Funktion gewesen:
if (Zählerwert > Stellwert) {PIN auf LOW}
if (Zählerwert == 0) {dann wieder auf HIGH}

Habt ihr eine Idee wie man das realisieren könnte? Also wie bekomme ich 
einen Zähler hin, der alle 2s (Periodendauer) ein neues PWM erzeugt?

Danke im Vorraus

Anbei noch der bisherige Code
Angehängte Dateien:
Gast #6055602
Lesenswert?
• ▲
▼
PWM realisiert man normalerweise nicht durch solche Softwareschleifen, 
sondern durch Hardware-Timer.

Den dein Programm muss ja noch mehr machen, als nur das PWM Signal zu 
erzeugen. Ohne Hardware-Timer geht das nur sehr eingeschränkt und 
unpräzise.
Moderator (Firma: Titel) Persönliche Seite #6055613
Lesenswert?
• ▲
▼
Alexander R. schrieb:
> Also wie bekomme ich einen Zähler hin, der alle 2s (Periodendauer) ein
> neues PWM erzeugt?
Indem du zuallererst mal einen Zähler hast, der die Zeit mitzählt. Denn 
prinzipiell kennt ein Programm keine Zeit, sondern läuft so schnell wie 
möglich.
Und weil du jetzt ja eine gewisse und zudem ziemlich lange Zeit low und 
dann eine bestimmte Zeit high haben willst, brauchst du eine Uhr, die im 
einfachsten Fall die Millisekunden zählt.
Und wenn du dann 50% PWM willst, dann machst du jeweils 1s high und low.

Beim Arduino heißt diese Uhr millis()
Gast #6055624
Lesenswert?
• ▲
▼
Lothar M. schrieb:
> Alexander R. schrieb:
> Also wie bekomme ich einen Zähler hin, der alle 2s (Periodendauer) ein
> neues PWM erzeugt?
>
> Indem du zuallererst mal einen Zähler hast, der die Zeit mitzählt. Denn
> prinzipiell kennt ein Programm keine Zeit, sondern läuft so schnell wie
> möglich.
> Und weil du jetzt ja eine gewisse und zudem ziemlich lange Zeit low und
> dann eine bestimmte Zeit high haben willst, brauchst du eine Uhr, die im
> einfachsten Fall die Millisekunden zählt.
> Und wenn du dann 50% PWM willst, dann machst du jeweils 1s high und low.
>
> Beim Arduino heißt diese Uhr millis()

Danke für die schnelle Antwort.
Hast du vielleicht ein Beispiel wie man so einen Zähler realisieren 
kann? Find im Netz nur unnötig komplizierte Sachen.
#6055681
Lesenswert?
• ▲
▼
Ich nutze für so langsame PWM gerne einen Timer-Interrupt.
Wenn dir eine Auflösung von 1% bei 2 Hz ausreicht, wird dieser ja nur 
alle 20ms aufgerufen.

Die PWM wird "gesteuert", indem du irgendwo in loop() pwm_set auf einen 
Wert zwischen 0 und 100 setzt.
Die in timer_isr() implementierte Routine kann mit den Extremfällen PWM 
0% (dauerhaft AUS) und 100% (dauerhaft EIN) umgehen.
1
#include "TimerOne.h"
2
#include <stdint.h>
3

4
uint8_t pwm_cnt = 0;
5
uint8_t pwm_set = 0;
6
uint8_t pwm_state = 0;
7

8
void timer_isr()
9
{
10
  digitalWrite(PWM_PIN, pwm_state);
11

12
  pwm_cnt++;
13
  if (pwm_cnt >= 100)
14
  {
15
    pwm_cnt = 0;
16
    pwm_state = 1;
17
  }
18
  
19
  if (pwm_cnt >= pwm_set)
20
    pwm_state = 0;
21
}
22

23
void setup() 
24
{
25
  Timer1.initialize(20000); // every 20ms
26
  Timer1.attachInterrupt(timer_isr);
27
}
28

29
void loop() 
30
{
31
  // do other stuff
32

33
  pwm_set = 10; // set PWM to 10%
34
  while(1);
35
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.