Snippets

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Auf dieser Seite können kleine, oft verwendbare Quelltextchen und Designideen (Snippets) abgelegt und abgerufen werden.

Bitte die Snippets universell verwendbar halten und für Dritte ausführlich und verständlich kommentieren.

Software-Snippets

AVR: ADC

Die folgenden Routinen sind einfachste C-Funktionen zum Auslesen des AD-Wandlers eines AVR. Die Registernamen bitte an den konkret verwendeten AVR anpassen (Datenblatt).

Anm.: Umfangreichere Routinen mit Mittelwertbildung usw. finden sich im AVR-GCC-Tutorial: Analoge Ein- und Ausgabe.

Auslesen eines Analogports

 // Führt eine AD Konversion durch und
 // liefert den Wert (0-1023) von PORT ADC(src) zurück

 uint16_t ReadValue(uint8_t src)
 {
   ADMUX = src;
   ADCSR = _BV(ADEN)  | _BV(ADSC) | _BV(ADPS2);
   while (bit_is_set (ADCSR, ADSC))
     ;  
   return ADC;
 }

Anmerkungen:

  • ADMUX Parameter siehe Datenblatt (nicht gleich "Pinnummer")
  • ADSC/ADEN/ADPS2 Parameter siehe Datenblatt
  • Einstellung der Referenzspannung beachten (Intern/Extern)
  • Wandlerfrequenz an Genauigkeitsansprüche anpassen und nach Empfehlungen des Datenblatts in abh. vom "Haupttakt" einstellen
  • ADEN nach erstmaligem Einschalten redundant
  • evtl. Dummy Readout durchfuehren

Umrechnung Wandlungsergebnis in gemessene Spannung

// Liefert die am ADC anliegende Spannung in mV zurück
#define ADC_CONV_CONST 5000/1024 // Spannung pro LSB (10 bit Wandler)
#define ADC_CORR_VAL (ADC*8)/9   // bei 5V Ref-Spannung erhält man mit dieser korrektur 5001mV bei einem ADC-Wert von 1023!
                                 // Für eine fehlerfreie Umwandlung ist eine Referenz von z.b 4.096V oder 2.56V notwendig...
uint16_t ReadValue(uint8_t src) {
  ADMUX = src;
  ADCSR = _BV(ADEN)  | _BV(ADSC) | _BV(ADPS2);

  while (bit_is_set (ADCSR, ADSC))
    ;

  return ADC*ADC_CONV_CONST+ADC_CORR_VAL;
}

Hardware-Snippets

Wie schließe ich ein "LC-Display" an einen Mikrocontroller an?

Siehe AVR-GCC-Tutorial: Ansteuerung eines LCD und LCD.

Wie schließe ich einen MOSFET an einen Mikrocontroller an?

In folgenden sind keine konkreten Typen für die MOSFETs genannt. Typen findet man in der Mosfet-Übersicht und in den parametrischen Suchmaschinen der Hersteller. Die genauen Daten und Belastungsgrenzen sind dann aus den Datenblättern zu entnehmen und für die geplante Schaltung zu prüfen.

==> * FET

==> * Treiber

Direkte Methode: N-Kanal MOSFET (NFET)

                (VCC)
                  |
                (Last)
                  |
                  |
               (Drain )
(Port µC) -----(Gate  )
               (Source)
                  |
                  |
                (GND)

Ausschlaggebend für die Steuerung ist die Gate-Source-Spannung. In dieser einfachen Schaltung ist das also die Spannung am Port des µC minus die Spannung an Source (= GND = 0V). Diese Spannung ist positiv! Wenn diese einen Schwellwert überschreitet, dann sinkt der Drain-Source-Widerstand (RDSon)schlagartig auf ein Minimum. Übliche Werte liegen bei 0.1Ω, dieser Widerstand ist aber von dem Drain-Source-Strom und der Gate-Source-Spannung abhängig. Der Umschaltpunkt (Spannung und Widerstand) kann im Datenblatt in den "RDSon vs. VGS" Diagramm abgelesen werden.

Direkte Methode: P-Kanal MOSFETs (PFET)

                (VCC)
                  |
                  |
               (Source)
(Port µC) -----(Gate  )
               (Drain )
                  |
                  |
                (Last)
                  |
                (GND)

Ausschlaggebend für die Steuerung ist die Gate-Source-Spannung. In dieser einfachen Schaltung ist das also die Spannung am Port des µC minus die Spannung an Source (= VCC). Diese Spannung ist negativ! Wenn diese einen Schwellwert unterschreitet, dann sinkt der Drain-Source-Widerstand (RDSon)schlagartig auf ein Minimum. Übliche Werte liegen bei 0.1Ω, dieser Widerstand ist aber von dem Drain-Source-Strom und der Gate-Source-Spannung abhängig. Der Umschaltpunkt (Spannung und Widerstand) kann im Datenblatt in den "RDSon vs. VGS" Diagramm abgelesen werden.

Anmerkungen

Zu beachten ist, dass zwischen Gate und Source und zwischen Gate und Drain eine Kapazität existiert, welche bei jedem Umschalt-Vorgang umgeladen werden muss. Besonders bei höheren Frequenzen (> 100kHz) kann zur Strombegrenzung zwischen Gate und Port-Pin ein Widerstand notwendig sein. In diesen Fällen ist fast immer ein dedizierter MOSFET-Treiber die bessere Wahl.

Um abzuschätzen, ob ein Widerstand Sinn macht, multipliziert man die Total-Gate-Charge des FETs aus dem Datenblatt (in Coulomb = Ampere*Sekunde) mit der gewünschten Frequenz (in Hertz = 1/Sekunde) und erhält so den durchschnittlichen Strom, den der µC-Pin liefern/aufnehmen muss, und berechnet daraus den nötigen Widerstand.

Übliche Werte dafür sind 10 - 100Ω. Je höher der Widerstand ist, desto länger dauert das Umladen des Kondensators und desto langsamer schaltet der Transistor um. Daraus ergibt sich eine höhere Verlustleistung im Transistor, was unter Umständen zur Zerstörung des Transistors führen kann.

Ein Gate-Vorwiderstand kann auch aus anderen Gründen notwendig werden (Verbesserung der EMV durch flachere Flanken). Hier ist z.B. 12Ω ein häufig genutzter Wert.

TODO: Pinbelegung eines typischen MOSFETS

Indirekte Methode: Ansteuerungen mit Push-Pull-Transistoren

 12V------------------------o------o---------------o-------------
                            |      |               |
                            |      |               |
                           .-.     |               |
                           | |2k2  |               |
                           | |R2   |               |
                           '-'     |T2             |
                            |      |BC338          |
                            |    |/                |
                            o----|                 |
                            |    |>         P-FET  |
                            |      |    ___ IRF4905|
                            o---|<-o---|___|----||-+
  .---------.               |  1N4148  R3 10R   ||->
  |         |               |                   ||-+
  |         |    ___      |/                       |
  |         |---|___|-----|   T1                   o---------
  |         |   R1 2k2    |>  BC338                |         |
  |   µC    |               |                     .-.        |
  |         |               |                     | |        |
  |         |               |                     | | Last   - 1N5819
  |         |               |                     '-'        ^
  '---------'               |                      |         |
                            |                      |         |
 GND------------------------o----------------------o---------o---
(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)

Durch die beiden NPN Treibertransistoren T1 & T2 (http://www.mikrocontroller.net/part/BC338) wird das Gate des P-FET auf HIGH oder LOW gezogen. Wenn die Basis von T1 auf LOW ist dann wird die Basis von T2 auf HIGH gezogen. Der P-FET kann natürlich auch einfach gegen einen N-FET ausgetauscht werden, wenn man die Last zwischen +12V und Drain schaltet. Mit dieser Schaltung kann man einen FET mit 20kHz und mehr (laut Simulation sind auch 50kHz kein Problem) ansteuern. Der Strom, welcher in das Gate rein bzw. raus fliesst, kann man mit R3 begrenzt werden. Die geschaltete Betriebsspannung darf die zulässige Gate-Source Spannung (meist 20V) bei dieser Schaltung nicht überschreiten.

Im µC Bereich können desweiteren folgende Hinweise gegeben werden:

  • Es sollten sog. "Logik-Level" MOSFETS verwendet werden (Vth < 2V)
  • Die Schaltleistung des FETs muss beachtet werden (Ids, VBrss)
  • Beim Schalten von induktiven Lasten wie Relais, Motoren, oder auch Lasten über eine längere Zuleitung, sollten Freilaufdioden verwendet werden (im Schaltplan die Schottkydiode 1N5819 in Sperrrichtung über der Last.) Normale 1N400x Dioden sind zumindest im PWM-Betrieb zu langsam.