Pfad: Home => AVR-Übersicht => Anwendungen => Hysterese   This page in english: Flag EN
Langzeit-Timer mit tn25 Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Hysterese bei AVRs
Logo

Hysterese-Spannung von AVRs

Hier kann man lernen,
  1. was Hysterese ist,
  2. wozu man das gebrauchen kann, und
  3. 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

Rueckgekoppelter Inverter 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

Rueckgekoppelter 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.

Eingangsspannungen bei 5V mit 50mV Hysterese 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.

Taste an einem AVR-Eingang 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

Spannungsverlaeufe am I/O-Pin bei 5V 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 75 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

Messen der Hysterese mittels Frequenzmessung Um die Hysterese messen zu können, müssen wir 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

Formel zur Berechnung der Hysterese aus der Frequenz Das gelbe Feld zeigt, wie die Hysteresespannung aus der gemessenen Frequenz berechnet werden kann.

Zwei Annahmen werden hier getroffen:
  1. 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.
  2. 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.

Beispielrechnung 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: 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

Messung eines ATtiny13A Messung bei 4,585V Pulsweite bei 4,585V 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

Schaltbild zum Messen der Schaltschwellen eines ATtiny24(A) 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).

LCD-Anzeige der Messergebnisse 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.

Zum Seitenfang


©2021 by http://www.avr-asm-tutorial.net