mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Analog-Komparator Atmega48 - Verhalten bei sehr kleiner Differenz


Autor: Marco B. (marco-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Bin ziemlich neu in der Mikrocontrollerprogrammierung und bin gerade 
dabei, das Verhalten des Analogkomparators beim Atmega48 mit Hilfe einer 
einfachen Schaltung zu studieren.
Und dabei stoße ich schon auf mir eigentlich unerklärliche Dinge.

Ich habe auf der Schaltung einen Spannungsteiler, welcher mir meine 
Betriebsspannung von ca. 10V auf etwa 3V runter teilt, parallel zu R2 
befindet sich ein 100nF-Kondensator.
Diese Spannung liegt am nicht-invertierenden Eingang des Komparators an.

Der mega wird von einem 7805 versorgt. Am invertierenden Eingang habe 
ich einen 47K Poti angeschlossen, der zwischen VCC und GND die Spannung 
einstellt.

Am PortB befinden sich zwei LED, eine rote an PB6, eine grüne an PB7, 
mit denen ich den Ausgang des Komparators anzeigen möchte.

Das realisiert der folgende Quelltext:
.include "m48def.inc"

.equ led_gn = 7
.equ led_rd = 6

.org 0x000      ;Reset
rjmp main
.org 0x017      ;Analog Comparator
rjmp AC_handler    

main:

ldi     r16, low(RAMEND)            ; Stackpointer
out     SPL, r16                    
ldi     r16, high(RAMEND)
out     SPH, r16  

ldi     r16, (1<<led_gn) | (1<<led_rd)
out     DDRB, r16  

;----Abfrage des Zustandes beim Einschalten----

in r16, ACSR
sbrc r16, ACO
sbi PortB, led_rd
sbrs r16, ACO
sbi PortB, led_gn

ldi r16, (1<<ACI)    ;Interrupt-Flag rücksetzen
out ACSR, r16

in r16, ACSR
sbr r16, (1<<ACIE)
out ACSR, r16     ;Interrupt bei Ausgangsänderung aktivieren  

sei

loop:
rjmp loop


AC_handler:
cbi PortB, led_rd
cbi PortB, led_gn
in r16, ACSR
sbrc r16, ACO
sbi PortB, led_rd
sbrs r16, ACO
sbi PortB, led_gn
reti


Nun der Teil den ich nicht verstehe:
Wenn an beiden Komparatoreingängen annähernd die gleiche Spannung 
anliegt, leuchten beide LEDs. In der näheren Umgebung wird die eine 
dunkler, die andere etwas heller. Erst ab einer gewissen Differenz ist 
tatsächlich nur eine an.

Habe mal mit dem Oszi die Ausgänge für die LEDs beobachtet, und wie 
erwartet dort eine Art PWM gesehen.

Mein erster Gedanke war, dass evtl. die Spannung am nicht-invertierenden 
Eingang schuld sein könnte, weil ich die Betriebsspannung von einem 
PWM-Netzgerät bekomme, aber als ich auch diese mit dem Oszi beobachtet 
habe war diese glatt wie die See.

Nun zum einen die Frage, warum sich der Komparator so verhält.
Und zum anderen wie man das beheben oder umgehen kann, da ich für 
weitere Anwendungen nur ein einziges Mal eine Ausgangsänderung des 
Komparators beim Nulldurchgang haben möchte.

Danke schon mal im Vorraus

Autor: Marco B. (marco-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hoffe jemand kann mir eine Antwort auf das Problem geben.

Ich weiß nicht an welcher Stelle ich nen Denkfehler drin habe oder ob 
das Problem elektrisch ist.

Gruß
Marco

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In Deinem AC_HANDLER Wird SREG nicht gesichert; auch R16 nicht. Grober 
Fehler!

Autor: Marco B. (marco-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, da gehe ich mit wenn es ein größeres Programm ist. Hab es jetzt 
mal versuchsweise reinprogrammiert, aber es ändert an dem Problem nix.

Da ich sowieso keine Register weiter benutze und keine Berechnungen 
anstelle war das eigentlich zu erwarten.

Autor: Benjamin S. (recycler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würd sagen, da strahlt was ein. 50 Hertz sind da immer dabei. Ist 
dein Oszi auch über AC angekoppelt? Ist deine Versorgungsspannung sauber 
entkoppelt?
Ich würde hier lieber mit Schmitt-Trigger arbeiten bzw. das Verhalten in 
den µC reinprogrammieren, genau aus dem Grund, weil Bits schnell mal 
kippen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Komparator hat eine hohe Verstärkung wie ein Operationsverstärker.
D.h. sind beide Eingänge gleich, reichen wenige µV zum Umkippen, also 
irgendwelche Störungen.
Deshalb macht man üblicher Weise eine positive Rückkopplung, um eine 
Hysterese zu erreichen, z.B. über einen Widerstand von einem 
Ausgangspin.

Wenns nicht unbedingt sauschnell sein muß, nimmt man besser den ADC und 
macht die Hysterese in SW.


Peter

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco B. schrieb:
> Hab es jetzt
> mal versuchsweise reinprogrammiert, aber es ändert an dem Problem nix.

Das ändert zunächst einmal den Eindruck, den ein Dritter vom Code 
bekommt. Schlechten Code sehe ich mir erst garnicht weiter an.

Damit immer nur eine LED leuchtet, mußt Du nur einen Vergleich machen.

ACO == 0 dann Rot ein und Grün aus
andernfalls   Grün ein und Rot aus.
Oder umgekehrt.

Autor: Marco B. (marco-b)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Okay, war eigentlich auch meine Vermutung, dass da noch Störfrequenzen 
drauf gehen. War mir nur nicht sicher ob ich nicht einfach in der 
Programmierung grobe Fehler mache.
Werde mir das ganze noch mal auf nem anderen Oszi anschauen, mein Hameg 
HM 312 ist nicht mehr ganz das Beste.

Möchte nicht unbedingt das ganze extern aufbauen, da ich auch noch den 
Mux des atmega benötige um verschiedene Pins auf den Analog-Komparator 
zu schalten. Aber die Möglichkeit eine Hysterese über eine Rückkopplung 
aufzubauen bietet sich an. Werde dies mal in den nächsten Tagen 
versuchen.

@Frank:
Über Programmierstil lässt sich bekanntlich streiten. Aber schön dass 
wir uns hier auch über solche Dinge unterhalten können.
Ich hoffe du vergibst mir meinen schlechten Stil, denn
>Bin ziemlich neu in der Mikrocontrollerprogrammierung

@alle
Vielen Dank erstmal

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.