Der FKG- Roboter

FORPHYS- Mess- Interfaces

Forschendes Lernen im Physik-UR

Würzburger Quanten- physik- Konzept

Grundfakten der Quanten- physik

Materialien Physik-UR

Physika- lische Analysen

Im- pres- sum

Kommen- tare und Wünsche

© Horst Hübel Würzburg 2005 - 2014

Differenzspannungsmessung mit programmierbarer Verstärkung beim ATMEGA32

..NEU Physikalische Schülerversuche mit PC und Mikroprozessor, 2. Auflage, im Buchhandel erschienen

.

.

..

1. Übersicht

Mit dem ATMEGA32 (auch mit dem ATTINY85 und dem ATMEGA128, auf die hier aber nicht eingegangen wird) lassen sich Differenzspannungen (maximal 2 Kanäle) verstärken und messen. Mögliche Verstärkungsfaktoren V sind 1, 10 und 200. Damit ist der ATMEGA32 in der Lage, kleine Induktionsspannungen und Hall-Spannungen von linearen Hall-Sensoren zu messen, und zwar vorzeichengerecht.

Es wird hier die Programmierung in AVISE4.3 beschrieben, einer FORTH-Variante, die von W. Schemmert, Fa. CINETIX, Frankfurt entwickelt wurde. Eine fertige Programmdatei zum Einlesen in den Prozessor mit ATOOL33 (ebenfalls von Herrn Schemmert und über CINETIX kostenlos zu beziehen) finden Sie unten.

Von AVISE4.3 (vgl. So schön geht AVISE) sind schon Messworte zur Messung von Spannungen gegenüber Masse vorgegeben:

0 AIN . misst z.B. die Spannung an ADC0 (Port A0) und sendet sie mit dem Punkt an das Terminalprogramm im PC. Ganz entsprechend soll jetzt ein neues Messwort DIFIN entwickelt werden, das z.B. folgendermaßen eingesetzt wird zum Messen einer Differenzspannung zwischen den Ports A1 und A0 bei einem Verstärkungsfaktor von  V = 1:        

0  1 DIFIN .    

Durch den Punkt wird das Zweierkomplement des Messwerts auch hier an den PC gesandt. 0 sagt dem Prozessor, dass die niedrigste Verstärkungsstufe gewählt werden soll, also der Verstärkungsfaktor V = 1. 1 sagt ihm, dass zwischen A1 und A0 gemessen werden soll. Allgemein soll das Wort so eingesetzt werden:

g k DIFIN .      (g = 0, 1 oder 2 ist der Verstärkungsparameter gain, der zu Verstärkungfaktoren  V  verstärkung = 1, 10 oder 200 führt. Der Parameter kanal k = 1 oder 3 legt fest, dass zwischen A1 und A0 bzw. A3 und A2 gemessen werden soll).

Ähnlich wird ein Wort DIFIN2 definiert, mit dem abwechselnd auf beiden Kanälen gemessen werden soll. Es wird folgendermaßen angewendet:

g1 k1 g2 k2 DIFIN2 . .

g1 und g2 legen wieder die Verstärkungen für beide Kanäle fest, k1 und k2 die Kanäle. Mit den beiden Punkten werden die beiden Ergebnisse wie bei DIFIN als Zweierkomplement an den PC geschickt. Es werden noch ein paar Hilfsworte definiert, die die Messparameter des Prozessors setzen und die die Messergebnisse in eine leicht weiter verwertbare Form bringen.

.

2. Differenzspannungsmessung mit programmierbarer Verstärkung beim ATMEGA32

Obwohl verschiedene andere Möglichkeiten existieren (siehe Datenblatt zum ATMEGA32), wird hier davon ausgegangen, dass für folgende Optionen entschieden wurde:

1. Die Spannung an AVCC ist gleich der Betriebsspannung VCC, die in der Regel 5 V ist. AREF ist über einen 100 nF-Kondensator mit Masse verbunden. AVCC wird intern mit AREF verbunden und dient als Referenzspannung der AD-Wandler.

2. Für die messbaren Spannungen gibt es Einschränkungen: Der Betrag der Differenzspannung darf VCC/gain nicht überschreiten.

3. Es werden zwei bestimmte Differenz-Kanäle vorgesehen: zwischen ADC1 und ADC0 („kanal = 1“) und zwischen ADC3 und ADC2 („kanal = 3“). Die Spannungen an den einzelnen Pins werden für das Folgende entsprechend durchnummeriert, also U0 ist die Spannung an ADC0 im Vergleich zu Masse-Potenzial, usw.

4. Die AVISE-Messworte liefern den Messwert für die Differenzspannung U1 -U0 oder U3 - U2 als Zweierkomplement. Das verarbeitende PC-Programm muss daraus eine positive oder negative Zahl bilden. Der erste Schritt dazu ist die Skalierung des Messwerts auf das Intervall [0;3FF] , wobei die negativen Zahlen im Intervall [0;1FF] liegen, die positiven von 200  bis 3FF, jeweils der Größe nach geordnet. Im Folgenden werden  so umgewandelte Messergebnisse als "normalisiert" bezeichnet.

5. Wenn U1 > U0 oder U3 > U2, folgen positive Messwerte. Das gilt auch dann, wenn der Prozessor bei gain = 1 und kanal 1 zunächst umgekehrtes Vorzeichen *) liefert. Weil das Verhalten des Prozesors bei diesen Werten anders als sonst ist, erfordert das einigen Programmieraufwand zur Korrektur.

6. Obwohl in der normalen Betriebsart die AD-Wandler-Eingänge gegenüber Masse Spannungen mit 10 bit Genauigkeit liefern, ist die Genauigkeit im Differenzsspannungsmodus reduziert: 9 bit-Genauigkeit bei verstärkung = 1 oder 10, 8 bit-Genauigkeit bei verstärkung = 200. Das ist in der Skalierung des Messwerts (Umwandlung in V) zu berücksichtigen, zusammen mit der Betriebsspannung VCC als Vergleichswert. Z.B. bei Messwert 100 (dezimal) ergibt sich bei AVCC = 5 V eine Differenzspannung U = 5V/ verstärkung · 100/512 (bei verstärkung = 1 oder 10) oder U = 5V/ verstärkung· 100/256 (bei verstärkung = 200).

Bei verstärkung = 200 ist also der Betrag der maximal messbaren Differenzspannung 5000 mV/200 = 25 mV.

..

3. Messworte in AVISE4.3

Es werden folgende Register des Prozessors benutzt mit hexadezimalen Adressen:

.

Adresse hexadezimal

  Abkürzung des
Registers
nach
ATMEL

Name des Registers

Funktion

$ 24, 25 ADCL, ADCH Messwert (2 Bytes) enthält nach der Messung das Zweierkomplement des Messwerts
26 ADCSRA Kontroll- und Status-Register Das Steuerwort schaltet die AD-Wandler-Einheit ein oder aus und startet den Wandlungsvorgang.

Bit 7 schaltet ADC ein, Bit 6 startet Messung; Bit 0-2 wählen Vorteiler für die Taktfrequenz:

Bits 1,2 gesetzt: Prescaler = 64, also Frequenz = 8 MHz / 64 = 125 kHz

AD-Wandler ein: Steuerwort 86(16); Wandlung starten: zusätzlich Bit 6 setzen

27 ADMUX Multiplexer-Register Steuerwort programmiert das Paar der verwendeten AD-Wandler-Eingänge, Verstärkungsfaktor, Ausrichtung und Referenzspannung

Bits 0,1 ... 4: Kanal/Verstärkung,

Bit 5 gesetzt: linksjustiert, Bit 5 gelöscht: rechtsjustiert

Bits 6 und 7 gesetzt: Externe Referenzspannung; wenn davon nur Bit 6 gesetzt: interne Zuschaltung von AVCC als Referenzspannung

(unsere Wahl: Kanal/Verstärkung, rechtsjustiert, AREF = AVCC)

Für unsere Wahl ergibt sich also folgende Tabelle:

kanal

Differenz

Verstärkung

Steuerwort

1 U1-U0 1* 16(10) + 64(10) = 10(16) + 40(16)
1 10 9 + 64 = 9 + 40
1 200 11(10) + 64 = b + 40
3 U3-U2 1 27(10) + 64 = 1b + 40
3 10 13(10) + 64 = d + 40
3 200 15(10) + 64 = f + 40

.

. Weitergehende Informationen zu den einzelnen Bits der Register finden Sie im Datenblatt zum ATMEGA32.

Aufruf-Konvention für die folgenden AVISE-Worte:

( a b -- c d ) X.

Für das Wort X liegen a und b als Eingabeparameter auf dem Stapel. Nach Abarbeiten des Worts X liegen c und d als Ausgabewerte auf dem Stapel. b bzw. d sind das jeweils oberste Stapelelement.

.

Wort-Definition

(Groß- oder Kleinschreibung belanglos)

Kommentare

. Verstärkungsgruppe für Kanal 0, Wert = gain (0, 1, 2)

Verstärkungsgruppe für Kanal 1, Wert = gain (0, 1, 2)

kanal, Wert = 1, 3

forget adcl  Die Konstante adcl muss früher definiert worden sein, z.B. mit $ 24 const adcl. Dient dazu, frühere Versionen des Wort-Satzes, beginnend mit dem Wort adcl, zu entfernen.
$ 24 const adcl 26 const adsc 27 const admux Adressen der Register werden als Konstanten definiert, adcl erneut
var vch0 Variablen-Definition:

Vorzeichenkorrektur nötig, wenn vch0 = 1

var vch1 Vorzeichenkorrektur nötig, wenn vch1 = 1
var mux0 Steuerwert für Kanal 0
var mux1 Steuerwert für Kanal 1; beide Werte werden bei 2-kanaliger Messung abwechselnd in ADMUX geschrieben
: PAR 1 = if dup 0 = if drop 10 else 1 = if 9 else b endif

endif

else dup 0 = if drop 1b else 1 = if d else f endif endif

endif ret

PAR berechnet aus kanal und gain Parameter für ADMUX gemäß der  Tabelle:

gain gain gain Kommentar
kanal 0 1 2 (*: Vorzeichenkorrektur nötig )
1 16(10) = 10(16) * 9 11(10) = b U1 - U0 soll gemessen werden
3 27(10) = 1b 13(10) = d 15(10) = f U3 - U2 soll gemessen werden

Der Parameter muxpar kann in mux0 bzw. mux1 gespeichert werden

Aufruf: ( gain kanal -- muxpar) PAR

: VIN swap 10 = if 1 swap wb else 0 swap wb endif 40 + ret VIN belegt vch0 bzw. vch1 mit einem Flag für Vorzeichenumkehr: vch0 = 0 , bzw. vch1 = 0 , wenn keine Änderung nötig.

Aufruf: (  [ mux mux ]  vch -- mux + 40 ) VIN.  Zu  mux wird das Steuerwort für ADMUX um 40 ergänzt und auf den Stapel gelegt. Das ist nötig, wenn als Referenzspannung AVCC gewählt wird: AREF = AVCC (intern)

: ADC_ON $ 86 adsc wb PAR dup vch0 vin admux wb ret ADC_ON belegt Parameter für einkanalige Messung und schaltet den AD-Wandler ein. Die Wandlung selbst wird erst mit DIFIN gestartet.

Aufruf: ( gain kanal -- ) ADC_ON

86(16) ergibt sich folgendermaßen:

80(16) + 6 für AD-Wandler ein (80) und Prescaler 64 gewählt (6).

: ADC_ON2

PAR dup vch0 vin mux0 wb

PAR dup vch1 vin mux1 wb

$ 86 adsc wb

0 . mux0 rb . 1 . mux1 rb .

ret

ADC_ON2 belegt Parameter für zweikanalige Messung und schaltet den AD-Wandler ein. Die Wandlung selbst wird erst mit DIFIN2 gestartet.

Aufruf: ( gain1 kanal1 gain0 kanal0 -- ) ADC_ON2

: DIFIN $ 6 adsc bset adcl rd ret DIFIN startet die Wandlung und legt das Ergebnis als Zweierkomplement auf den Stapel.

6(16) ergibt sich folgendermaßen:

Aufruf: ( -- messwert/zwkp ) DIFIN

: NORM $ rb 1 = if dup 200 > if 200 - not 1ff and 200 + else not 1ff and

endif

else dup 200 > if 200 - else 200 + endif

endif ret

NORM wandelt das Zweierkomplement um und skaliert auf das Intervall [0;3FF]. Die negativen Werte liegen in aufsteigender Ordnung von 0 bis 1FF

Aufruf: ( messwert/zwkp vch  -- messwert ) NORM  .         messwert ist skaliert auf [0;3FF]  ("normalisiert")

: DIFIN2 mux0 rb admux wb difin vch0 norm & . $ mux1 rb

admux wb difin vch1 norm & . $ d emit ret

DIFIN2 wählt Anschlüsse und Verstärkung für Kanal 0, startet Wandlung und legt das Ergebnis als Zweierkomplement auf Stapel und normalisiert es. Dann wählt das Wort Anschlüsse und Verstärkung für Kanal 1, startet Wandlung und legt das Ergebnis als Zweierkomplement darüber auf den Stack. Dann Normalisierung mit NORM.

Aufruf: ( -- messwert0 messwert1 ) DIFIN2 (Vgl. Unterschied zu DIFIN !)

: ADC_OFF $ 0 adsc wb ret ADC_OFF disabled die AD-Wandler
: TEST adc_on repeat difin vch0 norm & . $ d emit key? until drop adc_off ret Beispielwort für den Einsatz der Messworte bei einkanaliger Messung

TEST führt Differenzspannungsmessungen so lange durch, bis eine Taste gedrückt wird. Es wird jeweils der normalisierte Messwert mit einem Zeilenvorschubzeichen ($ d) an das Terminalprogramm im PC gesandt. Er müsste im PC-Programm noch in Volt umgerechnet werden unter Berücksichtigung von Verstärkung V und Spannung an AREF = AVCC (intern) und gültiger Bitzahl.

Aufruf: ( gain kanal -- ) TEST;          Dabei       kanal: 1 oder 3     gain: 0,1 oder 2 auf dem Stack; entspricht den Verstärkungsfaktoren V verstärkung = 1, 10, 200.

: TEST2 adc_on2 repeat difin2 key? until drop adc_off ret Beispielwort für den Einsatz der Messworte bei zweikanaliger Messung

TEST2 führt Differenzspannungsmessungen so lange durch, bis eine Taste gedrückt wird. Zuerst wird der normalisierte Messwert von Kanal 1, dann der normalisierte Messwert von Kanal 0 an das Terminalprogramm im PC gesandt.

Aufruf: ( gain1 kanal1 gain0 kanal0  -- ) TEST2;  jeweils       kanal: 1 oder 3       gain: 0,1 oder 2

Für schnellere Messung kann NORM zunächst weggelassen werden und nach Übertragung an den PC im PC-Programm nachgeholt werden. Beispiel in messen13b.txt. Einkanalig sind dann ca. 9500, zweikanalig immerhin ca. 3700 Messungen pro Sekunde möglich. Der erhöhte Zeitbedarf pro Messung in letzterem Fall ergibt sich aus der notwendigen "Beruhigung" nach dem Umschalten des Multiplexers vor jeder Messung.

.Anwendung: Es werden noch einige Variablen definiert, wie VCH0. $ 2 1 ADC_ON <ENTER> schaltet den AD-Wandler ein, legt Kanal und Verstärkung fest und sagt dem Prozessor, dass die Betriebsspannung, die auch am Pin AVCC liegt, als Referenzspannung für den AD-Wandler genutzt werden soll, also maximaler AD-Wandler-Wert bedeutet Betriebsspannung. DIFIN <ENTER> misst dann jeweils einmalig die so festgelegte Differenzspannung, z.B. auch in einer Schleife. Mit den Eingabedaten 2 1 vor ADC_ON wird die Differenzspannung von Pin ADC1 gegenüber Pin ADC0 ( kanal = 1 ) bei einem Verstärkungsfaktor von 200 ( gain = 2) gemessen. PAR erzeugt aus gain und kanal einen Parameter für das Multiplexregister $27. DIFIN legt das Zweierkomplement des Messwerts auf den Stack zur weiteren Verarbeitung. Nach NORM ist auf dem Stack der auf das Intervall  mit aufsteigenden Werten zu finden. Sonst ist nur noch kanal = 3 möglich (Spannung an ADC3 gegen ADC2; beachten Sie: bei Interface-Variante IFA ist hier für Wechselspannungsmessung eine Pegelanhebung vorgesehen) und gain = 0 (Verstärkungsfaktor 1) oder = 1 (Verstärkungsfaktor 10). Nach der letzten Messung wird der Differenzspannungsmodus mit ADC_OFF abgeschaltet. Stacküberlauf droht in einer Schleife nach DIFIN, wenn nicht zweierkomplement des messwerts, bzw. nach NORM, wenn nicht messwert jeweils entfernt werden. Im aufrufenden PC-Programm kann aus aus dem normalisierten messergebnis zur weiteren Verarbeitung eine Zahl mit Vorzeichen gebildet werden. $ 27 ist das Multiplexerregister, in dem Kanal und Verstärkung festgelegt werden. $ 24, 25 sind die Datenregister für das Messergebnis, $ 26 das Steuerregister: Durch Bit 6 wird der Wandelvorgang (6 26 BSET) gestartet. Durch $ 24 RD wird der gewandelte Wert ausgelesen und auf den Stapel gelegt. $ C0 IZ C1 IZ macht beide Eingänge von kanal = 1 spannungsempfindlich (keine Pullup-Widerstand zugeschaltet).

.

4. Messworte - Quelltext für ATOOL

ATOOL33 ist das von Herrn W. Schemmert (Fa. CINETIX) entwickelte Terminalprogramm, mit dem txt-Dateien mit dem Quelltext in den Prozessor gelesen werden können. Es ist kostenlos bei Fa. CINETIX erhältlich. Beispiele für solche Quelltext-Dateien für Differenzspannungsmessung sind die folgenden beiden:

ADC32DIFF.txt

In der folgenden Datei sind auch Messworte für schnelles Messen enthalten. Die Messwerte werden dabei als Zweierkomplement im SRAM des Prozessors gespeichert und erst nachträglich normalisiert und an den PC gesandt.

FAST32DIFF.txt


Schäden werden bei sachgemäßem Umgang nicht erwartet. Dennoch wird keinerlei Haftung übernommen, z.B. bzgl. Gefährdung der Prozessoren, der PCs und vor allem der mit dem System experimentierenden Personen.

Ein Haftungsausschluss von Herrn Schemmert wird hier einkopiert:

[Image] IMPORTANT SAFETY INFORMATION:

'Avise' is not specified for safety-critical, medical or any application else, which ever might cause danger for persons or animals or damage of things. The use of 'Avise' in such applications is strictly forbidden.

(zuletzt aktualisiert 2013)