© prettyboy80/Shutterstock.com
Teil 3: Analoge Signale umwandeln und auswerten

Die Welt regeln und steuern


Es ist schön, eine LED mit einem Mikrocontroller blinken zu lassen. Es ist noch schöner und spannender, wenn die Frequenz dabei über ein Potenziometer geregelt werden kann. Und natürlich bietet ein Mikrocontroller dafür die passende Peripherie: einen A/D-Wandler.

Der PIC18F25K50-Mikrocontroller kann analoge Signale messen und in digitale Werte umwandeln, was sehr nützlich für uns ist. Mit diesem Feature beschäftigen wir uns in diesem Teil der Artikelserie zu PIC-Mikrocontrollern.

Dem Mikrocontroller werden eine Referenzmasse und eine Referenzspannung vorgegeben. In den meisten Fällen dient als Referenzmasse einfach die am Pin VSS angeschlossene Masse und als Referenzspannung einfach die Betriebsspannung VDD, die am Mikrocontroller anliegt. Man kann aber auch tatsächlich abweichende Referenzen an bestimmte Pins anlegen und den Mikrocontroller so konfigurieren, dass diese verwendet werden. Allerdings sind die erlaubten Abweichungen zu VDD und VSS dabei nicht allzu groß. In der Praxis arbeitet man deshalb – und auch, um weniger Pins des Mikrocontrollers zu belegen – in der Regel mit VSS als Referenzmasse VREF- und mit VDD als Referenzspannung VREF+.

Das zu messende Signal wird in Form einer Spannung an einen analogen Eingabepin des Mikrocontrollers gelegt; beim PIC18F25K50 ist das einer der Pins von Port A. Wir werden den Pin RA0 verwenden, der in seiner Verwendung als analoger Eingabepin auch als AN0 bezeichnet wird.

Um ein veränderliches Signal zu erzeugen, das gemessen werden kann, wird einfach ein Potenziometer angeschlossen. Falls Sie noch nie mit Potenziometern gearbeitet haben und sich darüber wundern, dass ein Potenziometer drei Anschlüsse hat, die meistens nicht beschriftet sind: Die beiden äußeren Anschlüsse sind in der Regel über eine Kohleschicht (Widerstand) miteinander verbunden. Wir verwenden hier ein Potenziometer mit 470 Ohm. Der Widerstand zwischen den beiden äußeren Anschlüssen beträgt deshalb in etwa eben diese 470 Ohm. Der mittlere Anschluss kann über eine Drehbewegung auf der Kohle bewegt werden. Der Widerstand, der zwischen diesem Anschluss und einem der äußeren Anschlüsse gemessen werden kann, hängt von der Stellung des Potenziometers ab und liegt zwischen 0 und 470 Ohm. Beim Anschluss ist einfach darauf zu achten, dass an die beiden äußeren Anschlüsse +5 V bzw. GND angelegt wird, wobei egal ist, welcher Anschluss GND und welcher +5 V erhält. Der mittlere Pin wird an den Pin RA0 (=AN0) des Mikrocontrollers angeschlossen. Dadurch kann mit dem Potenziometer die an RA0 anliegende Spannung zwischen 0 V und 5 V eingestellt werden.

Der A/D-Wandler (Analog-Digital-Wandler) des Mikrocontrollers zerlegt den Bereich zwischen VREF- und VREF+ in 1 024 verschiedene Werte zwischen 0x000 und 0x3FF und ermittelt, welchem dieser Werte die am zu messenden analogen Eingang anliegende Spannung entspricht. Das Ergebnis hat also eine Auflösung von 10 Bit.

Wie funktioniert eine Messung?

Der A/D-Wandler ist zur Messung vieler Werte kurz hintereinander ausgelegt. Dennoch benötigt jede einzelne Messung ein wenig Zeit. Damit ein veränderliches Eingabesignal den Messvorgang nicht verzerren kann, findet der Messvorgang indirekt statt.

Beim Start der Messung wird zunächst ein interner Kondensator im Mikrocontroller an die zu messende Spannung angelegt. Nach einiger Zeit wird der Kondensator dann vom Eingangssignal getrennt und die am Kondensator anliegende Spannung gemessen und in einen digitalen 10-Bit-Wert umgewandelt. Hierdurch wird das Signal gewissermaßen kurz eingefroren.

image

Abb. 1: Die Schaltung mit Potenziometer

Das Blinkprogramm

Listing 1 zeigt, wie man die Frequenz der an RC0 angeschlossenen LED über ein an RA0 angeschlossenes Potenziometer in Assembler regeln kann. Listing 2 zeigt dasselbe in C. Die Ähnlichkeit der Programme fällt ins Auge, verwundert aber auch nicht, da beide Programme dieselben Einstellungen an denselben Registern des Controllers vornehmen müssen und sonst nicht viel zu tun ist. Bei einfachen Aufgaben wie dem Setzen oder Löschen einzelner Bits oder der Abfrage des Werts eines Bits sehen die Assemblerprogramme sogar ein wenig eleganter aus als die C-Programme. Bei größeren Programmen, die über mehr interne Struktur verfügen als diese einfachen Beispiele, entwickelt sich dann allerdings doch die Übersichtlichkeit einer Hochsprache wie C zu einem Vorteil gegenüber einem Assemblerprogramm. Aber es kann keinesfalls schaden, die elementaren Aufgaben mit mehreren Programmiersprachen umzusetzen.

; Dieses Programm laesst eine LED
; an Pin RC0 blinken
; Die Frequenz wird ueber ein
; Potenziometer an AN0 (RA0) gesteuert

list p=18F25K50
include p18f25k50.inc
config WDTEN=OFF, BOREN=OFF, FOSC = INTOSCIO, MCLRE = ON, LVP = OFF

org 0x00
goto start

org 0x04

start
clrf TRISC ; Port C: Alle Bits sind Ausgaenge
clrf PORTC ; Port C: Alle Bits auf 0

; AD Modul konfigurieren
bsf TRISA, 0 ; Pin RA0 als Eingang definiere...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang