Analog-Komparator Atmega48 - Verhalten bei sehr kleiner Differenz

OP #2047164
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:
1
.include "m48def.inc"
2

3
.equ led_gn = 7
4
.equ led_rd = 6
5

6
.org 0x000      ;Reset
7
rjmp main
8
.org 0x017      ;Analog Comparator
9
rjmp AC_handler    
10

11
main:
12

13
ldi     r16, low(RAMEND)            ; Stackpointer
14
out     SPL, r16                    
15
ldi     r16, high(RAMEND)
16
out     SPH, r16  
17

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

21
;----Abfrage des Zustandes beim Einschalten----
22

23
in r16, ACSR
24
sbrc r16, ACO
25
sbi PortB, led_rd
26
sbrs r16, ACO
27
sbi PortB, led_gn
28

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

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

36
sei
37

38
loop:
39
rjmp loop
40

41

42
AC_handler:
43
cbi PortB, led_rd
44
cbi PortB, led_gn
45
in r16, ACSR
46
sbrc r16, ACO
47
sbi PortB, led_rd
48
sbrs r16, ACO
49
sbi PortB, led_gn
50
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
#2051460
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.
#2051634
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
Gast #2051662
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.
OP #2052600
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren