Forum: Mikrocontroller und Digitale Elektronik Pulse generieren mit AVRlib


von B. K. (bekoeppel) Benutzerseite



Lesenswert?

Hallo zusammen,

ich möchte für ein Schrittmotor-Projekt die AVRlib benützen, um 
kontinierlich Impulse zu generieren, die an eine Schrittmotorendstufe 
gereicht werden.
Die Endstufe generiert dann aus Richtung und Puls die Ansteuerung für 
den Schrittmotor.

Zum Einsatz soll dazu die pulse.h aus der AVRlib kommen. Die Einbindung 
klappt, die Funktionen können aufgerufen werden und ich versuche dann 
mit folgendem Code die Impulse zu generieren: (Beispiel für 300 Pulse 
bei 75Hz)
1
  pulseT1ASetFreq(75);
2
  pulseT1ARun(300);

Der Compiler compiliert brav ohne Fehler, das Programm lässt sich auf 
den Controller schieben, aber es werden keine Impulse an OC1A 
ausgegeben.
Ich bin ziemlich hilflos, weil ich in meinem Programm keinen Fehler 
finden kann.


Bitte helft mir, das Programm ans Laufen zu kriegen :D
Vielen Dank
Benedikt Köppel

von Ronny (Gast)


Lesenswert?

Die AVRLib kenn ich nicht.Auf welchem AVR programmierst du denn?

Viele AVRs (z.B. der Mega16) besitzen Timer,die eine PWM in Hardware 
realisieren können.Das wären dann 3 Zeilen,um den Timer zu 
initialisieren,der Rest läuft dann quasi von alleine.Im Datasheet des 
Atmega16 ist z.B. alles ab Seite 71 prima (aber auf englisch) erklärt.

Hab jetzt deinen Sourcecode nicht gelesen,allerdings würde ich so 
relativ triviale Dinge wie einen Timer zu initialisieren dann doch 
lieber von Hand machen und auf die Lib wo immer es geht verzichten.

von B. K. (bekoeppel) Benutzerseite


Lesenswert?

Hallo,

ich verwende einen ATmega32 und weiss schon, dass es einen Timer gibt. 
Aber da ich mit dem Schrittmotor nachher auch eine genaue 
Positionssteuerung machen will, bringt mir PWM nichts, weil ich 
überprüfen können muss, wieviele Impulse ausgegeben wurden.
Die AVRlib könnte sowas, weil sie darauf programmiert wurde.

Ich könnte natürlich einen "normalen" Timer, also ohne PWM nehmen und 
bei jedem Overflow im Interrupt den Pin kurz auf high und wieder zurück 
auf low schalten.
Ich nehme mal an, dass ich das mit dem Timer1 vom ATmega32 realisieren 
kann, der ja zwei Ausgänge OC1A und OC1B hat. Aber wie könnte ich 
konkret den jeweiligen Prescaler und Vorladewerte berechnen, wenn ich 
die gewünschte Frequenz kenne?
Das Programm müsste so flexibel sein, dass ich eine Funktion habe, die 
mir auf den beiden Ausgängen völlig unabhängige Impulse ausgeben kann, 
und das in beliebiger Frequenz, die dann programmintern berechnet 
werden.


Gruss aus der verschneiten Schweiz
Benedikt Köppel

von Peter D. (peda)


Lesenswert?

Benedikt Köppel wrote:

> Die AVRlib könnte sowas, weil sie darauf programmiert wurde.

???

Wie wärs mal mit nem Link, damit man weiß, wovon Du überhaupt sprichst.


Man kann sehr wohl die Impulse einer PWM mitzählen.
Die Overflow- und Compareinterrupts sind auch in den PWM-Modi aktiv.


Peter

von B. K. (bekoeppel) Benutzerseite


Lesenswert?

Hallo,

entschuldige, hier natürlich der Link: 
http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/group__pulse.html

Okay, die PWM-Pulse lassen sich mitzählen. Hört sich schon mal gut an. 
Bei PWM wird aber die Geschwindigkeit anhand der Pulsbreite verändert, 
das nützt mir nichts. Der Schrittmotor verändert die Geschwindigkeit 
anhand der Impulsfrequenz. Kann ich das bei PWM auch einstellen?

Gruss
Benedikt

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.