Pfad:
Home =>
AVR-Übersicht =>
Anwendungen => Hysterese
This page in english:
 |
Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Hysterese bei AVRs
|
 |
Hysterese-Spannung von AVRs
Hier kann man lernen,
- was Hysterese ist,
- wozu man das gebrauchen kann, und
- wie man das misst.
Alle Schaltbilder und Grafiken gibt es wie immer als LibreOffice-Draw-Datei
hier, alle Berechnungsblätter als Calc-Datei
hier.
1 Was ist diese Hysterese?
1.1 Inverter ohne Hysterese
Nehmen wir an, wir koppeln den Ausgang einen Inverters über ein RC-Glied an
seinen Eingang zurück. Zu Beginn, wenn der Kondensator entladen ist, ist der
Inverter-Eingang Low und der Inverter-Ausgang High. Der Ausgang lädt dann den
Kondensator über den Widerstand auf. Erreicht die Spannung am Kondensator die
Schwellspannung des Inverter-Eingangs, dann kippt der Ausgang auf Null. Jetzt
entlädt der Ausgang des Inverters den Kondensator wieder. Bis die Spannung
am Kondensator unter die untere Schwellspannung gefallen ist, bleibt der Ausgang Low
und wird erst dann wieder High.
Unterscheidet sich die obere (Low nach High) und die untere (High nach Low)
Schwellspannung nicht, dann schwingt das Gebilde nach dem anfänglichen Laden
sehr schnell. Nur die Zeit, die der Inverter zwischen dem Schalten am Eingang und
dem Nachführen des Ausganges benötigt, was man als Durchlaufzeit oder
als Propagation Delay Time bezeichnet (tPD), verzögert den Vorgang
etwas. Je nach Logik-Familie des Inverters (TTL, LS-TTL, HC-TTL, CMOS, CMOS-TTL)
liegt diese Zeit irgendwo zwischen 10 und 200 Nano-Sekunden. Die Schwingfrequenz
beträgt dann f = 1 / tpd / 2, also zwischen 2,5 und 50 MHz.
Die Grö&slig;e von R und C spielen hier praktisch keine Rolle mehr, nur die
Propagation Delay Time.
Vertreter dieser Art von Invertern sind z. B. der 74LS04 in TTL oder der 4069
in CMOS.
1.2 Inverter mit Hysterese
Nicht so, wenn sich die obere und die untere Schaltschwelle ein wenig unterscheiden.
Dann kriegt das Inverter-Symbol diesen Eintrag. Jetzt geht der Ausgang erst oberhalb
der oberen Schaltspannung am Eingang auf Null und erst unterhalb der unteren
Schaltspannung wieder auf Eins. Den Spannungsunterschied zwischen den beiden
Spannungen bezeichnet man als Hysteresespannung. Er ist zwar recht bescheiden, aber
im Diagramm klar zu erkennen.
Jetzt verläuft die Kurve des Ladens und Entladens etwas anders: die Hysterese
und R als auch C bestimmen die Schwingfrequenz. Lade- und Entladespannung bewegen
sich von der oberen zur unteren Hysteresespannung und wieder zurück. Bei einem
R von 10kΩ und einem C von 1.000µF braucht beides 0,41 Sekunden,
was einer Schwingfrequenz von 2,4 Hz entspricht.
Zunehmende Hysterese verringert hier die Schwingfrequenz. Das Produkt aus R und C
beträgt hier 10, die Formel zur Berechnung der Schwingfrequenz ist hier also
f = 24,4 / (R * C). Die Hysteresespannung versteckt sich hier in den 24,4.
2 Wozu braucht man Hysterese?
2.1 Hardware-Entprellen von Tastern und Schaltern
Nehmen wir an, wir möchten eine Taste entprellen. Wird die Taste gedrückt,
soll sie erst nach einigen Millisekunden reagieren. Wird sie losgelassen, soll sie
erst nach einigen Millisekunden wieder auf Eins gehen.
Wir könnten nun einiges an Hardware aufwenden, das unsere Taste genau so
und nicht anders steuert.
Soll die Taste einen AVR-Pin steuern, kann sich diese Schaltung auf einen R und einen
C beschränken, wie hier zu sehen.
Die I/O-Pins jedes AVRs haben eine Hysterese, daher können wir ohne weiteres
auch Kondensatoren an sie anschließen und unsere Schaltung profitiert davon.
Durch die Hysterese wird die Schaltung in der Nähe des Umschaltpunkts sehr
unempfindlich: der Port-Eingang reagiert nicht mehr auf jede kleine Einstreuung.
Zu Beginn wird der Kondensator vom internen Pull-Up-Widerstand des I/O-Pins
aufgeladen. Dieser wird eingeschaltet, indem wir das Port-Bit des Pins auf Eins
und das Richtungs-Bit auf Null setzen. Der interne Pull-Up hat ca. 50kΩ.
Wird nun der Schalter oder die Taste geschlossen, dann entlädt sich der
Kondensator langsam über den Widerstand, während der Pull-Up weiter
Strom in den Kondensator leitet. Aber weniger: weil der externe Widerstand
kleiner ist als der Pull-Up geht der Pin irgendwann auf Low. Der vom Taster
an den Kondensator angeschlossene Widerstand muss nur kleiner sein als der
Pull-Up, damit die untere Schaltschwelle von 0,3*UB auch sicher
unterschritten wird.
Wird nun der Schalter oder Taster ausgeschaltet, dann lädt der interne Pull-Up
wieder den Kondensator auf. Erreicht die Spannung am Eingang die obere
Schaltschwelle, dann signalisiert der I/O-Pin wieder High am Input.
2.2 Spannungsverlauf beim Drücken und Loslassen des Tasters
Das hier sind Spannungen und Zeiten bei einem R von 12kΩ und einem C von
2,2µF. Wird der Taster gedrückt, dann dauert es knapp 20 ms (rote
Kurve), bis der Input auf Null geht (rosa Kurve).
Die blaue Kurve zeigt die Spannung am Kondensator nach dem Loslassen des Tasters.
Die Aufladung ist wegen des größeren Pull-Ups etwas langsamer als die
Entladung. Nach etwa 50 ms geht der I/O-Pin wieder auf High.
Gegenüber der Realität ergeben sich noch einige Abweichungen, denn die
I/O-Pins haben selten die halbe Betriebsspannung als Schaltschwelle. Wer es
genauer haben will, misst sie aus und trägt sie in das LibreOffice-Calc-Blatt
"avr-I/O" hier ein.
Und? Wozu jetzt die ganze Hysterese? Das hätte doch auch ganz ohne funktioniert,
oder auch mit einer ganz anderen Hystersespannung. Ja, hätte es. Aber es
wäre störanfällig gewest. Ohne Hysterese hätte die Spannung
am Kondensator nur ein ganz kleines bisschen schwanken müssen, wie man es
hinkriegt, sobald sich das Handy mal wieder mit seiner Basisstation unterhält.
Dann hätte es in der Nähe der Schaltschwelle ganze Schwärme von
I/O-Signalen geregnet und das Programm wäre womöglich total ausgeflippt.
Mit der segensreichen Hysterese müssen es schon 50 mV Signalstärke
sein, damit da irgendwas flippt.
Merke: immer wenn ein Kondensator am Pin liegt, wenn es um langsame
Spannungsänderungen geht und wenn es auf Schaltschwellen
ankommt, kommt Hysterese zum Einsatz.
3 Messen der Hysteresespannung eines beliebigen AVR-Pins
Um die Hysterese messen zu können, müssen wir
- die Spannung an einem INTn- oder PCINTn-Pin eines AVR mittels eines
Kondensators und eines Ladewiderstands zwischen den beiden Schwellspannungen
purzeln lassen, und
- mittels INTn- oder PCINTn-Interrupts jeweils den Ladepin auf High und Low
schalten.
Das Ergebnis der Messung lässt sich am Schaltausgang besichtigen: je höher
die Hysteresespannung, desto niedriger ist die Frequenz des Umschaltens.
Da sich diese Messung mit einem kurzen Assemblerprogramm mit jedem AVR
durchführen lässt, der über einen INTn- oder PCINTn-Pin sowie über
einen beliebigen weiteren I/O-Pin als Ausgang verfügt, ist damit die Messung
auf eine Frequenzmessung reduziert. Am Impuls-/Pausen-Verhältnis der
erzeugten Rechteckspannung kann man noch ablesen, wie weit die Schaltschwelle von
der halben Betriebsspannung abweicht. Dieses Verhältnis kriegt man mit
diesem Frequenzzähler auch noch
bequem in Prozent angezeigt.
Da die Hysteresespannung auch noch von der Betriebsspannung des AVR abhängt,
sollte man diese zwischen dem Minimum und 5V einstellen und messen können.
4 Berechnung der Hysteresespannung aus der Frequenz
Das gelbe Feld zeigt, wie die Hysteresespannung aus der gemessenen Frequenz
berechnet werden kann.
Zwei Annahmen werden hier getroffen:
- Die Schaltspannung liegt ungefähr bei der halben Betriebsspannung.
Wenn das nicht der Fall ist und z. B.niedriger liegt, dann dauert der
Ladevorgang etwas kürzer (weil wegen der niedrigeren Spannung am C der
Ladestrom aus der Betriebsspannung etwas höher wird). Dafür dauert
der Entladevorgang etwas lönger, weil der Entladestrom etwas niedriger
liegt. Beide Effekte gleichen sich aus, nur die Rechteckspannung wird dadurch
unsymmetrisch.
- Die zweite Annahme ist, dass die Hysteresespannung deutlich niedriger ist
als die Betriebsspannung. Dadurch hat die Kondensatorspannung keinen
nennenswerten Einfluss auf den Lade- und Entladestrom und die beiden
Geschwindigkeiten können vereinfacht gerechnet werden.
Zunächst wird in Formel (1) der Lade- und Entladestrom berechnet. Da er
klein sein kann (unter 0,5 mA), kann auf eine Berücksichtigung des
Spannungsabfalls an den Portpin-Ausgangstreibertransistoren verzichtet werden.
Wer das nicht glaubt, vergrößert R auf 100kΩ oder 1MΩ.
Die Zeit zum Laden und Entladen Δt ergibt sich bei einem Strom von I
aus der Formel (2). Die Formel (3) setzt beides zusammen.
Die Frequenz f summiert Ladezeit und Entladezeit zusammen und ergibt sich aus
beiden Zeiten in Formel (4). Umgeformt nach Δt ergibt sich Formel (6).
Ersetzt man nun Δt in Formel (3) durch Δt in Formel (6), erhält
man (7). Durch Klammerauflösung wird daraus (8) und die Hysteresespannung
UH nach der Formel (9) als UB / 4 / f / R / C.
Als Beispiel ist hier mal im grünen Kasten der Fall gerechnet worden, dass
der AVR mit den zwei Komponenten R und C eine Frequenz von 20 Hz erzeugt.
Daraus resultiert eine Hysteresespannung von 62,5 Millivolt.
Da es sich nicht vermeiden lässt, dass das Ein- und Ausschalten des
Treiber-Portpinausgangs in der Interrupt-Serviceroutine zu verschiedenen
Zeitpunkten erfolgt, kann es zu Messfehlern in Form von Taktunterschieden
kommen. Wie das Beispiel mit vier Takten Unterschied zeigt, liegt der dadurch
verursachte Unterschied weit unterhalb der Toleranz des Kondensators und
des Widerstands.
5 Das Programm für die Messung
Da sich das Programm bei Messungen mit einem INTn- oder PCINTn-Pin etwas
unterscheidet, gibt es hier zwei Fassungen.
Beide Programme sind für den ATtiny13A geschrieben, andere AVR-Typen
müssen entsprechend angepasst werden.
Noch eine Warnung! Liegen Programmierimpulse auf den INTn- oder PCINTn-Pins,
dann muss der Elko vor dem Programmieren vom Minus der Versorgungsspannung
abgetrennt werden, weil dieser sonst die Programmierimpulse plattmacht. Das
ist z. B. beim ATtiny13A der Fall.
5.1 Das Programm für die Messung mit einem INTn-Pin
Das Programm sieht vor, dass an PB0 eines ATtiny13 der Widerstand angeschlossen
wird und der INT0-Eingang an PB1 den Kondensator erhält.
Das Programm für die Messung über einen INTn-Eingang ist im
Assembler-Format hier verfügbar.
Es ist im Folgenden als Browsertext abgedruckt.
;
; *******************************
; * Hysteresis-Messung an INT0 *
; * AVR-Typ ATtiny13, Version 1 *
; * (C)2021 by Gerhard Schmidt *
; *******************************
;
.nolist
.include "tn13adef.inc" ; Define device ATtiny13A
.list
;
; Hardware
;
; Device: ATtiny13A, Package: 8-pin-PDIP_SOIC
;
; ________
; 1 / |8
; RESET o--|Reset Vcc|--o +Vop
; (NC) o--|PB3 PB2|--o (NC)
; (NC) o--|PB4 INT0|--o RC
; GND o--|Gnd PB0|--o R/F
; 4 |_________|5
;
; **********************************
; P O R T S U N D P I N S
; **********************************
;
; Ports
.equ pO = PORTB
.equ pD = DDRB
.equ pI = PINB
; Pins
.equ bPB0O = PORTB0
.equ bPB0D = DDB0
.equ bINT0O = PORTB1
.equ bINT0D = DDB1
.equ bINT0I = PINB1
;
; **********************************
; R E G I S T E R
; **********************************
;
.def rmp = R16 ; Multi purpose Register
;
; **********************************
; P R O G R A M M
; **********************************
;
.cseg
.org 000000
;
; **********************************
; R E S E T & I N T - V E C T O R S
; **********************************
rjmp Main ; Reset vector
rjmp Int0Isr
reti ; PCIO
reti ; OVF0
reti ; ERDY
reti ; ACI
reti ; OC0A
reti ; OC0B
reti ; WDT
reti ; ADCC
;
; **********************************
; I N T - S E R V I C E R O U T .
; **********************************
;
Int0Isr: ; 7 Takte fuer INT0 und RJMP
sbic pI,bINT0I ; Ueberspringe wenn low, +1/2 = 8/9
cbi pO,bPB0O ; PB0-Ausgang ausschalten, +2 = 10
sbis pI,bINT0I ; Ueberspringe wenn high, +1/2 = 10/11/12
sbi pO,bPB0O ; PB0-Ausgabe einschalten, +2 = 12/13
reti ; +4 = 7 + 1 + 2 + 2 oder 7 + 2 + 1 + 2 = 12 Takte
;
; **********************************
; M A I N P R O G R A M I N I T
; **********************************
;
Main:
ldi rmp,Low(RAMEND)
out SPL,rmp ; Init LSB stack pointer
cbi pD,bINT0D ; INT0 als Eingang
cbi pO,bINT0O ; INT0 auf low
sbi pD,bPB0D ; PB0 als Ausgang
sbi pO,bPB0O ; Ausgang high
; Init INT0
ldi rmp,(1<<ISC00) ; INT0 bei beiden Pegeln
out MCUCR,rmp
ldi rmp,1<<INT0 ; INT0-Interrupts anschalten
out GIMSK,rmp
; Interrupts einschalten
sei ; Setze I-Flagge
;
; **********************************
; P R O G R A M L O O P
; **********************************
;
Loop:
rjmp loop
;
; End of source code
;
; Copyright
.db "(C)2021 by Gerhard Schmidt " ; Quellcode-lesbar
.db "C(2)20 1ybG reahdrS hcimtd " ; Maschinencode-lesbar
;
Das Programm ist sehr kurz, braucht nur sehr wenig Flash und funktioniert nach
kleineren Umstellungen auch für andere AVR, die einen INT0-Eingang haben.
5.2 Das Programm für die Messung mit einem PCINTn-Pin
Das Programm für die Messung über einen PCINT-Eingang unterscheidet
sich nur sehr geringfügig von demjenigen für einen INT0:
- Statt des INT0-Interrupt-Vektors wird der PCIO-Vektor des betreffenden
Pins verwendet. Die ISR-Routine ändert sich nicht.
- PCMSK wird mit der PCINT-Maske des betreffenden Pins (beim ATtiny13A
wäre das bei gleicher Hardware PCINT1) geladen. Hat der AVR mehr als
acht PCINT-Eingänge, muss das Maskenregister entsprechend des Pins
eingestellt werden.
- Im Interrupt-Masken-Portregister wird statt des INT0 der betreffende
PCIE-Interrupt eingeschaltet.
Das Programm, ebenfalls für den ATtiny13A geschrieben, ist
hier im Assembler-Format
verfügbar. Die Initiierung des PCINT1 ist im Folgenden im Browser gezeigt.
; Init PCINT1
ldi rmp,(1<<PCINT1) ; PCINT1, bei beiden Pegeln
out PCMSK,rmp
ldi rmp,1<<PCIE ; PCINT-Interrupts anschalten
out GIMSK,rmp
5.3 Praktische Messung mit einem ATtiny13A
Die Schaltung zum Messen ist schnell auf einem Breadboard aufgebaut. Die Messung
bei einem ATtiny13A ergab eine Hystersespannung um die 200 mV, sowohl bei
5 V Betriebsspannung als auch bei 3,3 V.
Die Schaltspannung des ATtiny13A liegt geringfügig unterhalb der Hälfte der
Betriebsspannung. Bei 5 V ergaben sich 55,3% high und bei 3,3 V 65,3%.
Der Frequenzzähler hat hier sowohl die Frequenz, deren Pulsweite sowie die
Spannung gemessen.
Viel Erfolg beim schnellen Messen und einfachen Berechnen.
6 Die Komfort-Version zum Messen von VIL und VIH
Wer auch noch die genauen Spannungen messen will, die beim Hysterese-Spiel
auftreten, mache sich auf etwas Aufwand gefasst, kriegt dafür aber den
Mercedes unter den Messgeräten.
6.1 Eigenständige Messversion
Das Ganze in einem einzigen Etwas zu machen ist dann nicht mehr so trivial.
Die LCD, die die Ergebnisse anzeigt, braucht z. B. 5 V Betriebsspannung,
während man die Hysterese gerne auch bei anderen Spannungen messen möchte.
Der ATtiny24 muss daher die LCD-Ansteuerung mit einem Pegelwandler vornehmen. Das
macht man mit einem ULN2001, ULN2002 oder ULN2003. Das ist zwar völlig
überkandidelt, weil da nur wenige mA zu treiben sind, kann man aber so machen.
Die LCD wird dabei nicht mit der Busy-Flagge, sondern mit Wartezyklen betrieben.
Der entsprechende Treiber für die LCD, z. B. der Universaltreiber
lcd.inc,ist dann so zu konfigurieren (Beschreibung
davon gibt es hier).
So kann das Ergebnis auf der LCD aussehen. Da die Messung in voller 1.024-er
Auflösung bei der jeweiligen Betriebsspannung erfolgt, ist die letzte
angegebene Dezimalstelle der Zahlen unsicher. Bei der Hysteresespannung werden
auch die letzten acht Bits des Multiplikationsergebnisses ausgewertet, so dass
eine etwas höhere Auflösung erreicht wird.
6.2 Messung mit dem ATtiny24-LCD-Modul
Hier ist die 5V-Version einer LCD-Anzeige
mit einem ATtiny24(A) vorgestellt. Will man damit eine Hysteresemessung bei einem
angeschlossenen weiteren AVR veranstalten, muss man den an die vier Pins PA0 bis
PA3 des Moduls anschließen.
Diese Lösung ist etwas weniger aufwändig, wenn man schon das
ATtiny24-LCD-Modul hat. Es hat allerdings den Nachteil, dass man Analogmessungen
nur mit einer Auflösung von 5000 / 1024 = 4,88 mV durchführen
kann, was nicht sonderlich genau ist. Ob das den Aufwand mit dem ULN2001 aus der
obigen Schaltung rechtfertigt, lasse ich mal dahingestellt sein.
Beim Anschluss des Frequenzausganges des Prüfexemplars an das LCD-Modul
braucht man dann noch für den Frequenzausgang noch den Pegelwandler auf 5V,
was man mit einem Transistor und zwei Widerständen hinkriegt.
©2021 by http://www.avr-asm-tutorial.net