Wie wähle ich aus, welche Werte in das CCPR1L-Register geladen werden sollen (zur Erzeugung eines PWM-Signals mit PIC)?

Ich muss ein PWM-Signal mit dem Mikrocontroller PIC18F2550 bei fast 20 kHz erzeugen. Ich habe das Datenblatt gelesen, fand es zu komplex und verwirrend, dann habe ich angefangen, im Netz nach einem Beispielcode zu suchen, um endlich dieses PWM-Tool zu sehen .

Ich habe es mit Parametern verwendet F Ö S C =20 MHz und F P W M = 20 kHz, um diese beiden unterschiedlichen Codes für entsprechende zwei unterschiedliche Arbeitszyklusprozentsätze zu erzeugen.

// Duty cycle = 0%
PR2 = 0b11111001 ;
T2CON = 0b00000100 ;
CCPR1L = 0b00000000 ;
CCP1CON = 0b00001100 ;

// Duty cycle = 100%
PR2 = 0b11111001 ;
T2CON = 0b00000100 ;
CCPR1L = 0b11111001 ;
CCP1CON = 0b00111100 ;

Das Datenblatt sagt mir, dass das 4. und 5. Bit des CCP1CON-Registers die LSBs des Werts "PWM-Tastverhältnis mit" sind und seine MSBs im CCPR1L-Register gespeichert sind, nicht wahr?

Das bedeutet, dass für ein Tastverhältnis von 0 % das 10-Bit-PWM-Tastverhältnis so ist:

00000000 + 00 = 0x000

Und für 100 % Einschaltdauer,

11111001 + 11 = 0x3E7

Also muss ich laut diesem Tool die Werte zwischen 0x000 und 0x3E7 auf die relevanten PWM-Register setzen, um Arbeitszyklusverhältnisse zwischen 0% und 100% zu haben. An diesem Punkt bin ich verwirrt und folgende Fragen stellen sich mir:

  • Was ist dieser 0x3E7- Wert? Wie wird es berechnet? Wie würde ich es selbst finden, wenn ich kein solches Online-Tool gehabt hätte?
  • Wie hoch ist die Auflösung dieses PWM-Signals (dh wie groß ist der Zeitunterschied der Länge von zwei Arbeitszyklen für zwei aufeinanderfolgende Werte wie 0x3E6 und 0x3E7)?
  • Warum kann ich keine höheren Werte wie alle Einsen (0xFF) in das CCPR1L-Register laden? das würde 0x3FF für den Gesamtwert der PWM-Tastverhältnislänge ergeben. Was passiert, wenn ich das tue?
  • Das Tool sagt, dass ich die PWM-Funktion nur mit 9-Bit-Auflösung mit den von mir angegebenen Arbeitsparametern verwenden kann. Warum also ist die Zahl 0x3E7 eine 10-Bit-Zahl? Ist der "9-Bit"-Wert von Integer abgeschnitten l Ö G 2 ( 0 X 3 E 7 ) ?

Dies war eine lange Frage, aber es würde mir sehr helfen, wenn mir jemand freundlicherweise die allgemeinen Schritte und die Logik der PWM-Signalerzeugung mit PIC-Mikrocontrollern erklärt.

Danke.

Antworten (2)

Ich weiß, es ist ein bisschen spät, aber ich habe gerade diese sabischen Zweifel. Nachdem ich mich umgesehen habe, bin ich auf dieses Microchip-Dokument gestoßen , das einige Beispiele zeigt.

Zuerst berechnen wir PR2 . Aus dieser Formel

F PWM = 1 ( PR2 + 1 ) × 4 × T OSZ × T2CKPS

wir bekommen

PR2 = 1 F PWM × 4 × T OSZ × T2CKPS 1

Wo T OSZ = 1 / F OSZ , Und T2CKPS ist der Timer2-Prescaler-Wert (1, 4 oder 16).

Also, wenn wir wollen F PWM = 20 kHz , und wählen T2CKPS = 1 , wir bekommen PR2 = 249 . Wir sollten höhere Werte für wählen T2CKPS nur wenn PR2 überschreitet 8 Bit ( PR2 > 255 ) für die gegebene Vorskalierung.

Jetzt berechnen wir die maximale PWM-Auflösung für die gegebene Frequenz:

maximale PWM-Auflösung = Protokoll 2 ( F OSZ F PWM )

Das gibt uns 9,9658 Bits (ich weiß, es klingt komisch, aber wir werden es später so verwenden).

Lassen Sie uns nun das PWM-Tastverhältnis berechnen. Sie wird durch den 10-Bit-Wert angegeben CCPRxL:DCxB1:DCxB0 , das ist, CCPRxL Bits als wichtigster Teil, und DCxB1 Und DCxB0 (Bits 5 und 4 von CCPxCON ) die niederwertigsten Bits. Nennen wir diesen Wert DCxB9:DCxB0 , oder einfach DCx . (x ist die CCP-Nummer)

Da wir in unserem Fall eine maximale PWM-Auflösung von haben 9,9658 Bits, das PWM-Tastverhältnis (d. h. der Wert von DCx ) muss ein Wert zwischen sein 0 Und 2 9,9658 1 = 999 . Wenn wir also einen Arbeitszyklus von 50 % wollen, DCx = 0,5 × 999 = 499,5 500 .

Die auf dem Datenblatt angegebene Formel (auch auf dem verlinkten Dokument),

Auslastungsgrad = DCx × T OSZ × T2CKPS

gibt uns die Impulsdauer in Sekunden. In unserem Fall ist es gleich 25 ns . Seit T PWM = 50 ns , ist es offensichtlich, dass wir eine Einschaltdauer von 50 % haben.

Das heißt, DCx in Bezug auf das Tastverhältnis als zu berechnen R [ 0 , 1 ] , wir machen:

DCx = R × T PWM T OSZ × T2CKPS = R × F OSZ F PWM × T2CKPS


Beantwortung Ihrer anderen Fragen:

2) Die Auflösung Ihres PWM-Impulses mit Periode T PWM Ist

T PWM 2 max. PWM-Aufl

3) Weil CCPRxL zusammen mit DCxB1 und DCxB0 die Pulsdauer bestimmen. Einstellen von CCPRxL auf einen höheren Wert als 2 max. PWM-Aufl 1 bedeutet eine Impulsdauer, die höher als die PWM-Periode ist, und daher erhalten Sie eine Wohnung v D D Signal.

Bei Verwendung eines 1:1-Vorskalars auf TMR2 repräsentiert der CCPR1L-Wert die ganze Anzahl von CPU-Zyklen der "Einschaltzeit" für jeden PWM-Zyklus. Bei einem 4:1-Preskalar stellt es die Anzahl der Vier-Zyklen-Zählungsinkremente usw. dar.

Bit 0 des CCP1CON-Registers verzögert jeden Abschaltzyklus um 1/4 eines Zählinkrements; Bit 1 verzögert es um 1/2. Die Effekte sind kumulativ. Beachten Sie, dass diese Bits bei älteren PICs keine Wirkung haben, wenn CCPR1L null ist; Wenn sich der Ausgang nie einschaltet, hat das Verzögern des Ausschaltens keine Wirkung.

Der Wert in PR2 legt das Intervall zwischen dem Beginn eines PWM-Zyklus und dem Beginn des nächsten fest. Setzt man PR2 auf einen Wert von 99 und wählt einen 1:1-Vorskalar, dann startet alle 100 Taktzyklen ein PWM-Zyklus (einer größer als der programmierte Wert). Wenn man CCPR1L auf 12 setzt und die beiden unteren Bits von CCP1CON auf '1', '0' setzt, dann ist der PWM-Ausgang alle 100 CPU-Zyklen für zwölf volle CPU-Zyklen plus einen zusätzlichen halben Zyklus für einen Nettoarbeitszyklus hoch von 1/8.

Was bedeutet Auflösung bei PWM? und wie ändert es sich als Wert des PR2Registerwerts?