pic: ADC mit dem Comparator (2024)

PIC16F628
zurück zu Lernbeispiele , PIC-Prozessoren, Elektronik , Homepage

Einige PICs, die keinen ADC haben, können mit Hilfe desKomparatorsSpannungen messen
In der Application note AN700 findet sich die Beschreibung eines ADC,der mit dem internen Komparator eines PIC aufgebaut wird. Dasermöglichtes auch dem PIC16F62x Spannungen präzise zu messen.

Funktion eines Delta-Sigma-ADC
Ein Delta-Sigma-ADC besteht aus einem Regelkreis, der in einem festenTakt arbeitet. Der Aufbau ist nachfolgender Schaltung zu entnehmen. AmBeginn eines Taktes wird das Eingangssignal des 1-Bit-DAC festgelegt,.und während des Taktes nicht mehr verändert. Dieser liefertjetztVdd oder Vss zur Eingangsstufe. Diese Eingangsstufe ermittelt dieDifferenzaus dem zu messenden Eingangssignal und dem DAC-Ausgangssignal. DieseDifferenzspannunggeht zum Integrator, der die Spannung während des Taktesintegriert.Das Ausgangssignal des Integrators wird von einem Komparator mit einerReferenzspannung verglichen. Je nachdem, ob dieInteratorausgangsspannunggrößer oder kleiner als die Referenzspannung ist, wirdfürden folgenden Takt die DAC-Ausgangsspannung mit Vdd oder Vssfestgelegt.Das wird nun mehrere hundert oder tausend Takte wiederholt. Dabei wirdgezählt, in wievielen Takten der DAC Vdd erzeugte. DasVerhältnisder Vdd-Takte zur Gesamttaktzahl entspricht dem Verhältnis derEingangsspannungzu Vdd. Der Mittelwert des DAC-Ausgangs (gemittelt über diegesamteMesszeit) muss der Eingangsspannung entsprechen.

pic: ADC mit dem Comparator (1)

Die Auflösung (und damit also die Genauigkeit des ADC)hängtvon der Anzahl der Arbeitstakte ab. Für 10-Bit-Auflösungbenötigtman 1024 Takte. Die Genauigkeit lässt sich beliebigsteigern,allerdings verdoppelt jedes zusätzliche Bit die Anzahl dernötigenTakte und damit auch die Zeit für eine Spannungsmessung.
Der Länge eines einzelnen Taktes sind aber nach unten Grenzengesetzt. In unserem Fall wird ein Prozessor benutzt, um denWandlungsprozesszu steuern. Es fallen in jedem Takt einige abzuarbeitende Funktionenan.Deshalb mag 20µs (20 Befehle bei 4 MHz PIC-Takt) bzw. 4µs(20MHz PIC-Takt) als Untergrenze für die Taktlänge gelten. Damitergeben sich folgende Wandlungszeiten für verschiedeneAuflösungen:

Auflösung
Anzahl der Takte
Gesamtzeit bei 4 MHz
Gesamtzeit bei 20 MHz
8 Bit
256
5 ms
1 ms
10 Bit
1024
21 ms
5 ms
12 Bit
4096
82 ms
17 ms
14 Bit
16384
328 ms
66 ms
16 Bit
65536
1,3 s
262 ms

Dieser ADC ist also fast 1000 mal langsamer als der in viele PICsintegrierte10-Bit ADC. Trotzdem ist dieGeschwindigkeit für die meistenAnwendungenvöllig ausreichend, und man kann sogar eine bessere Genauigkeiterreichenals mit der 'Fertiglösung'.
Wer so einen ADC jenseits der 8 Bit ernsthaft einsetzen möchte,sollte sich um eine sehr stabile Betriebsspannung Gedanken machen, daaus dieser die Referenzspannung und die verwendete RA3-Ausgangsspannungabgeleitetwird.


Prinzip am 16F628

Der PIC16F628 enthält schon viele Teile für einenDelta-Sigma-ADC:

  • den Komparator
  • eine Referenzspannungsquelle
  • digitale Outputpins, die als 1-Bit-DAC fungieren können
Den Spannungs-Differenzstufe für den Eingang kann man mit 2Widerständenaufbauen, als Integrator genügt ein Kondensator.
Die verbliebenen Funktionen können mit Software realisiert werden:
  • konstantes Timing
  • Setzen des 'DAC' in Abhängigkeit vom Komparatorausgang
  • Zähler für die Takte mit DAC=Vss
pic: ADC mit dem Comparator (2) Nebenstehendes Bild zeigt den Aufbau des ADC am Beispiel des16F628.Ignorieren wir mal vorübergehend R1 und die beiden R3

Der Komparator (das grüne Dreieck) vergleicht immer Vref(2,5V aus der internen Referenzspannungsquelle) mit der Spannungam Kondensator.In einem festen Zeitraster (z.B. alle 20 µs) liest die SoftwareC1OUTaus, und setzt PORTA,3 (RA3) auf den entgegengesetzten Wert von C1OUT.

Dadurch wird der Kondensator so weit geladen, bis er Vreferreicht, dannentladen bis er Vref unterschreitet, dann wieder geladen..... DieSpannungan RA0 'eiert' also um Vref herum.
Wir lassen den Prozess 1024 Takte lang laufen und zählendabei die Low Takte. (die Takte mit RA3=0)

Wenn wie hier Vref genau in der Mitte zwischen Vdd und Vssliegt, danndann wird(wenn man die Regelschleife lange laufen lässt) die Zahl derTakte in denen RA3 low ist gleich der Anzahl der Takte sein, in der RA3high ist. Nach 1024 Takten gab es 512 Low-Takte.

Nun erinnern wir uns wieder an die Existenz von R1. Wenn wir überR1 eine Spannung an die Schaltung anschließen, dann störtdieseSpannung den Regelkreis nicht, wenn sie genau Vref (=2,5V) ist.

Ist die Eingangsspannung aber kleiner als Vref, dann muss RA3dadurchgegenwirken,dass er öfter high als low führt. Die Zahl derLow-Zyklensinkt, und sie sinkt noch mehr, wenn die Eingangsspannung noch kleinerwird.
Fall R1 und R2 gleich groß sind, und die Eingangsspannung Vss(0V) beträgt, dann kann das RA3 nur noch dadurch ausgleichen, dases ständig High bleibt. Es gibt 0 Low-Zyklen.

Ist die Eingangsspannung aber größer als Vref, dannmuss RA3dadurch gegenwirken, dass er seltener high als low führt. DieZahl der Low-Zyklen steigt, und sie steigt noch mehr, wenn dieEingangsspannungnoch größer wird.
Fall R1 und R2 gleich groß sind, und die Eingangsspannung Vdd(5V) beträgt, dann kann das RA3 nur noch dadurch ausgleichen, dases ständig Low bleibt. Es gibt 1024 Low-Zyklen.

Die Zahl der Low-Zyklen ist das Messergebnis der AD-Wandlung.Wirkonnten sehen:

Eingangsspannung
Messwert
0 V
0
2,5 V
512
5 V
1024

Der ADC wandelt Spannungen von 0 V bis 5 V mit 10 BitAuflösung.

Der Mittelpunkt des Messbereichs liegt bei Vref, und wird durchdie Referenzspannung bestimmt. Die Größe desMessbereichs(5V) . Wird durch die Spannungsbereich von RA3 (5V) und dasVerhältnisvon R1 zu R2 bestimmt.

Messbereichsgröße = Vdd x R1 / R2
Ist z.B. R1 doppelt so groß wie R2, dann hat RA3 vergleichsweiseleichtes Spiel, um die störende Eingangsspannung auszugleichen.Diestörende Eingangsspannung muss schon doppelt so großsein,um den ADC auf 0 bzw 1024 (also auf Anschlag) zu zwingen. DerMessbereichist dann 10V groß. Das ändert aber nichts daran, das derMittelpunktbei Vref=2,5V liegt. So ein ADC würde also den Bereich von -2,5Vbis+7,5V wandeln können. Dieser Bereich sieht nun doch etwasunsymmetrischaus.

Wem das nicht gefällt, der muss sich nun an die ExistenzvonR3 erinnern. Es gibt in der Realität nur einen R3, entweder dengrünen oder denroten.Mit R3 lässt sich der ganze Messbereich des ADC zuhöherenoder zu niedrigeren Spannungen verschieben. Er bringt eine konstanteStörgrößein die Arbeitsschleife. Wie weit der R3 den Bereichsmittelpunkt vonVrefwegzieht, das hängt vom Verhältnis von R3 und R2 ab - diebeidenkämpfen ja gegeneinander.

Mitte = Vref(1+R1/R3), für den roten R3 nach Vss

Mitte = Vref(1-R1/R3), für den blauen R3 nach Vdd

Den verlockenden Gedanken, einfach Vref zu ändern, sollte manschnellwieder vergessen. Der ADC arbeitet nur linear, wenn Vref genau in derMittezwischen low und high des RA3 liegt - also bei 2,5V.

Schaltung

Bauen wir mal einen 10-Bit-ADC für denSpannungsbereichvon 0V bis 5V.

Der PIC16F628 benötigt also 2 Pins (z.B. RA0 & RA3),zwei Widerständeund einen Kondensator. (R3 ist nicht nötig)

RA3 ist der Ausgang des 1-Bit DAC. Er liefert Vdd oder Vssdurch R2zum Verbindungspunkt von R1&R2. Dorthin speist R1 auch dieEingangsspannungUx. Der Mittelwert aus beiden Spannungen wird in C1 integriert. Dieintegrierte Spannung gelangtanRA0, den Minus-Eingang des Komparators C1. (Dummerweise haben derKondensator und der Kompensator in diesem Beispiel die gleicheBezeichnung.) An den Plus-Eingang desKomparatorsist die interne Referenzspannungsquelle mit Uref = 2,5V angeschlossen.

Im Gegensatz zum obigen Prinzip-Plan ist der Eingang keineDifferenz-sondern eine Summen-Stufe. Das wird durch inverse Ansteuerung des DACausgeglichen.

pic: ADC mit dem Comparator (3)

Kalibrierung

Dieser ADC-Typ muss kalibriert werden, da sein Messbereichund sein Nullpunkt von Referenzspannung, Betriebsspannung und denbeidenWiderständen abhängen.

Die Größe des Messbereichs (also dieDifferenzzwischen kleinster und größter Eingangsspannung) hängtvom Spannungshub an RA3 und vom Verhältnis der beidenWiderständeR1 und R2 ab. Da RA3 MOSFET-Treiber hat und nicht nennenswert belastetwird,kann man von einem Hub von Vdd ausgehen:

Messbereichsgröße = Vdd x R1 / R2
Wenn R1 & R2 genau gleich groß sind, ist der Messbereich5V groß (Vdd=5V). Andere Messbereiche lassen sich durchVariationder Widerstände erreichen.

Der Mittelpunkt des Messbereichs liegt auf dem Wert derReferenzspannung. Sie muss für einen 0V...5V-Messbereichalso genau 2,5V betragen. Leider kann die Referenzspannungexemplarabhängigum über 50 mV streuen. Da hilft dann eine externe Referenzspannung(aus einem mit Vdd/Vss gespeistem Potentiometer) oder eine Kalibrierungper Software.

Mein Versuchsexemplar erzeugt z.B. eine etwas zu kleineReferenzspannungvon 2,42V. Dadurch liegt der Nullpunkt des ADC bei -0,12 V und derEndanschlagist bei 4,96V. Dass der Messbereich also etwasgrößerals 5V (4,96V +0,12V = 5,08V) ist liegt an den beidenWiderständen.Offensichtlich ist bei mir R2 eine Winzigkeit größer als R1.

Programmablauf

  • Zuerst wird der PIC initialisiert, d.h. das Port B wird aufoutputeingestellt.
  • der ADC wird vorbereitet (RA3: output, Vref = 2,5V, Komparator)
  • es folgt eine Endlosschleife
    • der ADC wird abgefragt
    • die unteren 8 Bit des Ergebnisses werden an PortB ausgegeben
    • Sprung zum Beginn der Endlosschleife

Programmlisting

  • Assemblerlisting + HEX-File
listp=16f628
;**************************************************************
;*Pinbelegung
;*----------------------------------
;*PORTA:0 <---------+----+--R1---o U?
;*1-II
;*2x-VrefIC
;*3>----R2---+I
;*4-Vss
;*5-MCLR
;*6-OSC2
;*7-OSC1
;*
;*PORTB:0 > LED
;*1>LED
;*2>LED
;*3>LED
;*4>LED
;*5>LED
;*6>LED
;*7>LED
;*
;* R1 = 47 k
;* R2 = 47 k
;* C = 100 nF
;*
;**************************************************************
;
;sprut (zero) Bredendiek 01/2003
;
; ADC mit Comparator
;
; Prozessor 16F628
;
; Prozessor-Takt 4 MHz
;
; LED-Zeile am PortB
;
;**************************************************************
;
; der code füpr die eigentlicheWandlungwurde aus AN700 übernommen
;
;**************************************************************
; Includedatei für den 16F628einbinden

#include<P16f628.INC>

ERRORLEVEL-302;SUPPRESSBANKSELECTION MESSAGES

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

; Constanten festlegen
#define LEDPORTB

; Variable festlegen
counterequ0x20;
result_lequ0x22;
result_hequ0x23;

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

org0

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

init
bsfSTATUS,RP0;Bank1
clrfOPTION_REG
clrfTRISB;PortBalleoutputs
bcfSTATUS,RP0;Bank0
clrfPORTB;LEDsaus
clrfINTCON;Interruptdisable
callInitCAdc;ADCvorbereiten

mainloop
callCAdc;wandeln
movfwresult_l
movwfPORTB;Low-8-BitanPORTB anzeigen
gotomainloop

;**************************************************************
; ADC-code ausAN700*******************************************
; initialisierung desadc**************************************
InitCAdc
bsfSTATUS,RP0
movlw0xEC;Vrefein,Vref zu RA2
movwfVRCON;LowRangeMode,VR= 12 = 2,5 V
bcfTRISA,3;RA3output des 'DAC'
bcfSTATUS,RP0
movlw0x06;2Komparatorenmit Referenzspannung
movwfCMCON;Comp1out= RA3
return

;**************************************************************
; Wandeln derspannung*****************************************
CAdc
clrfcounter
clrfcounter+1
clrfresult_l
clrfresult_h
movlw0x03;2Komparatorenmit Referenzspannung
movwfCMCON
loop
btfscCMCON,C1OUT; ist Komparator Highoder low
gotocomplow;low
comphigh
nop;high
bcfPORTA,3;'DAC'= 0
incfszresult_l,f; zählen der'Spannung'
gotoeat2cycles
incfresult_h,f
gotoendloop
complow
bsfPORTA,3;'DAC'= 1
nop
gotoeat2cycles
eat2cycles
gotoendloop
endloop
incfszcounter,f; Zahl der ZyklenZählen
gotoeat5cycles
incfcounter+1,f
movfcounter+1,w
andlw0x04;nurBit2 einblenden
btfscSTATUS,Z; Bit 2=1 ? 1024 Zyklen vorbei?
gotoloop;nein
gotoexit;ja
eat5cycles
goto$+1
nop
gotoloop
exit
movlw0x06;2Komparatorenmit Referenzspannung
movwfCMCON;Comp1out= RA3
return

end

zurück zuLernbeispiele, PIC-Prozessoren , Elektronik, Homepage
Autor: sprut
erstellt: 21.01.2003
letzte Änderung: 25.01.2003
Quelle: microchip AN700
pic: ADC mit dem Comparator (2024)

References

Top Articles
Latest Posts
Article information

Author: Catherine Tremblay

Last Updated:

Views: 6683

Rating: 4.7 / 5 (47 voted)

Reviews: 86% of readers found this page helpful

Author information

Name: Catherine Tremblay

Birthday: 1999-09-23

Address: Suite 461 73643 Sherril Loaf, Dickinsonland, AZ 47941-2379

Phone: +2678139151039

Job: International Administration Supervisor

Hobby: Dowsing, Snowboarding, Rowing, Beekeeping, Calligraphy, Shooting, Air sports

Introduction: My name is Catherine Tremblay, I am a precious, perfect, tasty, enthusiastic, inexpensive, vast, kind person who loves writing and wants to share my knowledge and understanding with you.