|
Differenzspannungsmessung mit programmierbarer Verstärkung beim ATMEGA32 |
..
.
. |
..
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.
..
Es werden folgende Register des Prozessors benutzt mit hexadezimalen Adressen:
.
Adresse hexadezimal |
Abkürzung des |
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:
. |
. 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:
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:
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.
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:
|
(zuletzt aktualisiert 2013)