Forum: Mikrocontroller und Digitale Elektronik Hilfe zu AD Wandler 3fache Messung


von tasso (Gast)


Angehängte Dateien:

Lesenswert?

Hallo liebe Community,

ich bin neu hier, habe mit µC nicht soviel Erfahrung und komme mit 
meinem Programm nicht weiter:( Verwende einen ATMEGA8.

Das Programm soll folgendes machen:

Eine Spannung messen und an zwei 7-Segment-LED-Anzeigen wiedergeben. 
Dieses funktioniert auch...

Als Zusatzfunktion soll der µC eine Spannung am ADC3 Kanal messen und 
z.B. mit einem anderen Kanal es vergleichen.
Am ADC3 Kanal kommt von meinem Temp.Sensor eine DC Spannung (ca. 2,2V 
bei Umgebungstemp.)
Ich möchte dem µC sagen dass, wenn die Spannung am ADC3 eine bestimmte 
Schwelle erreicht hat, soll er am PinC4 auf High bzw. Low schalten.
Wie kann ich es am einfachsten programmieren?

Wäre echt nett wenn Ihr mir Helfen könntet.

Vielen Dank im Voraus
mfg tasso

von spess53 (Gast)


Lesenswert?

Hi

>Wie kann ich es am einfachsten programmieren?

Mit dem Analogkomparator.

MfG Spess

von Sven B. (scummos)


Lesenswert?

C-Quelltext hat die Endung .c, nicht .txt.

Du brauchst eine Schleife, die periodisch ADC-Werte aufnimmt und immer 
schaut ob der interessante Wert überschritten wurde. Sowas wie 
Interrupts für bestimmte ADC-Pegel können die meisten uCs eher incht.

von Tasso (Gast)


Lesenswert?

Ja ich weis hab das programm einfach in einer txt datei kopiert. Ich 
probier es mal mit dem Analog Komparator. Der 2. adc ist doch in der 
schleife oder? (While). Ich hab irgendwo einen Fehler in meinem 
Quellcode. Wenn ich es jetzt mit dem Ad Komparator mache dann brauche 
ich quasi nur einen adc wert auslesen und den dann mit dem ad komparator 
vergleichen oder?

von Ingo Less (Gast)


Lesenswert?

Ich würde dafür den ADC und nicht den analog Comparator verwenden, da 
biste viel flexibler was Schaltschwelle und Hysterese angeht...

von Tasso (Gast)


Lesenswert?

Ja habe auch grad gesehen die zwei pins für den komparator sind schon 
belegt. Könntet ihr mir sagen wo mein fehler ist in meinem Programm? Ab 
der Temperaturmessung funktioniert es nicht richtig. :(

von tasso (Gast)


Lesenswert?

ADMUX = 0x03;        // Kanal wählen(ADC3)
    ADMUX |= (1<<REFS0) | (1<<REFS1); // interne Referenzspg. 2,56V
    temp=0;

    ADCSRA |= (1<<ADSC);    // eine ADC-Wandlung
    while ( ADCSRA & (1<<ADSC) );   // auf Abschluss der Konvertierung 
warten
    temp += ADCW;  //Gemessenen Wert aus ADCW auslesen

    // Vergleichspannung am ADC6 messen
    ADMUX = 0x06;      // Kanal wählen(ADC6)
    ADMUX |= (1<<REFS0) | (1<<REFS1); // interne Referenzspg. 2,56V
    vergleich=0;

    ADCSRA |= (1<<ADSC);    // eine ADC-Wandlung
    while ( ADCSRA & (1<<ADSC) );   // auf Abschluss der Konvertierung 
warten
    vergleich += ADCW;  //Gemessenen Wert aus ADCW auslesen

    if (temp > vergleich)
    {
    PORTC = (1<<PC4);
    }
    else
    {
    PORTC = (0<<PC4);
    }

Dieser Programmauschnitt funktioniert nicht :( Muss ich den ADC 
zwischendurch immerwieder deaktivieren? da sonst der gemessene Wert 
nicht stimmt?

von W.A. (Gast)


Lesenswert?

Tasso schrieb:
> Könntet ihr mir sagen wo mein fehler ist in meinem Programm?

Das Programm wird richtig sein - deine Erwartungshaltung wird falsch 
sein, weil du etwas anderes programmiert hast.

Tasso schrieb:
> Ab der Temperaturmessung funktioniert es nicht richtig. :(

Ich habe selten eine so "klare" Fehlerbeschreibung gesehen.

von Tasso (Gast)


Lesenswert?

Also ich messe direkt am Mikrocontroller die Spannung und es tut sich 
nichts egal wierum ich es programmier. Also normal sollte am PC4 ein 
High Pegel stehen, tuts aber nicht bleibt immer auf 0.

von W.A. (Gast)


Lesenswert?

Tasso schrieb:
> Also normal sollte am PC4 ein High Pegel stehen, tuts aber nicht
> bleibt immer auf 0.

Einer Blackbox mit nur einem Bit Ausgangsinformation ist nur schwer 
anzusehen, was tief in ihrem Inneren vor bzw. schief geht. Bevor du den 
Vergleich machst, solltest du erstmal gucken, was du vergleichst und dir 
dabei sicher sein, dass die Werte auch dein Eingangssignal abbilden. 
Vielleicht hat der Analogteil vor dem ADC nach der Kanalumschaltung 
nicht genug Zeit, um dem Signalpegel zu folgen. Das hängt von deinem 
restlichen Programm und der Hardware ab.

Warum schraubst du eigentlich immer an der Referenzspannungswahl rum?

von Tasso (Gast)


Lesenswert?

Ich möchte schauen ob mein Programm läuft darum spiel ich bissle rum. 
Ich weis das später die schwelle bei ca. 3V liegen muss.

von W.A. (Gast)


Lesenswert?

Tasso schrieb:
> Ich möchte schauen ob mein Programm läuft darum spiel ich bissle rum.

Das tut es nicht. Blindes Rumspielen überlässt das Ergebnis dem Zufall.

von M. W. (rallini94)


Lesenswert?

Bei mir gab es schon Probleme, weil ich die Umrechnung des ADC Wertes 
falsch erledig habe bzw. in flascher Reihenfolge die Register ausgelesen 
habe. Dann wird der Wert nicht mehr aktualisiert und deine Abfrage 
ergibt immer false. Im Datenblatt steht explizit

"When an ADC conversion is complete, the result is found in these two 
registers.
When ADCL is read, the ADC Data Register is not updated until ADCH is 
read. Consequently, if the result is left adjusted and no more than 
8-bit precision is required, >it is sufficient to read ADCH. Otherwise, 
ADCL must be read first, then ADCH"

Ich weiß jetzt nicht, wie das dein ADCW macht, aber versuch mal die 
Register einzeln hintereinander auszulesen. Bei mir hats geholfen

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.