Forum: Mikrocontroller und Digitale Elektronik Hilfe bei PWM


von Daniel S. (danst0)


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

von johnny.m (Gast)


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.

von Daniel S. (danst0)


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

von johnny.m (Gast)


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.

von Daniel S. (danst0)


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

von Stefan G. (steg13)


Lesenswert?

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

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.