myavr.CHKRonline.de

Informationen und Projekte Rund um die Mikrocontroller-Programmierung
von myAVR (ATmega8), STM32 (Cortex-M3/4) und Raspberry Pi (ARM11)

Der Autor

Christian KrügerChristian Krüger, ursprünglich aus dem Altenburger Land stammend, wohnt heute in Nürnberg. Nach seinem Studium der Informations­technik an der West­sächsischen Hochschule in Zwickau, ist er heute Software Entwickler für ein­gebettete Systeme. Seine Berufung fand er im Dienst für seine Kollegen als Teamleiter bei ISCUE.

Die größte Leidenschaft Christians ist es, die Schönheit unserer Welt einzufangen und weiter­zuerzählen. Dies gelingt ihm mit Hilfe seiner Kamera. Seine Fotos und Videos sind auf Instagram und seiner Webseite zu betrachten.

Für seine Zukunft freut sich Christian auf erinnerungs­würdige Reisen, begeisterungs­fähige Menschen und viele neue Erfahrungen.

CHKRonline.de

Facebook Profil

Twitter Profil

XING Profil

Meine myAVR Treiber

ADC Treiber

Ein Analog-Digital-Wandler (eng. Analog-Digital-Converter, ADC) dient der Aufnahme analoger Signale. Dabei wird der analoge Verlauf zu bestimmten Zeitpunkten abgetastet. Der entstehende Wert entspricht einem Vergleichswert zwischen der analogen Spannung und einer Referenzspannung. Je nach Auflösung des ADC entsteht ein mehr oder minder exakter Vergleichswert. Über das Verhältnis zu der Referenzspannung lässt sich die Spannung des Eingangs-Signals ermitteln.

ADC Formel

Eine Analog-Digital-Wandlung eignet sich für eine breite Masse an Anwendungen. Im einfachsten Fall lässt sie sich für das Messen einer stetigen Spannung verwenden. Es können aber auch zeitliche Signalverläufe gemessen und ausgewertet werden. So steht am Beginn einer jeden digitalen Signalverarbeitung die Signal-Aufnahme mittels ADC. Das betrifft eine Tonaufnahme ebenso, wie ein digitales Speicheroszilloskop. Der wesentliche Unterschied besteht nur in Abtastrate und -genauigkeit. Während ein digitales Speicheroszilloskops eine sehr hohe Abtastrate jenseits von 1 GHz benötigt, um schnelle Signalverläufe darstellen zu können, reicht selbst einer hochqualitativen Audioaufnahme eine Abtastrate zwischen 48 und 192 kHz. Dagegen arbeiten die meisten Oszilloskope lediglich mit geringen Auflösungen, üblicherweise 8 Bit, während Audio mit 24 Bit abgetastet wird. Die meisten Mikrokontroller bringen mindestens einen ADC mit, der üblicherweise 8 bis 12 Bit Auflösung hat. Die Abtastgeschwindigkeit hängt von der Prozessor-Geschwindigkeit ab.

ADC Graph

Die ATmega8- und ATmega328P-Modelle enthalten je einen 10-Bit-ADC mit, der bis 200 kHz betrieben werden sollte. Als Ergebnis liefert er einen digitalen Wert zwischen 0 und 1024, der in der Regel eine Spannung zwischen 0 und 5V repräsentiert. Der ADC bietet dank eines Multiplexers die Möglichkeit, bis zu 7 verschiedene Kanäle nacheinander zu verarbeiten. Gestartet wird er durch das Anwendungsprogramm, weitere Starts lassen sich jedoch auch durch Trigger festlegen, so dass der ADC zum Beispiel permanent neue Werte aufnimmt. Zusätzlich bietet der ADC einen "Conversion Complete"-Interrupt.

Umsetzung

Der ADC Treiber stelle eine Reihe von Funktionen zur Verfügung, um den ADC eines ATmega8 oder eines ATmeda328P konfigurieren und nutzen zu können. Der Treiber unterstützt dabei sämtliche vorgesehene Funktionen, wie z.B. den FreeRunning-Modus oder Interrupt-Betrieb. Die meisten Einstellungen werden durch Enumerationen verständlich dargelegt.

Zu beachten ist, dass der Analog-Digital-Wander maximal mit 200 kHz betrieben werden sollte. Ein entsprechend großer Vorteiler muss also bei der Initialierung eingestellt werden. Die erste Konvertierung dauert 27 ADC-Takte, jede weitere 13. Genauere Informationen sind dem Datenblatt (ATmega8/ATmega328P) zu entnehmen.

Lizenz

Dieses Programm ist freie Software. Du kannst es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder (nach deiner Option) jeder späteren Version.

Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, dass es dir von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details findest du in der GNU General Public License.

Die Lizenzvereinbarung stehen folgend zur Verfügung: GPL 3.0 Lizenz

Die zur Kompilierung nötigen und damit in die Hex-Datei eingeflossenen Bibliotheken umfassen Teile der AVR Libc. Diese steht unter einer modifizierten Version der BSD Lizenz zur Verfügung. Genaue Informationen zu den einzelnen Lizenzen sind den eingeflossenen Bibliotheken zu entnehmen und lassen sich hier nachlesen: AVR Libc Lizenz

Kompilierung

Der Treiber liegt in Form einer statischen Bibliothek vor. Diese kann einfach zusammen mit einem ausführbaren Programm gelinkt werden. Dazu sind der Header der Bibliothek als auch die Bibliothek selbst notwendig. Neben der Bibliothek liegt ein Testprogramm vor, welches verschiedene ADC-Daten sammelt und auf dem myAVR LCD ausgibt.

Die Bibliothek wurde mit Hilfe von AVR-Eclipse entwickelt. Sie sollte sich in einem Hauptprogramm mit Hilfe des myAVR Workpad SE bzw. Plus oder AVR-Ecplise jederzeit kompilieren und auf ein myAVR Board MK2 USB transferieren lassen. Bei der Nutzung des myAVR Workpad ist dazu die Angabe der Bibliothek in den Datei-Kommentaren notwendig:

// LinkerOption   : -v -L"PATH_TO_ADC_LIBRARY" -lADCDriver

Unter Eclipse ist die Definition des Symbols __ECLIPSE__ für eine korrekte Kompilierung notwendig, außerdem müssen die Pfäde zu der Bibliothek in den Projekt-Eigenschaften hinterlegt werden. Siehe dazu auch das AVR-Eclipse Tutorial Seite 3.

Die Kompilierung der Bibliothek selbst ohne Hauptprogramm ist lediglich mit AVR-Eclipse vorgesehen. Das myAVR Workpad bietet keine mir bekannte Möglichkeit, eine Bibliothek zu kompilieren.

Beispiel Hauptprogramm:

#define F_CPU 3686400
#include "ADCDriver.h"
#include "myAVRLCDDriver.h"

uint8_t String[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
uint8_t i = 0;

adc_init();
adc_setMode(CLKdiv32, RightAligned, None);
adc_selectChannel(ADC0);
adc_selectReference(AVCC);

lcd_init();
lcd_configCursor(OFF);
lcd_printLine("ADC0-Messwert", Line1);

while(1)
{
    adc_startConversion();
    while(adc_checkComplete() != true)
    {
    };

    utoa(adc_getValue(), String, 10);
    for(i=0; i<15; i++)
    {
        if(String[i] == 0) String[i]= ' ';
    }
    lcd_printLine(String, Line2);

    _delay_ms(10);
}

Bei Fragen oder Anregungen stehe ich gerne zur Verfügung: chkr1989@chkronline.de

Changelog

Version 1.2

Version 1.1

Version 1.0

Bibliothek ATmega8 @ 3,6864 MHz

Bibliothek ATmega238P @ 16.0 MHz

Testprogramm ATmega8 @ 3,6864 MHz

Testprogramm ATmega238P @ 16.0 MHz

Lizenzinformationen