Referenzspannungsquelle

(z.B. PIC16F627/628,  PIC12F629/675, PIC16F87xA, PIC18F2550)

zurück zu Input/Output , PIC-Grundlagen , PIC-Prozessoren , Elektronik , Homepage

Allgemeines zur Referenzspannungsquelle
imögliche Spannungen
Programmierung der Referenzspannungsquelle
Beispiel


Allgemeines zur Referenzspannungsquelle

Alle PICs die mit analogen Komparatoren ausgestattet sind, besitzen auch eine interne Referenzspannungsquelle. Das sind insbesondere die Typen

Dagegen haben die Typen PIC16F84(a) und PIC16F87x keine Komparatoren und keine Referenzspannungsquelle. Für diese Typen trifft dieser Abschnitt also nicht zu!

Die Referenzsspannungsquelle ist ein per Software gesteuerter Spannungsteiler, der am Pin RA2 oder für die Komperatoren einen bestimmten Bruchteil der Betriebsspannung Vdd bereitstellt. Die Referenzspannung ist also nur so stabil, wie die Betriebsspannung. Sie eignet sich also nicht als Referenz für 10-Bit-ADCs. Trotzdem lassen sich insbesondere im Zusammenspiel von Referenzsspannungsquelle und Komparatoren viele hübsche Sachen anstellen, wie z.B. Spannungsmessungen oder Spannungsvergleiche.

nach oben

mögliche Spannungen

Die Referenzsspannungsquelle kann in zwei Modes Arbeiten: Low Range  oder High Range. Zwischen den beiden Modes wird mit dem Bit VRR im Register VRCON umgeschaltet. In jedem Mode kann der Spannungsteiler der Referenzspannungsquelle eine vom 16 möglichen Spannungen ausgeben. Welche der 16 Spannungen ausgegeben wird stellt man mit den Bits VR3 ..VR0 im Register VRCON ein. Diese 4 Bits stellen die Zahl VR dar, die auf Werte von 0 bis 15 programmiert werden kann. 
 

Mode
Formel für Uref
Minimalwert für Vdd = 5V
Schrittweite für Vdd = 5V
Maximalwert für Vdd = 5V
Toleranz
Low Range
Uref = Vdd/24 x VR
0 V
208 mV
3,125 V
1/4 Schritt (52 mV)
High Range
Uref = Vdd/32 x  (VR+8)
1,25 V
156 mV
3,75 V
1/2 Schritt (78 mV)

 
Aufbau der Referenzspannungsquelle Nebenstehende Abbildung stellt den Aufbau dar.
Kern ist ein 16-stufiger Spannungsteiler aus 16 gleichen Widerständen. Ein ebenfalls 16-stufiger Umschalter wählt eine der Spannungen zwischen den Widerständen als Referenzspannung aus.

VREN schaltet die Baugruppe ein
VRR wählt einen von 2 Spannungsbereichen
VR wählt eine von 16 Spannungen aus
VROE schaltet die Spannung zum Pin RA2

Da die Widerstände einen recht hohen Widerstand haben (R = 2kOhm) darf der Ausgang nicht  belastet werden (nur im µA-Bereich). Wer die Spannung für etwas Anderes benutzen möchte als als Referenzspannung für einen hochohmigen OPV-Eingang, der muss sie erst noch verstärken.

Wie man aus der obrigen Tabelle entnehmen kann, ist die Referenzspannungsquelle keine Referenzspannungsquelle im messtechnischen Sinne. Vielmehr weist sie exemplarabhängig recht große Fehler in der Ausgangsspannung auf (>50 mV).

nach oben

Programmierung der Referenzspannungsquelle

Die Programmierung der Referenzspannungsquelle erfolgt im Register VRCON, das z.B. beim 16F62x auf Adresse 9Fh liegt.

VRCON REGISTER (ADDRESS 9Fh):


bit 7 bit 6 bit 5 bit 4 bit 3 bit 2 bit 1 bit 0
Name: VREN VROE VRR - VR3 VR2 VR1 VR0
Wert: 0 oder 1 0 oder 1 0 oder 1 x 0 oder 1 0 oder 1 0 oder 1 0 oder 1

VREN (Vref enable)
Mit diesem Bit wird die Referenzspannungsquelle eingeschaltet

VROE (Vref output enable)
Mit diesem Bit kann man die erzeugte Spannung an das Pin RA2 anlegen.
Dazu muss RA2 als input initialisiert sein (TRISA2=1) VRR (Vref range selection)
Mit diesem Bit wird zwischen Low-Range-Mode und High-Range-Mode umgeschaltet VR3, VR2, VR1, VR0 (Vref value selection)
Der 4-Bit-Wert VR dient dem Einstellen der Spannung

Beim 12F6xx liegt VRCON auf der Adresse 99h. Der 12F6xx kann die erzeugte Spannung nicht an einem Pin ausgeben, sondern sie nur für den Komperator nutzen. Folglich ist dort das Bit VROE nicht definiert.

Wenn man die erzeugte Spannung an RA2 ausgeben will, so muss dafür gesorgt werden, das RA2 als Input eingestellt ist, ansonsten hat die relativ stromschwache Referenzspannungsquelle keine Chance gegen die relativ starken digitalen Ausgangstreiber des Pins. Man kann zwar nichts beschädigen, aber am RA2 würde man nur den digitalen Pegel des Bits PORTA,2 messen können.

Wie die Referenzspannung bei Bedarf zu den Komparatoren kommt, darum kümmern sich die Komparatoren schon allein.

Nach jeder Änderung der Vref-Einstellung sollte man der Referenzspannungsquelle 10 µs Zeit lassen, um die gewünschte Spannung einzustellen.
 

Folgendes Beispiel stellt eine Spannung von 3,125 V (bei Vdd = 5 V) am Pin RA2 ein. Dazu wird im Low-Range-Mode mit VR=15 gearbeitet

5V / 24 x 15 = 3,125 V
        BSF     STATUS,RP0      ; Bank 1
        BSF     TRISA,2         ; RA2 ist digital-input
        MOVLW   B'11101111'     ; enable VREF, RA2-output, VR=15
        MOVWF   VRCON           ; low range mode
        BCF     STATUS,RP0      ; Bank 0
        CALL    DELAY10         ; 10µs warten
nach oben


 

Beispiel für die Referenzspannungsquelle

Das folgende Beispiel (identisch mit diesem Lernbeispiel) gibt am Pin RA2 eines 16F628 eine Sägezahnspannung von 0 V bis  3,125V aus. Das dauert jeweils 4 Sekunden, und beginnt dann von vorn. Am PortB werden zur Kontrolle die aktuellen Werte von VR ausgegeben, und können auf Wunsch mit LEDs angezeigt werden.
Am Besten benutzt man ein Digital-Voltmeter mit Bargraph-Anzeige oder einen Oszi zur Darstellung des Ausgangswerts an RA2.
Einfache Digitalvoltmeter sind bei so schnellen Änderungen schwer ablesbar. Voltmeter mit Zeigerinstrument stellen die Änderung wunderbar dar, allerdings belasten sie die Referenzspannungsquelle zu hoch. Folglich zeigen sie eine zu geringe Spannung an.
 
        list p=16f628
;**************************************************************
;*      Pinbelegung
;*      ---------------------------------- 
;*      PORTA:  0 -
;*              1 -
;*              2 > Spannungsausgang
;*              3 -
;*              4 -
;*              5 < MCLR
;*              6 > OSC2
;*              7 < OSC1
;*
;*      PORTB:  0 > LED
;*              1 > LED
;*              2 > LED
;*              3 > LED
;*              4 -
;*              5 -
;*              6 -
;*              7 -
;* 
;**************************************************************
;
;sprut (zero) Bredendiek 01/2003
;
; Sägezahn mit der Referenzsspannungsquelle am Port RA2
; Spannung steigt in 4 Sekunden von 0V auf 3,125 V
;
; Prozessor 16F628 
;
; Prozessor-Takt 10 MHz
;
; LED-Zeile am PortB
;
;**************************************************************
; Includedatei für den 16F628 einbinden

        #include <P16f628.INC>

        ERRORLEVEL      -302            ; SUPPRESS BANK SELECTION MESSAGES
 

; Configuration festlegen:
; Power on Timer, kein Watchdog, HS-Oscillator, kein Brown out, kein LV-programming
        __CONFIG       _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC & _BODEN_OFF & _LVP_OFF

; Constanten festlegen
#define LED     PORTB

; Variable festlegen
counter         equ     0x20            ; Zählstand für Sägezahn
loops           equ     0x21            ; ms-Zähler
loops2          equ     0x22            ; Wait-Zähler
 

;**************************************************************
; Programmanfang

        org     0

;**************************************************************
; Initialisierung *********************************************

init
        BSF     STATUS,RP0              ; Bank 1
        BSF     TRISA,2                 ; RA2 ist digital-input
        MOVLW   B'11100000'             ; enable VREF, RA2-output, VR=0000
        MOVWF   VRCON                   ; low range mode
        clrf    OPTION_REG 
        clrf    TRISB                   ; PortB alle outputs 
        bcf     STATUS, RP0             ; Bank 0
        clrf    PORTB                   ; LEDs aus
        clrf    INTCON                  ; Interrupt disable

        clrf    counter

;Hauptprogrammschleife
mainloop
        movfw   counter
        movwf   LED                     ; VR anzeigen

        movlw   B'11100000'
        iorwf   counter, w
        bsf     STATUS, RP0             ; Bank 1
        movwf   VRCON 
        bcf     STATUS, RP0             ; Bank 0

        movlw   D'255'                  ; 250 ms Pause
        movwf   loops 
        call    WAIT 

        incf    counter, f
        movlw   B'00001111'
        andwf   counter, f              ; VR auf 15 begrenzen

        goto    mainloop
 

;*****************************************************
;Zeitverzögerung um loops * 1 ms
; 10 MHz externer Takt bedeutet 2,5 MHz interner Takt
; also dauert 1 ms genau 2500 Befehle
; 250 Schleifen a 10 Befehle sind 2500 Befehle = 1 ms

WAIT
top     movlw   .250           ; timing adjustment variable (1ms)
        movwf   loops2
top2    nop                    ; sit and wait
        nop
        nop
        nop
        nop
        nop
        nop
        decfsz  loops2, F      ; inner loops complete?
        goto    top2           ; no, go again
                               ;
        decfsz  loops, F       ; outer loops complete?
        goto    top            ; no, go again
        retlw   0              ; yes, return from subWAIT
 

        end

nach oben

zurück zu Input/Output , PIC-Grundlagen , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 21.01.2003
letzte Änderung: 22.03.2007
Quelle: Dokumentation der Fa. Microchip