Der kleine Mikrocontroller PIC12F509 stellt keinen analogen Ausgang, mit dem das Dimmen z.B. einer Leuchtdiode
möglich wäre, zur Verfügung. Es stehen ausschließlich digitale Ausgänge zur Verfügung. Glücklicherweise gibt es eine Methode,
die es ermöglicht, aus digitalen Impulsen ein analoges Signal zu bilden. Die Methode heißt PWM (Pulsweitenmodulation).
Das Geheimnis des Verfahrens sind rechteckige Impulse, die bei konstanter Frequenz generiert werden. Die Längen der Impulse
und der Pausen variieren und bestimmen so den Wert der Effektivspannung, die auf diese Weise am digitalen Ausgang gebildet wird.
Bei der Methode sind zwei Größen besonders wichtig: Periode und Pulsweite.
In dem Experiment konstruieren wir selbst ein PWM-Signal, mit dem vier Leuchtdioden gesteuert werden. Damit das
permanente Ein- und Ausschalten der Leuchtdioden mit menschlichem Auge nicht wahrnehmbar wird, muss der Vorgang sehr schnell
stattfinden. Als Basis für die Berechnungen legen wir eine Grundfrequenz von 200 Hz. fest.
Bei der Frequenz beträgt die Periodendauer 0,5 ms. Wenn wir innerhalb der Zeit das gebildete Signal in 10 Stufen regeln
möchten, ergibt sich für jede Stufe eine Wartezeit von 50 µs.
Wenn wir die Spannung am Ausgang halbieren möchten, müssen wir demnach innerhalb einer Periode den Ausgang für 5 x 50 µs = 0,25 ms.
einschalten und ebenfalls für 0.25 ms. ausschalten.
Die Tatsache, dass das Hauptprogramm, um abgearbeitet zu werden, ebenfalls etwas Zeit benötigt, wird bei diesem Versuch
nicht berücksichtigt.
PIC12F509
Der Mikrocontroller PIC12F509 verfügt, ähnlich wie PIC10F200, über acht Anschlüsse. Allerdings sind bei ihm,
anders als bei seinem Freund, alle Pins mit einer Funktion belegt. Bei dem PIC10F200 bleiben zwei Pins nicht angeschlossen.
Um das mühevoll erstellte Programm in den PIC-Mikrocontroller zu bekommen, wird eine zusätzliche Einrichtung benötigt.
Es handelt sich hier um einen Programmer. Das Gerät stellt eine Schnittstelle zwischen dem PC, wo das Programm erstellt wurde,
und dem Mikrocontroller dar. Er wird via USB Kabel mit dem PC verbunden. Bei der Übertragung des Programms in den PIC muss der
Mikrocontroller mit Spannung versorgt werden. Eine Alternative ist eine externe Spannungsversorgung. Bei Bedarf kann der Programmer
via Software so eingestellt werden, dass er während der Programm-Übertragung die Spannungsversorgung des Mikrocontrollers
übernimmt.
Der aktuellste Programmer ist zurzeit der MPLAB PicKit4. Das Gerät wird von dem Hersteller Microchip angeboten.
Pinbelegung
Der Anschluss des Mikrocontrollers an den Programmer kann mithilfe einer speziellen Erweiterungsplatine realisiert
werden. Hier kann man zwischen dem Original der Firma Microchip oder Produkten fremden Herstellern wählen.
Alternativ kann man eine solche Verbindung problemlos selbst herstellen. Bei Nutzung eines Steckbrettes werden hierzu lediglich
fünf Kabelbrücken benötigt.
Der MPLAB PicKit4 Programmer verfügt über eine Anschlussbuchse mit acht Anschlussmöglichkeiten. Sein Vorgänger PicKit3 verfügt
über eine 6-Pin-Anschlussbuchse.
Selbsthergestellter Mikrocontroller-Anschluss (PIC12F509) an MPLAB PicKit4.
Der Schaltplan
Der Schaltplan
Das Programm
// ***************************************************************************
// LED-Dimmer mit PIC12F509
// MPLAB X IDE v6.00
// XC8-Compiler 2.4
// ***************************************************************************
#pragma config OSC = IntRC // Internal RC oscillator
#pragma config WDT = OFF // Watchdog Timer Enable bit (disabled)
#pragma config CP = OFF // Code Protection bit
#pragma config MCLRE = OFF // GP3/MCLR Pin Function Select bit
#include <xc.h>
#include <stdbool.h>
#define _XTAL_FREQ 4000000 // Taktfrequenz
#define Ausgang_LED_gelb GPIObits.GP0 // Ausgänge für die LEDs
#define Ausgang_LED_rot GPIObits.GP1
#define Ausgang_LED_blau GPIObits.GP5
#define Ausgang_LED_gruen GPIObits.GP4
#define Taster_PLUS GPIObits.GP2 // Taster-Eingänge
#define Taster_MINUS GPIObits.GP3
int ON, OFF; // Basisfaktor für LEDs EIN/AUS
bool AUTO; // Variable für automatischen Ablauf
void main(void) {
TRIS = 0b00001100; // GPIO 0,1,4 als Ausgänge
while (true) { // Endlos Schleife
if (Taster_PLUS == false) { // Taster heller betätigt?
if (Taster_MINUS == true) {
ON++; // ON inkrementieren
if (ON > 10) ON = 10; // Obere Grenze = 10
AUTO = false; // kein Automatischer Ablauf
}
}
if (Taster_MINUS == false) { // Taster dunkler betätigt?
if (Taster_PLUS == true) {
ON--; // ON dekrementieren
if (ON < 0) ON = 0; // Untere Grenze = 1
AUTO = false; // kein Automatischer Ablauf
}
}
if (Taster_PLUS == false) { // Beide Taster betätigt?
if (Taster_MINUS == false) {
AUTO = true; // Automatischer Ablauf aktiviert
}
}
if (AUTO) { // Automatischer Ablauf
ON++; // ON inkrementieren
if (ON > 10) ON = 1; // Bei 10 Rücksprung auf 1
}
OFF = 10 - ON; // Basisfaktor für AUS
for (int i = 0; i < 30; i++) { // Verzögerungsschleife
Ausgang_LED_gelb = true; // Alle LEDs Ein
Ausgang_LED_rot = true;
Ausgang_LED_blau = true;
Ausgang_LED_gruen = true;
for (int j = 0; j < ON; j++) { // Dauer für Ein (Basis ON * 500µs)
__delay_us(500); // Warte 500 µs
}
Ausgang_LED_gelb = false; // Alle LEDs aus
Ausgang_LED_rot = false;
Ausgang_LED_blau = false;
Ausgang_LED_gruen = false;
for (int j = 0; j < OFF; j++) { // Dauer für Aus (Basis OFF * 500µs)
__delay_us(500); // Warte 500 µs
}
}
}
}