www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hilfe bei PWM


Autor: Daniel Stengel (danst0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Zusammen,

ich versuche gerade den PWM meines ATTiny26 zur Servosteuerung zu 
gebrauchen.
Leider komme ich dabei nicht ganz so weit (wenigstens zuckt der Servo 
beim Programmiervorgang ein bisschen also der funktioniert zumindest).
Folgenden Code habe ich verfasst:

int main(void)
{
  wdt_disable();
  DDRB = 0xff;
  PORTB = 0xff;
  DDRA = 0xff;
  PORTA = 0x0;

  TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<PWM1A);
  TCCR1B = (1<<CS13) | (1<<CS12) | (0<<CS11) | (0<<CS10);
  // weder die erste noch die zweite Zuweisung zu TIMSK funktionieren 
bin mir nicht ganz sicher, ob die Interrupts an oder aus sein müssen.
        TIMSK |= (1<<OCIE1A) | (1<<TOIE1);
  //TIMSK &= ~B00111100;
        sei();

        OCR1A = 148;
  OCR1C = 156;
        // Berechnung der Frequenz: 16 MHz Quartz (Fuses korrekt 
gesetzt) Teiler auf 2048 eingestellt, also 7812,5 mal pro Sekunde wird 
bis 156 (OCR1C) hochgezählt (7812,5/156 ~ 50 Hz). Um etwa 1 ms High zu 
bekommen muss OCR1A daher auf 148 (Differenz 8) gesetzt werden (1,024 
ms).
  while (1);
}

Ich habe die Steuerleitung des Servos an PB1 gehängt, sollte also 
eigentlich funktionieren.
Ich bin schon einigermaßen erfahren im Umgang mit Mikrocontrollern, PWM 
ist  halt leider etwas neu.

Wäre super, wenn mir jemand einen Tipp geben könnte was ich falsch 
mache...

Viele Grüße,

Daniel

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> bin mir nicht ganz sicher, ob die Interrupts an oder aus sein müssen.
Wenn Du die Interrupts aktivierst, müssen auch entsprechende 
Interrupt-Handler vorhanden sein. Wenn nicht, dann gibts bei jedem 
Interrupt-Ereignis nen RESET. Wenn Du also nirgends in Deinem Programm 
die ISRs zu den aktivierten Interrupts definiert hast, dann dürfte es 
kein Wunder sein, dass der Servo nur zuckt... Aber da Du kein 
vollständiges Programm geschickt hast, kann man da nicht mehr zu sagen.

Autor: Daniel Stengel (danst0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die schnelle Antwort.
OK, d.h. es ist auch möglich ohne aktivierte Interrupts den PWM zu 
betreiben, also mach ich sie aus.

Um ehrlich zu sein ist das bisher mein vollständiges Programm (bis auf 
die includes). Ich drehe den Servo gerade per Hand (natürlich ohne 
Strom) auf eine zufällige Position. Dann müsste sich der Servo ja (wenn 
der PWM funktioniert) auf eine andere Position drehen und dort bleiben, 
oder?

Daniel

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> OK, d.h. es ist auch möglich ohne aktivierte Interrupts den PWM zu
> betreiben
Die Compare-Einheiten (und bei entsprechender Konfiguration die 
dazugehörigen Ausgangspins) sind zusammen mit den Timern völlig 
unabhängige Peripherie-Einheiten. Die laufen, einmal initialisiert, 
immer weiter, bis man die Einstellungen ändert (oder den µC ausschaltet, 
schlafen schickt, kaputthaut o.ä.), und dabei ist es völlig egal, was 
man währenddessen im Programm macht. Interrupts brauchste nur dann, wenn 
bei einem Ereignis auch etwas gemacht werden soll, was die Hardware 
nicht alleine kann.

Autor: Daniel Stengel (danst0)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber das programm müsste prinzipiell alles machen, um den PWM A korrekt 
zu initialisieren. Bei gegebenen 16MHz müsste also ein etwa ein 20ms/1ms 
PWM an Pin PB1 zur Verfügung stehen, oder?
Obwohl mir die Antwort auf die Frage eigentlich nicht viel weiterhilft 
da es ja leider nicht funktioniert...;-(

Viele Grüße,

Daniel

Autor: Stefan Gemmel (steg13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Programm funktioniert.
Gibt kurze High-Impulse aus.
wdt_disable(); hab ich weggelassen
Von Servos habe ich keine Ahnung

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.