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


von Marco B. (marco-b)


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

von Marco B. (marco-b)


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

von Frank (Gast)


Lesenswert?

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

von Marco B. (marco-b)


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.

von Benjamin S. (recycler)


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.

von Peter D. (peda)


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

von Frank (Gast)


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.

von Marco B. (marco-b)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.