- Was ist ein PWM-Signal?
- PWM mit PIC16F877A:
- Programmierung des PIC zur Erzeugung von PWM-Signalen:
- Schema und Test:
- Arbeiten an Hardware:
Dies ist unser 10. Tutorial zum Erlernen von PIC-Mikrocontrollern mit MPLAB und XC8. Bis jetzt haben wir viele grundlegende Tutorials behandelt, wie z. B. LED-Blinken mit PIC, Timer in PIC, LCD-Schnittstelle, 7-Segment-Schnittstelle, ADC mit PIC usw. Wenn Sie ein absoluter Anfänger sind, besuchen Sie bitte die vollständige Liste der PIC-Tutorials hier und Fang an zu lernen.
In diesem Tutorial erfahren Sie, wie Sie PWM-Signale mit PIC PIC16F877A erzeugen. Unsere PIC-MCU verfügt über ein spezielles Modul namens Compare Capture Module (CCP), mit dem PWM-Signale erzeugt werden können. Hier erzeugen wir eine PWM von 5 kHz mit einem variablen Arbeitszyklus von 0% bis 100%. Um den Arbeitszyklus zu variieren, verwenden wir ein Potentiometer. Daher wird empfohlen, das ADC-Tutorial zu lernen, bevor Sie mit PWM beginnen. Das PWM-Modul verwendet auch Timer, um seine Frequenz einzustellen. Daher lernen Sie hier vorher, wie Timer verwendet werden. Außerdem werden wir in diesem Tutorial eine RC-Schaltung und eine LED verwenden, um die PWM-Werte in analoge Spannung umzuwandeln und zum Dimmen des LED-Lichts zu verwenden.
Was ist ein PWM-Signal?
Die Pulsweitenmodulation (PWM) ist ein digitales Signal, das am häufigsten in Steuerschaltungen verwendet wird. Dieses Signal wird in einer vordefinierten Zeit und Geschwindigkeit auf hoch (5 V) und niedrig (0 V) gesetzt. Die Zeit, während der das Signal hoch bleibt, wird als "Einschaltzeit" bezeichnet, und die Zeit, während der das Signal niedrig bleibt, wird als "Ausschaltzeit" bezeichnet. Es gibt zwei wichtige Parameter für eine PWM, wie unten erläutert:
Arbeitszyklus der PWM:
Der Prozentsatz der Zeit, in der das PWM-Signal HIGH (Einschaltzeit) bleibt, wird als Arbeitszyklus bezeichnet. Wenn das Signal immer eingeschaltet ist, befindet es sich in einem Tastverhältnis von 100% und wenn es immer ausgeschaltet ist, ist es ein Tastverhältnis von 0%.
Arbeitszyklus = Einschaltzeit / (Einschaltzeit + Ausschaltzeit)
Frequenz einer PWM:
Die Frequenz eines PWM-Signals bestimmt, wie schnell eine PWM eine Periode abschließt. Eine Periode ist für das Ein- und Ausschalten eines PWM-Signals abgeschlossen, wie in der obigen Abbildung gezeigt. In unserem Tutorial stellen wir eine Frequenz von 5 kHz ein.
PWM mit PIC16F877A:
PWM-Signale können in unserem PIC-Mikrocontroller mithilfe des CCP- Moduls (Compare Capture PWM) generiert werden. Die Auflösung unseres PWM-Signals beträgt 10 Bit, dh für einen Wert von 0 ergibt sich ein Tastverhältnis von 0% und für einen Wert von 1024 (2 ^ 10) ein Tastverhältnis von 100%. In unserer PIC-MCU befinden sich zwei CCP-Module (CCP1 und CCP2). Dies bedeutet, dass wir zwei PWM-Signale an zwei verschiedenen Pins (Pin 17 und 16) gleichzeitig erzeugen können. In unserem Tutorial verwenden wir CCP1, um PWM-Signale an Pin 17 zu erzeugen.
Die folgenden Register werden verwendet, um PWM-Signale mit unserer PIC-MCU zu erzeugen:
- CCP1CON (CCP1-Kontrollregister)
- T2CON (Timer 2 Control Register)
- PR2 (Timer 2 Module Periodenregister)
- CCPR1L (CCP Register 1 Low)
Programmierung des PIC zur Erzeugung von PWM-Signalen:
In unserem Programm lesen wir eine analoge Spannung von 0-5 V von einem Potentiometer und ordnen sie mit unserem ADC-Modul 0-1024 zu. Dann erzeugen wir ein PWM-Signal mit einer Frequenz von 5000 Hz und variieren seinen Arbeitszyklus basierend auf der analogen Eingangsspannung. Das heißt 0-1024 wird in 0% -100% Arbeitszyklus umgewandelt. In diesem Lernprogramm wird davon ausgegangen, dass Sie bereits gelernt haben, ADC in PIC zu verwenden. Wenn nicht, lesen Sie es hier, da wir in diesem Lernprogramm Details dazu überspringen werden.
Sobald die Konfigurationsbits gesetzt sind und das Programm zum Lesen eines Analogwerts geschrieben wurde, können wir mit PWM fortfahren.
Die folgenden Schritte sollten ausgeführt werden, wenn das CCP-Modul für den PWM-Betrieb konfiguriert wird:
- Stellen Sie die PWM-Periode ein, indem Sie in das PR2-Register schreiben.
- Stellen Sie den PWM-Arbeitszyklus ein, indem Sie in das CCPR1L-Register und die CCP1CON <5: 4> -Bits schreiben.
- Machen Sie den CCP1-Pin zu einem Ausgang, indem Sie das TRISC <2> -Bit löschen.
- Stellen Sie den TMR2-Vorskalierungswert ein und aktivieren Sie Timer2, indem Sie in T2CON schreiben.
- Konfigurieren Sie das CCP1-Modul für den PWM-Betrieb.
Dieses Programm enthält zwei wichtige Funktionen zum Erzeugen von PWM-Signalen. Eine ist die PWM_Initialize () -Funktion, die die zum Einrichten des PWM-Moduls erforderlichen Register initialisiert und dann die Frequenz festlegt, mit der die PWM arbeiten soll. Die andere Funktion ist die PWM_Duty () -Funktion, mit der das Tastverhältnis des PWM-Signals eingestellt wird die erforderlichen Register.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Festlegen der PR2-Formeln mithilfe des Datenblatts // Lässt die PWM in 5 kHz arbeiten CCP1M3 = 1; CCP1M2 = 1; // Konfiguriere das CCP1-Modul T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Timer-Modul konfigurieren TRISC2 = 0; // Port Pin auf C als Ausgang machen}
Die obige Funktion ist die PWM-Initialisierungsfunktion. In dieser Funktion wird das CCP1-Modul so eingestellt, dass PWM verwendet wird, indem die Bits CCP1M3 und CCP1M2 als hoch gesetzt werden.
Der Prescaler des Timer-Moduls wird gesetzt, indem das Bit T2CKPS0 so hoch und T2CKPS1 so niedrig wie das Bit TMR2ON gesetzt wird, um den Timer zu starten.
Jetzt müssen wir die Frequenz des PWM-Signals einstellen. Der Wert der Frequenz muss in das PR2-Register geschrieben werden. Die gewünschte Frequenz kann unter Verwendung der folgenden Formeln eingestellt werden
PWM-Periode = * 4 * TOSC * (TMR2 Prescale Value)
Wenn Sie diese Formeln neu anordnen, um PR2 zu erhalten, erhalten Sie
PR2 = (Periode / (4 * Tosc * TMR2 Prescale)) - 1
Wir wissen, dass Periode = (1 / PWM_freq) und Tosc = (1 / _XTAL_FREQ). Deshalb…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Sobald die Frequenz eingestellt ist, muss diese Funktion nicht erneut aufgerufen werden, es sei denn und bis wir die Frequenz erneut ändern müssen. In unserem Tutorial habe ich PWM_freq = 5000 zugewiesen ; Damit können wir eine Betriebsfrequenz von 5 kHz für unser PWM-Signal erhalten.
Lassen Sie uns nun den Arbeitszyklus der PWM mithilfe der folgenden Funktion einstellen
PWM_Duty (vorzeichenlose int-Pflicht) {if (Pflicht <1023) {Pflicht = ((Float-) Pflicht / 1023) * (_ XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Beim Reduzieren von // Duty = (((Float) Duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = Pflicht & 1; // Speichern Sie das 1. Bit CCP1Y = Pflicht & 2; // Speichern Sie das 0. Bit CCPR1L = Pflicht >> 2; // Speichern Sie das verbleibende 8 Bit}}
Unser PWM-Signal hat eine Auflösung von 10 Bit, daher kann dieser Wert nicht in einem einzigen Register gespeichert werden, da unser PIC nur 8-Bit-Datenleitungen hat. Wir haben also zwei andere Bits von CCP1CON <5: 4> (CCP1X und CCP1Y) verwendet, um die letzten beiden LSB zu speichern und dann die verbleibenden 8 Bits im CCPR1L-Register zu speichern.
Die PWM-Arbeitszykluszeit kann unter Verwendung der folgenden Formeln berechnet werden:
PWM-Arbeitszyklus = (CCPRIL: CCP1CON <5: 4>) * Tosc * (TMR2 Prescale Value)
Wenn Sie diese Formeln neu anordnen, um den Wert von CCPR1L und CCP1CON zu erhalten, erhalten Sie:
CCPRIL: CCP1Con <5: 4> = PWM-Arbeitszyklus / (Tosc * TMR2 Prescale Value)
Der Wert unseres ADC ist 0-1024. Wir müssen ihn auf 0% -100% setzen, daher PWM Duty Cycle = Duty / 1023. Um diesen Arbeitszyklus weiter in einen Zeitraum umzuwandeln, müssen wir ihn mit dem Zeitraum (1 / PWM_freq) multiplizieren.
Wir wissen auch, dass Tosc = (1 / PWM_freq), also..
Duty = (((Float) Duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Das Auflösen der obigen Gleichung ergibt:
Duty = ((Float) Duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Sie können das vollständige Programm im Abschnitt Code unten zusammen mit dem detaillierten Video überprüfen.
Schema und Test:
Lassen Sie uns wie gewohnt die Ausgabe mithilfe der Proteus-Simulation überprüfen. Das Schaltbild ist unten dargestellt.
Schließen Sie ein Potentiometer bis 7 th Stift Futter in einer Spannung von 0-5. Das CCP1-Modul ist mit Pin 17 (RC2) ausgestattet. Hier wird die PWM generiert, die mit dem Digitaloszilloskop überprüft werden kann. Um dies in eine variable Spannung umzuwandeln, haben wir einen RC-Filter und eine LED verwendet, um die Ausgabe ohne Oszilloskop zu überprüfen.
Was ist ein RC-Filter?
Ein RC-Filter oder ein Tiefpassfilter ist eine einfache Schaltung mit zwei passiven Elementen, nämlich dem Widerstand und dem Kondensator. Diese beiden Komponenten werden verwendet, um die Frequenz unseres PWM-Signals zu filtern und es zu einer variablen Gleichspannung zu machen.
Wenn wir die Schaltung untersuchen, beginnt der Kondensator C zu laden, wenn eine variable Spannung an den Eingang von R angelegt wird. Basierend auf dem Wert des Kondensators dauert es einige Zeit, bis der Kondensator vollständig aufgeladen ist. Sobald er aufgeladen ist, blockiert er den Gleichstrom (Denken Sie daran, dass Kondensatoren Gleichstrom blockieren, aber Wechselstrom zulassen), sodass die Eingangsgleichspannung am Ausgang angezeigt wird. Das Hochfrequenz-PWM (AC-Signal) wird über den Kondensator geerdet. Somit wird über den Kondensator ein reiner Gleichstrom erhalten. Ein Wert von 1000 Ohm und 1uf wurde für dieses Projekt als angemessen befunden. Die Berechnung der Werte von R und C umfasst eine Schaltungsanalyse mithilfe der Übertragungsfunktion, die in diesem Lernprogramm nicht behandelt wird.
Die Ausgabe des Programms kann mit dem Digitaloszilloskop wie unten gezeigt überprüft werden. Variieren Sie das Potentiometer und der Arbeitszyklus der PWM sollte sich ändern. Wir können auch die Ausgangsspannung der RC-Schaltung mit dem Voltmeter feststellen. Wenn alles wie erwartet funktioniert, können wir mit unserer Hardware fortfahren. Überprüfen Sie das Video am Ende auf den vollständigen Vorgang.
Arbeiten an Hardware:
Das Hardware-Setup des Projekts ist sehr einfach. Wir werden nur unser unten gezeigtes PIC Perf-Board wiederverwenden.
Wir benötigen auch ein Potentiometer, um die analoge Spannung einzuspeisen. Ich habe einige weibliche Enddrähte an meinen Topf angeschlossen (siehe unten), damit wir sie direkt an die PIC Perf-Karte anschließen können.
Um den Ausgang zu überprüfen, benötigen wir eine RC-Schaltung und eine LED, um zu sehen, wie das PWM-Signal funktioniert. Ich habe einfach eine kleine Perf-Platine verwendet und die RC-Schaltung und die LED (zur Steuerung der Helligkeit) darauf gelötet, wie unten gezeigt
Wir können einfache Verbindungsdrähte von Buchse zu Buchse verwenden und sie gemäß den oben gezeigten Schemata verbinden. Sobald die Verbindung hergestellt ist, laden Sie das Programm mit unserem pickit3 auf den PIC hoch und Sie sollten in der Lage sein, eine variable Spannung basierend auf dem Eingang Ihres Potentiometers zu erhalten. Der variable Ausgang dient hier zur Steuerung der Helligkeit der LED.
Ich habe mein Multimeter verwendet, um die variablen Ausgänge zu messen. Wir können auch feststellen, dass sich die Helligkeit der LED für verschiedene Spannungspegel ändert.
Wir haben programmiert, die analoge Spannung vom POT zu lesen und in PWM-Signale umzuwandeln, die wiederum mithilfe eines RC-Filters in eine variable Spannung umgewandelt wurden. Das Ergebnis wird mithilfe unserer Hardware überprüft. Wenn Sie Zweifel haben oder irgendwo stecken bleiben, nutzen Sie bitte den Kommentarbereich unten. Wir helfen Ihnen gerne weiter. Die komplette Arbeit funktioniert im Video.
Lesen Sie auch unsere anderen PWM-Tutorials zu anderen Mikrocontrollern:
- Raspberry Pi PWM Tutorial
- PWM mit Arduino Due
- Arduino-basierter LED-Dimmer mit PWM
- Power LED Dimmer mit ATmega32 Microcontroller