Hilfe zu AD Wandler 3fache Messung

Gast #4504010
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
Angehängte Dateien:
Gast #4504197
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?
Gast #4504213
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. :(
Gast #4504236
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?
Gast #4504290
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?
#4504368
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

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