PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM und Schrittmotorem im PIC18F2550



galdo
10.03.2007, 12:33
Hallo,

für eine Uni-Projekt soll ich mittels des vom PIC generierten PWM-Signals einen Schrittmotor antreiben. Jetzt habe ich folgendes Problem:

Der Pic läuft mit 48Mhz und wird von einen 20Mhz Quarz angetrieben. Ein Conrad S-54751HB wird mit 5V Spannung betrieben.

Per Oszi habe ich an den beiden PWM-Ausgängen des PIC ein wunderbares Rechecksignal mit einer Frequenz von 2,92kHz - soweit ich weiß laufen die Schrittmotoren aber nur mit 50Hz (max).

PR2 steht bei mir schon auf 255 und der Vorteiler liegt bei 16:1, d.h. das ich jezt schon die langsamste Frequenz habe, den mit der Pic generieren kann.

Hat jemand eine Idee, wie ich die Frequenz noch weiter runterbekomme? Muss ich mir jetzt ein eigenes Rechtecksignal bauen, dass mit 50Hz läuft, oder kann ich irgendwie doch noch den PIC dazu überreden, mir ein solches Signal zu liefern.

Hier ist noch der Code meiner init()-Funktion:


void mod_pwm_init() {

PR2 = 255;
old_steps = 128;

//clear registers
CCPR1L = 0;
CCPR2L = 0;
CCP1CON = 0;
CCP2CON = 0;

CCP1CONbits.DC1B0 = 0;
CCP1CONbits.DC1B1 = 0;
CCP2CONbits.DC2B0 = 0;
CCP2CONbits.DC2B1 = 0;

//set and enable PWM
CCP1CONbits.CCP1M2 = 1;
CCP1CONbits.CCP1M3 = 1;
CCP2CONbits.CCP2M2 = 1;
CCP2CONbits.CCP2M3 = 1;

//define CCP1 and CCP2 as output
TRISCbits.TRISC1 = 0;
TRISCbits.TRISC2 = 0;

//Pre-Devider set to 16:1
T2CONbits.T2CKPS0 = 0;
T2CONbits.T2CKPS1 = 1;

//turn PWM on
T2CONbits.TMR2ON = 1;


CCPR1L = old_steps;
CCPR2L = old_steps;
}



Betrachtet man die Hardwarelast durch ein eigenes Rechtecksignal, wäre der interne PWM wohl das bessere Ergebnis, oder?

Vielen Dank schonmal für eure Hilfe
Galdo

kalledom
10.03.2007, 18:23
.... PR2 steht bei mir schon auf 255 und der Vorteiler liegt bei 16:1 Meine Berechnungen ergeben:
20MHz / 4 = 5MHz => 200ns => 0,2µs
Prescaler 1 : 16 = 0,2µs * 16 = 3,2µs
PR2 = 255 => (256 - 255) * 3,2µs = 3,2µs => 312.500Hz
PR2 = 0 => (256 - 0) * 3,2µs = 819,2µs => 1220,703125Hz
Das Timer2-Flag wird beim Überlauf von 255 nach 0 gesetzt ! und dabei der Wert in PR2 nach TMR2 kopiert (reload).

Edit:
Schrittmotoren laufen je nach Einstellung des Treibers (Halbschritt, Vollschritt, Mikroschritt) mit einem Takt von bis zu mehreren hundert Kilohertz.
Bei Halb- oder Vollschritt geht es immer noch bis 10.000 Hz und mehr.
Wenn ein Schrittmotor z.B. 180 Schritte pro Umdrehung macht und ein 50Hz Taktsignal bekommt, dann macht er 50Hz / 180Schritte = 0,278 Ups => 16,667 Upm

galdo
10.03.2007, 22:32
Das Oszi sagt halt was anderes und laut Sprut kommt das auch ungefähr hin...

Und nu?

Danke GALDO

kalledom
10.03.2007, 23:42
Ich hatte den Schrittmotor zur Kenntnis genommen und das Wort PWM etwas 'ausgeblendet', da ein Schrittmotor nicht mit PWM gesteuert werden kann, sondern mit Takten, die an eine Schrittmotor-Endstufe gegeben werden.
Auf der Seite 136 des Datenblatts zum PIC18F2455/2550 habe ich das Blockbild "FIGURE 13-1: TIMER2 BLOCK DIAGRAM" als Grundlage für meine Berechnungen genommen.
Wenn der Timer 2 in einem anderen Modus läuft, werden Deine Meßergebnisse wohl stimmen.
Da ich weder den PIC18F2455/2550, noch die Programmiersprache C besser kenne, kann ich Dir auch nicht weiter helfen; ich programmiere haupsächlich in Assembler mit dem PIC 16F877.

galdo
11.03.2007, 08:44
OK - danke! Ich werde jetzt wohl Timer1 für meine Zwecke missbrauchen und mir mein eigenes Rechtecksignal generieren. Ich hab zwar nicht so viel Ahnung von PICs aber, aber ich denke dass hier auch mittels eines Interrupts beim Überlauf ein Zähler mit der passenden Frequenz generiert werden kann.

Wie kann ich denn im Detail direkt eine logische 1 und 0 auf die Register CCP1 und CCP2 geben?

Irgendwie scheint das mit CCP1 = 1; und CCP1 = 0; nicht zu gehen? Wie würdest du / ihr das in ASM realisieren?

Danke GALDO

kalledom
11.03.2007, 11:17
Ist Dir jetzt klar, daß PWM für Gleichstrom-Motoren und nicht für Schrittmotoren ist ?
Je nach Drehzahl des Schrittmotors mußt Du beim Anfahren und Anhalten eine Rampe erzeugen. Wenn Du z.B. 5000Hz auf die Endstufe gibst, piept der Motor mehr oder weniger laut und das wars. Die Trägheit des Rotors muß überwunden werden und das geht nur, wenn Du mit einer kleinen Frequenz (Start-/Stop-Frequenz) beginnst, die Frequenz in einer bestimmten Zeit erhöhst (Beschleunigung / Rampe) bis die maximale Frequenz (Hochgeschwindigkeitsphase) erreicht ist. Zum Anhalten der umgekehrte Verlauf, weil sonst der Schrittmotor einfach weiter dreht, mit Last sowieso.
Per Interrupt geht das ganz gut. Bei jedem Timer-Überlauf (254...255...0) wird ein Interrupt ausgelöst.
Jetzt könntest Du eine Timer-Schritt-Zeit wählen, die bei 256 Schritten (= 0 im Timer-Register) die Start-/Stop-Frequenz und bei 1 Schritt (= 255 im Timer-Register) die Maximal-Frequenz ergibt.
In jedem Interrupt kannst Du einen beliebigen Ausgang kurz auf Low setzen, gefolgt von 1...3 NOPs (oder andere benötigte Befehle) und dann wieder auf High.
Für eine Rampe kannst Du zusätzlich bei jedem Interrupt den Timer-Wert bis 255 erhöhen (steigende Rampe) oder bis 0 verringern (fallende Rampe) und dann keine Impulse mehr rausgeben (Halt).
Wie Timer beim PIC Interrupts auslösen, kannst Du als Assembler-Beispiele in diesem (http://www.domnick-elektronik.de/picasm.htm) und diesem (http://www.domnick-elektronik.de/picpwm.htm) Link sehen.

galdo
11.03.2007, 21:04
OK - ich glaube ich hatte mich etwas unsauber ausgedrückt. Früher wurden die Motoren an einem SD21-Board verwendet. Ich bin mir nichtmal sicher, ob das überhaupt Schrittmotoren sind: Es sind wohl eher "Servos", die durchaus mit PWM-Signale von 50Hz bis 100Hz betrieben werden können, allerdings ist die Doku zum S-54751HB eher schlecht - und ich bin darau angewiesen, genau diese Motoren zu verwenden.

Die Frage zielt, so wie es mir scheint durchaus darauf ab, ein Rechtecksignal mit etwa 50Hz zu erzeugen. Ich werde mir mal die von dir angefügten Links genauer durchlesen.

Schonmal vielen Dank
Galdo

heinz-juerge
19.03.2007, 14:10
Schade dass ihr schon fertig seid. Habe die gleiche Frage - wie beschleunige ich einen Schrittmotor (RN-Control + L297/L298 board) von langsam auf max. Drehzahl - aber in Bascom?
Danke Heinz-Jürgen

kalledom
19.03.2007, 14:52
Schrittmotor ... Servomotor ... Gleichstrommotor ...
da liegen Galaxien zwischen.
@Heinz-Jürgen
Da ist Deine Frage schon etwas konkreter.
Bascom habe ich nicht, den L297/L298 kenne ich nicht, aber Schrittmotoren und deren Rampen zum Beschleunigen auf größere Drehzahlen, da kann ich Dir was zu sagen.
Es wird mit der Start-Stop-Frequenz begonnen. Bei dieser Frequenz muß der SM sicher anlaufen. Dann wird die Frequenz erhöht (Steigung = Beschleunigung); nicht zu schnell, sonst steigt der SM wieder aus. Bei der Maximal-Frequenz bleibt die Frequenz stehen.
Zum Anhalten gilt der gleiche Ablauf in umgekehrter Reihenfolge.
Die Frequenzen werden eigentlich vor dem Start mit den gegebenen Parametern berechnet und in einer Tabelle abgelegt.
Und jetzt kommen die Probleme:
- der Speicher im PIC ist dafür zu klein
- obwohl Bascom sehr schnell ist, dürfte das evtl. nicht reichen
Dann wäre es noch sinnvoll, die Schritte zu zählen.
Ob der µC das alles schafft ?
Mit einem 80C166 (16 Bit µC) schaffe ich 4 Schrittmotoren, insgesamt maximal 70kHz, dann ist der Controller am Ende. Und alles schön optimiert und in Assembler.
Also, mit Start/Stop-Frequenz beginnen, in Schritten pro ms erhöhen, bis Max.Frequenz erreicht ist.
Die Tabelle wird länger und länger, wenn die Differenz zwischen Anfangs- und Endfrequenz größer und die Takterhöhung pro ms kleiner wird (langsame Beschleunigung).