Forum: Projekte & Code ATmega ADC Test


von Branko Golubovic (Gast)


Angehängte Dateien:

Lesenswert?

Das Programm testet Messchwankungen bei konstanter Spannung an ADC0 und
ADC1 Eingang.
Das Programm misst 1000mal gewählte Analog Eingang und bei jeder
abgeschlossenen ADC Konversion aktuelisiert Häufigkeitstabelle.
Messresultat wird uber Serielle Schnittstelle(9600,8,N,1)an
Terminalprogramm Übertragen.
Ich habe von meiner einseitigen Platine mit ATmega32 erstaunlich
gute Ergebnisse erreicht.
Sogar bei 200-facher Verstärkung bleibt Offset in +-1LSB(50µV)
Gränzen.
Messresultat bleibt apsolut Stabil bei Single Ended und
Differential Eingag bei 1 und 10-facher Verstärkung.
Erst bei 200-facher Vestärkung sind Messschwankungen +-5LSB,was sich
mit Aufsummierung von 16 Messresultaten beseitigen kann.

von jozi59 (Gast)


Lesenswert?

Die Beobachtungen kann ich nur bestätigen. Wenn ich das mit einen
SAB80C515 vergleiche, sind die AVR ADCs super.

von Norbert Lukoski (Gast)


Angehängte Dateien:

Lesenswert?

Hallo. Hab ein kleines Problem. Arbeite zum ersten mal mit dem AVR
Atmega8 und möchte über den ADC0 Eingang eine Spannung einlesen und
über 7-SegmentAnzeige ausgeben lassen. Spannung kommt am Eingang an und
ich denke das der ADC im frei laufenden Betrrieb läuft, aber er spuckt
komische Zahlen auf der Anzeige aus. Meine MEinung ist, dass es an der
Ergebnisroutine liegt. Wenn wir in meine VAriable "value" einen Wert
definieren rechnet er den entsprechenden Wert aus und gitb ihn auch
richtig auf der Anzeige aus. Aber wenn er sich die Werte über den
Eingang ADC0 holen soll und diese dann in ADCL und ADCH reinschreibt
kommt nur Null raus. Kannst du mir vielleicht helfen?

von Profi (Gast)


Lesenswert?

Versuch doch mal, den Wert ADCL direkt auf ein Port auszugeben.

 value=ADCL;            //Read 8 low bits first (important)
 value|=((int)ADCH << 8); //read 2 high bits and shift into top byte

 PORTD=ADCL;
 wenn Du ein zweites Port freihast, kannst Du da HighByte auch noch
ausgeben (muss nicht sein):
 PORTx=ADCH;
Jetzt siehst Du direkt, was der ADC liefert.
Was hängt denn an PortD? ein Siebensegment?
Dann kommen mir aber die "case-Tabellen"werte komisch vor.

Nebenbei, so geht es eleganter:

char
bitmuster[10]={0x00,0x01,0x10,0x11,0x08,0x09,0x18,0x19,0x02,0x03};

void ausgabe (int x)
{
  PORTD=bitmuster[x];
}

Doch wehe, wenn x nicht im Bereich 0..9 liegt, dann gibt's
random-Ergebnisse.
Wenn Sicherheit eine Rolle spielt, doch besser:
  if (x>=0 && x<=9) {PORTD=bitmuster[x];}

Wenn x statt   int   ein   unsigned int   ist, reicht auch:
  if (x<=9) {PORTD=bitmuster[x];}
da x dann nicht negativ sein kann.


Zum Debuggen immer Systematisch aufteilen. zuerst Anzeige sicherstellen
(zum Test z.B. mit einer Schleife 0..1000 anzeigen, dann ADC-Handler
angehen.

von Simon K. (simon) Benutzerseite


Lesenswert?

übrigens funktioniert auch
unsigned integer bla = ADC;

von Frederik (Gast)


Lesenswert?

Wollte das Programm testen. Da ich bisher nur mit Assembler programmiert
habe, weiss ich nicht, was ich mit den verschiedenen Dateien anzufangen
habe.

mein Controller: Atmega16
Software: AVR Studio 3.55
zum überspielen: PonyProg2000

Habe bisher ein neues Projekt erstellt, (c-files und h-files eingefügt,
was ist mit den anderen Dateien aus dem zip-file (ADCTEST.zip)? Geht das
alles überhaupt?)

Wäre nett, wenn mir hier jemand weiterhelfen könnte

Gruss, Frederik

von Branko Golubovic (Gast)


Lesenswert?

@Frederik

1: WinAVR-20050214 Download
http://sourceforge.net/project/showfiles.php?group_id=68108

2: WinAVR installieren

3: ADCTEST.zip auspacken in z.B. .../WinAVR/Projekte/ADCtest

4: WinAVR(PN.exe) starten

5: Dataien öffnen

6: in makefile MCU  auf MCU = ATmega16 endern

7: make all

8: main.hex überspielen

Branko

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.