INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
pwm 100hz
15.07.2016, 15:05
Beitrag #1
pwm 100hz
Hey Leute Wink

Hoffe mir kann jemand weiterhelfen. Rolleyes

Wie bekomme ich den Arduino dazu pwm Signale mit 100HZ zu erzeugen?

google hilft mir leider nicht Huh

Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.07.2016, 16:56
Beitrag #2
RE: pwm 100hz
Vielleicht hilft die dies weiter:

https://www.arduino.cc/en/Tutorial/SecretsOfArduinoPWM
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2016, 15:06 (Dieser Beitrag wurde zuletzt bearbeitet: 16.07.2016 15:07 von Scheams.)
Beitrag #3
RE: pwm 100hz
Hey!

Bei sowas hilft hilft das Datenblatt.
Timer durchlesen und verstehen Smile

Für Uno bzw. ATmega328P:
-> Datenblatt <-

Fast PWM Mode (Seite 123; 16.9.3):
- Viel Info über Fast PWM Mode
- Formel für Frequenz: f = F_CPU / (N * (1 + TOP))
WGM (Seite 132, Table 16-4):
- Fast PWM (Mode 14) TOP = ICR1 (ein Register)

TOP ausrechnen:
(umgeformt) TOP = F_CPU / (N * f) - 1
angenommen F_CPU = 16MHz, f = 100Hz
N fängt man an mit dem kleinsten und geht höher bis das Ergebnis in ein 16-Bit Register hineinpasst (2^16 = 65536)
Tabelle für alle Prescaler auf S. 134 Table 16-5 (1, 8, 64, 256, 1024)
Also:
N = 1: TOP = 159.999 < 65536 --> falsch, nächster Prescaler
N = 8: TOP = 19.999 < 65536 --> passt

Jetzt nur noch die Register setzen:
Code:
#define TOP 19999

// WGM für PWM Mode 14
// COM für nicht invertierende ausgänge an OC1A und OC1B (S. 131 Table 16-2)
// CS für Prescale 8
TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
TCCR1B = (1 << WGM13) | (1 << WGM12)  | (1 << CS11)  ;
ICR1   = TOP;
// IO's müssen als Ausgänge definiert sein
DDRB = (1 << DDB1) | (1 << DDB2);

Im Code die Ausgänge so ansteuern (neue Werte immer bei BOTTOM geseetzt, dh wenn TCNT1 = 0, werden die OCRxn Register neu gesetzt):
Code:
// PWM 9 ansteuern, min max Werte
OCR1A = 0;
OCR1A = 19999;
// PWM 10 ansteuern, min max Werte
OCR1B = 0;
OCR1B = 19999;

Ein Beispielssketch wäre dann:
Code:
#define TOP 19999

int
main(void)
{
    TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
    TCCR1B = (1 << WGM13) | (1 << WGM12)  | (1 << CS11)  ;
    ICR1   = TOP;

    DDRB = (1 << DDB1) | (1 << DDB2);

    while(1)
    {
        if (OCR1A == TOP) OCR1A = 0;
        if (OCR1B == TOP) OCR1B = 0;
        OCR1A ++;
        OCR1B ++;
        delayMicroseconds(50);
    }
}

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2016, 19:49 (Dieser Beitrag wurde zuletzt bearbeitet: 16.07.2016 19:50 von Mathias.)
Beitrag #4
RE: pwm 100hz
Ich habe den Code auf Arduino umgesetzt , die LED an Pin 9/10 werden langsam hell, und erlöschen dann blitzartig, die beiden LEDs machen es Zeitversetzt.
Das hätte man mit analogWrite auch machen können.

Aber ich denke. da ist nicht das was gesucht ist, es wird noch der PWM-Frequenz gesucht.
Code:
#define TOP 19999

void setup() {
  {
      TCCR1A = (1 << WGM11) | (1 << COM1A1) | (1 << COM1B1);
      TCCR1B = (1 << WGM13) | (1 << WGM12)  | (1 << CS11)  ;
      ICR1   = TOP;

      DDRB = (1 << DDB1) | (1 << DDB2);

      OCR1A = TOP / 2; // LED versetzen
  }
}

void loop() {
          if (OCR1A == TOP) OCR1A = 0;
          if (OCR1B == TOP) OCR1B = 0;
          OCR1A ++;
          OCR1B ++;

          delayMicroseconds(50);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.07.2016, 22:40 (Dieser Beitrag wurde zuletzt bearbeitet: 16.07.2016 22:42 von Scheams.)
Beitrag #5
RE: pwm 100hz
Hey!

Entweder hast du es falsch beschrieben oder du weißt nicht was die Frequenz bei einem PWM Signal ist.

Die Frequenz von einem PWM Signal ist immer fix. Dh. in deinem Fall - 100Hz - widerholt sich nach 10ms immer der gleiche Zyklus. Bei PWM kannst du nur einstellen, wie lang während diesem Zyklus eingeschalten werden soll.
Dh. Du kannst bestimmen wie lange der Ausgang LOW ist und wie lang HIGH ist, beide Schaltezeiten zusammen ergeben die Periodendauer (10ms).
Beispiel:
5ms HIGH, 5ms LOW (5+5=10) -> LED leuchtet mittel
1ms HIGH, 9ms LOW (1+9=10) -> LED leuchtet schwach
10ms HIGH, 0ms LOW (10+0=10) -> LED leuchtet maximal

Bei analogWrite() wird eine andere Frequenz verwendet (ich bin mir nicht sicher aber ich glaube ~30kHz, d.h. eine Periodendauer 30us). Die Funktion an einer LED wird die gleiche sein, nur falls die Frequenz zu niedrig wird, kann die LED zu flackern beginnen.

Was bei meinem Beispiel passiert, ich erhöhe die Einschaltzeit (von 0 - 100%) und bei TOP wird wieder auf 0 gesetzt - alles mit einer PWM-Frequenz von 100Hz.

Ich weiß nicht was du als PWM-Frequenz definierst, ich bitte um eine Erklärung Rolleyes

mfg Scheams
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.07.2016, 16:01
Beitrag #6
RE: pwm 100hz
Zitat: alles mit einer PWM-Frequenz von 100Hz.
was muss man ändern, wen man zB. 10Hz will ?

Ich habe anstelle des LED einen Speaker, inklusive des Vorwiderstandes, angeschlossen, man hört das 100Hz knurren.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.07.2016, 16:17
Beitrag #7
RE: pwm 100hz
Vielen Dank für die vielen Antworten.

Rolleyes


Ich habe jetzt mal nachgemessen was läuft falsch wenn ich zb

1ms HIGH, 9ms LOW (1+9=10) -> LED leuchtet schwach

das Programm dazu:

Code:
int outPin = 3;                

void setup()
{
  pinMode(outPin, OUTPUT);      
}

void loop()
{
  digitalWrite(outPin, HIGH);  
  delayMicroseconds(1);        
  digitalWrite(outPin, LOW);  
  delayMicroseconds(9);          
}

dann kommt eine Frequenz von 39kHz dabei raus ich benötige aber 100HZ

Mache ich da was falsch Dodgy

Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.07.2016, 17:10
Beitrag #8
RE: pwm 100hz
(17.07.2016 16:27)Lötzinnerhitzer schrieb:  vllt. solltest Du einmal erklären, was Du vor hast, Wink
damit etwas Licht in's Dunkel kommt bzw. wir unsere Glaskugel damit füttern können Big Grin

Sorry stimmt Big Grin

Es geht um einen Rolladenmotor der wird über PWM gesteuert ich habe das Signal von der Platine die nach den Schalter für rauf / runter kommt mal an mein Oszi gehangen.

So ein Zyklus dauert laut oszi immer 10ms. Wenn ich auf Rollladen auf drücke dann werden 9ms auf masse gezogen ( Steuerleitung) und wenn ich Rolladen runter drücke dann wird die Steuerleitung 1ms auf masse gezogen. Ich wollte das ganze jetzt mit einem Arduino ansteuern weil ich das dann in meine Hausautomation einbinden will das problem liegt jetzt darin wie bekomme ich das Signal so imitiert ?

Versorgungsspannung ist 24 Volt
Sind insgesamt 5 Leitungen ( 2 für die endschalter).
24 v
GND
Und das Signal.

Vor allem wie mache ich das ( auf masse schalten ) ? Ich dachte an einen Mosfet?

Gruß Marc

Shy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste