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