Hilfe zu AD Wandler 3fache Messung

Gast #4504010
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:
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.
Gast
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
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
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
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.
Gast
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.
Gast
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?
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

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.