• Die Forumsregeln und Nutzungsbedingungen findet ihr in der Navbar unter Impressum !
    Bitte unbedingt beachten!
    Wie überall im Leben gibt es Spielregeln, so auch hier!
    Die Datenschutzerklärung zum DSGVO findet ihr ebenfalls in der Navbar unter Datenschutzerklärung !
    Hinweis nach DSGVO :
    Es ist hier keinerlei Angabe erforderlich. Alle Angaben in diesem Bereich sind öffentlich sichtbar und werden freiwillig gemacht. Mit einem Eintrag in diesem Bereich erkenne ich dieses an, und bestätige die Datenschutzerklärung zur DSGVO für das Forum gelesen zu haben.

    Danke
  • Hallo Gast, beschränke dich hier bitte auf den Bereich der Elektronik. Die Fahrzeuge oder Gebäude, wo diese Elektronik eingebaut wird bitte in dem passenden Fachbereiich behandeln. Auch wenn Teile des Projektes dadurch im Forum doppelt vorhanden sind! Danke.

Arduino PWM Frequenz frei einstellen

Bording

Well-known member
Supermoderator
VIP Unterstützt modelltruck.net 2024
Registriert
08.08.2007
Beiträge
1.949
Hallo,

ich programmiere gerade den Kettenregler für meinen Semovente.
Als Prozessor ist ein Arduino Nano vorgesehen (später vielleicht mal der Mini). Als Regler für die Gleichstrommotoren habe ich 2 Stück VNH2SP30 genommen. PWM signal nehme ich von PB1 (Pin 9) und PB2 (Pin 10).
Das läuft soweit, allerdings möchte ich die PWM Frequenz ändern. Geht mit dem TCCR1B Register

TCCR1B = B00000001; mit den 3 Bits kann ich den Teiler einstellen, hier ist der Teiler 1 = 31.372 Hz

kann man auch so programmieren:
TCCR1B = _BV(CS10);

Setz ich den Teiler auf 8
TCCR1B = B00000010; mit den 3 Bits kann ich den Teiler einstellen, hier ist der Teiler 1 = 3921 Hz

kann man auch so programmieren:
TCCR1B = _BV(CS11);

Wenn ich eine andere Frequenz haben möchte, dann muss ich auch das TCCR1A Register anfassen.
hier für 15623 Hz
TCCR1A = B01100011; non-inverted Mode, WGM11 & WGM10
TCCR1B = B00001001; WGM12 -> Fast PWM mit max 1023 Schritten
OCRA1A =512,
OCRA1B = 512;

Ich habe da noch diverse andere Einstellungen probiert, leider ohne Erfolg.
über die Einstellung WGM12=1 toogle OC1A on compare Match, sollte man eigentlich zusammen mit dem OCR1A Wert eine Einstellung hinbekommen die bei 10 kHz liegt, so hab ich das wenigsten verstanden. Irgendwie ist da noch der Wurm drin.

Ich habe mich schon mit diversen Einstellungen probiert und auch so manches Tutorial gelesen, also bitte keinen Link zu einer ganz tollen Seite, sondern nur einen kurzen Vorschalg wie man das lösen kann.
 
Nach viel probieren und noch mehr lesen, hier mal eine Deutsche Seite, hab ich es nun selbst heraus gefunden.

// Fast PWM Mode 14, variable Frequnez, Auflösung wie ICR1, Teiler 1
// Beispiel 12 kHz: ICR1 = (fclock/fpwm)-1 = (16000000 Hz/12000 Hz)-1 =1332
TCCR1A = B00000010;
TCCR1B = B00011001;
ICR1 = 1065; // 15 kHz
Aufloesung_PWM = 1065;

//Ausgangstreiber
PWM_rechts = map (PWMrechts, 1100, 0, Aufloesung_PWM, 0);
PWM_links = map (PWMlinks, 1100, 0, Aufloesung_PWM, 0);
analogWrite(Motor_1_PWM, PWM_rechts); //Setzt die PWM an Pin 9
analogWrite(Motor_2_PWM, PWM_links); //Setzt die PWM an Pin 10
 
:thx für das Posting, denn ich hatte auch keine Idee wie das geht.
:winker
 
hier noch mal ein Nachtrag wie man verschiedene PWM Frequenzen einstellen kann:

/* Timer 1 ist ein 16 Bit Timer!

// Fast PWM Mode 14, variable Frequnez, Auflösung wie ICR1, Teiler 1
// Beispiel 10 kHz: ICR1 = (fclock/fpwm)-1 = (16000000 Hz/10000 Hz)-1 =1599
TCCR1A = B00000010;
TCCR1B = B00011001;
ICR1 = 1599; // 10 kHz
Aufloesung_PWM = 1599; //10kHz

// Slow PWM Mode 3, 7.819 Hz, Auflösung 1023, Teiler 1
TCCR1A = B00000011;
TCCR1B = B00000001; // 0=slow PWM

// Fast PWM Mode 5, 62.491 Hz, Auflösung 255, Teiler 1
TCCR1A = B00000001; //Fast PWM 255
TCCR1B = B00001001; //1 = Fast PWM; 001 = Teiler 1; 010 = Teiler 8; 011 = Teiler 32; 100 = Teiler 64; 101 = Teiler 128; 110 = Teiler 256; 111 = Teiler 1024

// Fast PWM Mode 6, 31.245 Hz, Auflösung 511, Teiler 1
TCCR1A = B00000010; // Fast PWM 511
TCCR1B = B00001001;

//Fast PWM Mode7, 15.623 Hz, Auflösung 1023, Teiler 1
TCCR1A = B00000011; // Fast PWM 1023
TCCR1B = B00001001;
*/
 

Servonaut
Zurück
Oben Unten