PWM- einige Anfangsprobleme (18F2550)
Montag, 21. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  PIC Mikrocontroller Allgemein  |  Timer (Allgemein)  |  PWM- einige Anfangsprobleme (18F2550) « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: PWM- einige Anfangsprobleme (18F2550)  (Gelesen 3795 mal)
 
zachso
Jr. Member
**
Offline Offline

Beiträge: 70


Profil anzeigen
« am: Juni 08, 2007, 13:33:34 »

hallo leute!

ich möchte eine Motorsteuerung(L293D, also eine normale H-Brücke) per PWM steuern. nun habe ich einige probleme, der betreffende Code den ich bis jetzt geschrieben habe sieht folgendermaßen aus:
Code:
void PWM_starten()
{
PR2=0xFF; //1.:Register PR2 wert FF zuweisen
CCPR1L=; //2.:
CCPR2L=;
CCP2CONbits.DC2B0=;
CCP2CONbits.DC2B1=;
CCP1CONbits.DC1B0=;
CCP1CONbits.DC1B1=;
TRISCbits.TRISC2=0; //3.: CCP1 als Ausgang
TRISCbits.TRISC2=0; // CCP2 als Ausgang
//4.: TMR2 Prescale setzen
T2CONbits.TMR2ON=1; //Timer2 ON
//5.: CCP1 für PWM konfiguriert
// CCP2 für PWM konfiguriert
}

so, also ein Problem bei 2tens, dazu steht im datenblatt:
2. Set the PWM duty cycle by writing to the CCPRxL register and CCPxCON<5:4> bits.

ich denke mal im CCPRxL kann ich also schreiben wie hoch der pwm laufen soll, das ist so richtig denke ich? also würde ein 0xFF bzw. 255 bedeuten er läuft mit 100%?

das nächste Problem sind die bits 4 und 5 der jeweiligen Configurationsregister, wie soll ich diese beschreiben? welche Aufgabe haben diese? Im Datenblatt steht dazu entweder zu wenig oder es steht nicht da wo ich es gesucht habe.

TMR2-Prascale habe ich eigentlich nur folgendes Frage: ich habe 12 MHz input , das wird geteilt auf 4MHz und dann über PLL hoch gesetzt auf 96 um dann geteilt zu werden in Takt für den USB und Takt für den Kern, dieser läuft also mit 48MHz. nur wie hoch setzte ich nun den Prescaler und vor allem welche bits muss ich dazu beschreiben?

bei schritt 5 stellt sich das Problem heraus, dass ich nicht raus bekommen habe welchen Register oder welches Bit ich löschen/schreiben muss um den jeweiligen Pin für PWM zu konfigurieren.

für Hilfe wäre ich sehr dankbar, ich bedanke mich daher schon mal an dieser Stelle und wünsche allen ein schönes Wochenende.

MfG, Zachso
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #1 am: Juni 08, 2007, 16:33:56 »

Hallo,

Zitat
ich denke mal im CCPRxL kann ich also schreiben wie hoch der pwm laufen soll, das ist so richtig denke ich?
CCPRxL legt den Duty cycle fest, also das high/low Verhältnis. CCP1CON<5:4> sind die LSB's für eine 10Bit Auflösung.
Zitat
das nächste Problem sind die bits 4 und 5 der jeweiligen Configurationsregister, wie soll ich diese beschreiben? welche Aufgabe haben diese?
Die Antwort befindet sich auf Seite 152 des Datenblatts:
Zitat
16.4.2 PWM DUTY CYCLE
The PWM duty cycle is specified by writing to the
CCPR1L register and to the CCP1CON<5:4> bits. Up
to 10-bit resolution is available. The CCPR1L contains
the eight MSbs and the CCP1CON<5:4> contains the
two LSbs. This 10-bit value is represented by
CCPR1L:CCP1CON<5:4>.
Das steht zwar im Abschnitt des Enhanced Moduls, gilt aber auch beim normalen CCPx. Die Skizze Fig 15-3 verdeutlicht dieses nochmal. Die Pins heißen eigentlich DCxB1:DCxB0.

Zitat
bei schritt 5 stellt sich das Problem heraus, dass ich nicht raus bekommen habe welchen Register oder welches Bit ich löschen/schreiben muss um den jeweiligen Pin für PWM zu konfigurieren.
Im CCPxCON stellt du das Modul auf PWM. Jedem Modul sind spezielle I/O-Pins zugeordent, die die PWM-Funktion übernehmen. Sie sind also nicht frei wählbar. Für CCP1 wäre der Ausgang beispielsweise RC2, CCP2 lässt sich (durch das Configword) wahlweise auf RC1 oder RB3 legen.

Zitat
nur wie hoch setzte ich nun den Prescaler und vor allem welche bits muss ich dazu beschreiben?
Welche Frequenz willst du erreichen?

Grüße Stefan
Gespeichert

zachso
Jr. Member
**
Offline Offline

Beiträge: 70


Profil anzeigen
« Antworten #2 am: Juni 10, 2007, 22:05:58 »

Zitat
CCPRxL legt den Duty cycle fest, also das high/low Verhältnis. CCP1CON<5:4> sind die LSB's für eine 10Bit Auflösung.
das heißt 255 wäre beispielsweise ein verhältnis von 100%, was heißen würde der port wäre praktisch abgeschatet? wenn mir diese 8 bit reichen, wie muss ich dann die CCP1CON<5:4> beschreiben? oder muss ich zwangsweise mit 10 bit arbeiten? und wie sieht das dann aus? ich verstehe die funktion der beiden zusätzlichen bits irgendwie nicht.
Das wird sicher daran liegen dass ich nicht mal weiß was MSbs und LSbs ist, gibt es dazu "Literatur" wo man soetwas nachlesen könnte?

Zitat
Im CCPxCON stellt du das Modul auf PWM. Jedem Modul sind spezielle I/O-Pins zugeordent, die die PWM-Funktion übernehmen. Sie sind also nicht frei wählbar. Für CCP1 wäre der Ausgang beispielsweise RC2, CCP2 lässt sich (durch das Configword) wahlweise auf RC1 oder RB3 legen.

gut, das heißt aber was muss ich im CCPxCON denn beschreiben? also welches Bit? wahrscheinlich sind für jemanden der sich damit "auskennt" die ganzen bitnamen im Datenblatt schon selbsterklärend, ich komme nur leider gar nicht weiter.

Zitat
Welche Frequenz willst du erreichen?
die Frequenz darf 5kHz nicht übersteigen. Das beispiel im Datenblatt wäre also ausreichend(prescaler von 16), nur wohin mit der 16?
im Datenblatt steht:
Zitat
T2CKPS1:T2CKPS0: Timer2 Clock Prescale Select bits
00 = Prescaler is 1
01 = Prescaler is 4
1x = Prescaler is 16
wenn ich das richtig interpretier heißt dies das Bit T2CKPS1 ist mit 1 zu beschrieben und das Bit T2CKPS0 womit? heißt das x es ist egal, oder er muss gelöscht (also 0?) werden? Soooo viele Fragen nur um einen motor ein wenig langsamer laufen zu lasen Smiley ...

vielen Dank für die Geduld und die Nerven welche ihr mir opfert, mfg, Zachso
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #3 am: Juni 10, 2007, 22:45:10 »

Hallo zachso,

lies dir bitte zunächst die Beschreibungen von sprut durch, welche hier http://sprut.de/electronic/pic/grund/pwm.htm zu finden sind. Das wird viele deiner Fragen schon beantworten.
Falls dann noch Fragen sind, beantworte ich dir die gerne morgen, jetzt ist schon bisschen spät.

MSB = Most Significant Bit = höchstwertigstes Bit (bei PIC Register Bit7)
LSB = Most Significant Bit = niederwertigstes Bit (bei PIC Register Bit0)

"x" bedeutet, dass der Wert egal ist.

Gruß, Stampede
Gespeichert

zachso
Jr. Member
**
Offline Offline

Beiträge: 70


Profil anzeigen
« Antworten #4 am: Juni 11, 2007, 22:25:29 »

Hallo!

also meine erste frage ist folgende: sprut schreibt:
Zitat
Bei einem angenommenen PIC-Takt von 20 MHz speist man den Timer2 nun mit 312,5kHz.

wenn ich aber 20*10^6/16 rechne komme ich auf 1,25*10^6,warum bzw. wie kommt Sprut denn auf 312,5kHz (mir ist durchaus bewusst dass ich mich mit dieser Frage wahrscheinlich komplett selbst disqualifiziere aber es muss leider sein)? Und wenn ich jetzt meinen PIC mit 48MHz betreibe aber nur 12MHz einspeise, welche Frequenz muss ich denn da nehmen? die 12 MHz vom Quarz oder immer die MHz mit denen auch die CPU läuft? oder evtl. sogar die gleich hinter dem PLL(also 96?)

so, die Bedeutung von PR2 ist mir jetzt klar, dieses Byte kann ich jedoch erst setzen wenn ich den Takt kenne mit dem der Timer 2 jetzt endgültig betrieben wird.

wenn ich nun davon ausgehe das dies auch für die PIC18F gilt:
Zitat
Für den PWM-Mode ist CCPxM3=1   und CCPxM2=1 zu setzen.

dann komme ich beim Punkt 5 zu folgendem Ergebnis:
Code:
CCP1CONbits.CCP1M2=1; //5.: CCP1 für PWM konfiguriert
CCP1CONbits.CCP1M3=1;
CCP2CONbits.CCP2M2=1; //CCP2 für PWM konfiguriert
CCP2CONbits.CCP2M3=1;

was ich leider immer noch nicht verstehe ist die Funktion der Bits 4 und 5 des Configurationsregister, sprut schreibt diese sollen für die 10Bit Auflösung gut sein, nur ich kann einfach nicht begreifen wie? In Spruts Programmen finde ich diese beiden Bits nicht einmal, auch in seinen Formeln zur Berechnung tauchen Sie nicht auf, nur was mache ich jetzt damit? löschen? setzten? egal?

nun ja, es geht ja schon mal vorwärts Smiley vielen Dank jedenfalls, mfg, Zachso
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #5 am: Juni 11, 2007, 23:13:55 »

Hallo,

Zitat
wenn ich aber 20*10^6/16 rechne komme ich auf 1,25*10^6,warum bzw. wie kommt Sprut denn auf 312,5kHz (mir ist durchaus bewusst dass ich mich mit dieser Frage wahrscheinlich komplett selbst disqualifiziere aber es muss leider sein)?
Die Frequenz der PWM richtet sich primär nach der Frequenz, die an Timer2 anliegt.
Bei 20Mhz arbeitet der PIC intern mit 5MHz. Durch den Prescalerwert von 16 erhält man 312,5 kHz.
Wenn dein 18F2550 nun mit 48Mhz läuft, ist der interne Takt 12MHz. Bei einem Prescaler von 16 wird der Timer2 mit 750kHz gespeist. Du möchtest beispielsweise 5kHz als PWM Frequenz haben 5kHz. Dazu musst du PR2 mit 750/5 = 150 beschreiben.
Zitat
der evtl. sogar die gleich hinter dem PLL(also 96?)
Die brauchst du nie.
Zitat
Und wenn ich jetzt meinen PIC mit 48MHz betreibe aber nur 12MHz einspeise, welche Frequenz muss ich denn da nehmen? die 12 MHz vom Quarz oder immer die MHz mit denen auch die CPU läuft?
Ich persönlich rechne meist mit dem internen Takt, aber manche Formel von Microchip nehmen den Takt des Quarzes. Das erkennt man an dem Faktor "4" der irgendwo auftaucht bzw an Fosc, welches  aber immer die Frequenz des Quarzes meinst.

Zitat
Zitat
Zitat
Für den PWM-Mode ist CCPxM3=1   und CCPxM2=1 zu setzen.

dann komme ich beim Punkt 5 zu folgendem Ergebnis:
Code:

Zitat
CCP1CONbits.CCP1M2=1;   //5.: CCP1 für PWM konfiguriert
CCP1CONbits.CCP1M3=1;
CCP2CONbits.CCP2M2=1;   //CCP2 für PWM konfiguriert
CCP2CONbits.CCP2M3=1;
Ja das kommt zum Schluss. Vorher muss noch der Duty Cycle festgelegt werden. Da kommen jetzt CCPxCON<5:4> ins Spiel.
Wie du siehst, ist die Auflösung der Frequenz in 255 Schritten der Timerfrequenz einstellbar, also mit 8Bit Auflösung. Im Unterschied dazu besteht die Möglichkeit, den Dutycycle mit 10Bit Auflösung einzustellen. Die 8 Bits aus CCPR1L stellen nun den Dutycycle ein, mit ihnen ist eine Auflösung von 8Bit möglich, also 1/255 = 0.0039% Schritte. Ist das nicht genau genug, können noch CCPxCON<5:4> herangezogen werden. Sie ermöglichen, den Dutycyle in 1024 Schritten (also 10Bit) einzustellen. Damit sind ca. 0,001% Auflösung für den DC möglich.
Diese 10Bit Auflösung ist möglich, solange die Gleichung 15-3 erfüllt ist, die die mögliche Auflösung angibt.

max. mögl. Auflösung = [log( Fosc/Fpwm)]/log(2),

wobei Fosc = Frequenz Quarz (bei dir 48Mhz) und Fpwm die Frquenz der gewünschten PWM ist.
Bei dir ergibt die obige Formel 11.22, es sind also 10Bit Auflösung möglich.

Wenn ich das richtig verstehe, möchest du einen Motor steuern (also mit PWM->Treiber->MOSFET).
Dazu ist eine 8Bit locker ausreichend. Du kannst also CCPxCON<5:4> einfach löschen.

Zitat
vielen Dank für die Geduld und die Nerven welche ihr mir opfert
Im Moment bin ich der einzige der opfert  :angel1:

Alles klar?

Grüße Stefan
Gespeichert

Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #6 am: Juni 12, 2007, 18:35:27 »

Vielleicht noch als Ergängzung:

CCPRxL und CCPxCON<5:4> bilden zusammen einen 10-Bit Wert in folgender Form:

Bit       9          8        ...       2            1             0
      CCPRxL<7>   CCPRxL<6>   ...   CCPRxL<0>    CCPxCON<5>    CCPxCON<4>


Mit CCPRxL = 255 und CCPxCON<5:4> = 00 ergibt sich damit ein Vergleichswert von 0b1111111100 = 0x3FC = 1020.

Um z.B. bei PR2=255 einen Duty-Cycle von 100% zu erzeugen, müssen auch CCPxCON<5> und CCPxCON<4> auf "1" gesetzt werden. Mit FOSC = 48MHz, also T_cycle = 4 / 48MHz = 83,33ns ergibt sich für die Periodendauer (Prescaler 1):

   T_PWM = PR2+1 * 83,33ns = 256 * 83,33ns = 21,33µs

Die On-Time der PWM mit CCPRxL = 255 und CCPxCON<5:4> = 00 ist aber nur:

   T_ON = 1020 * (83,33ns / 4) = 21,25µs


Viele Grüße

Bernd
Gespeichert

zachso
Jr. Member
**
Offline Offline

Beiträge: 70


Profil anzeigen
« Antworten #7 am: Juni 14, 2007, 20:12:39 »

so, vielen Dank! ich hoffe es funktioniert jetzt. da ich weder einen Brenner habe zur zeit noch die hardware(platine ist schwer in arbeit) kann ichs zwar nicht testen aber ich denke mal es dürfte jetzt funktioniern. mein code sieht inzwischen übrigens so aus:

Code:
void PWM_starten()
{
PR2=149; //1.:Register PR2 Wert zuweisen
CCPR1L=0xFF; //2.:
CCPR2L=0xFF;
CCP2CONbits.DC2B0=0;
CCP2CONbits.DC2B1=0;
CCP1CONbits.DC1B0=0;
CCP1CONbits.DC1B1=0;
TRISCbits.TRISC2=0; //3.: CCP1 als Ausgang
TRISCbits.TRISC2=0; // CCP2 als Ausgang
T2CONbits.T2CKPS1=1; //4.: TMR2 Prescale setzen (1:16)
T2CONbits.T2CKPS0=0; // Wert egal
T2CONbits.TMR2ON=1; //Timer2 ON
CCP1CONbits.CCP1M2=1; //5.: CCP1 für PWM konfiguriert
CCP1CONbits.CCP1M3=1;
CCP2CONbits.CCP2M2=1; // CCP2 für PWM konfiguriert
CCP2CONbits.CCP2M3=1;
}

es dürfte soweit also alles stimmen, falls doch nicht meld ich mich nochmal Smiley

danke nochmal, mfg, Zachso
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.076 Sekunden mit 18 Zugriffen.
 
Top! Top!