Forum: Mikrocontroller und Digitale Elektronik ADC hat keine Lust zu funktionieren


von Heinz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

ich bräuchte Hilfe bei dem ADC. Das Eingangssignal wird mit der 
abtastFrequenz abgetastet und soll als PWM ausgegeben werden.


Die PWM funktioniert. Die ADC Messung scheint auch zu funktionieren, da 
der ADC Interrupt ausgelöst wird. Leider hat die PWM immer einen hohen 
Wert (an LED per Auge "gemessen") unabhängig von der Eingangsspannung.


Die Eingangsspannung geht auf C0 (ADC0) des ATmega8.


Wäre nett wenn jemand den Quellcode mal überfliegen könnte.


Vielen Dank.


Heinz

von kbuchegg (Gast)


Lesenswert?

Du solltest in dein Programm noch die Endlosschleife

while( 1 )
  ;

mit aufnehmen.

Ich hab keine Ahnung was der gcc-Startupcode macht, wenn main zu ihm 
zurückkehrt.

von Heinz (Gast)


Lesenswert?

while(1); ist doch in der main Funktion vorhanden.

Habe vergessen zu erwähnen, dass der Atmel wie im Tutorial beschaltet 
ist (interne Referenzspannung).

http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC#Interne_Referenzspannung



Sowohl die Eingangsspannung an C0 als auch die Spannungen VCC AVCC und 
AREF habe ich nachgemessen und haben die richtigen Werte.

von PJ (Gast)


Lesenswert?

Wenn ich mich richtig erinnere, läuft der Prozesser auf einem Sprung auf 
sich selbst auf, wenn die main() {} verlassen wird. Sonst ist da ja nix.

von Karl H. (kbuchegg)


Lesenswert?

Heinz wrote:
> while(1); ist doch in der main Funktion vorhanden.
>

Tschuldigung. Mein Fehler.
Hab im Code nach unten gescrollt und am Ende der letzten Funktion die 
Schleife vermisst. Hab nur nicht geschnallt, dass das gar nicht die 
main() ist, sondern eine init().

von Heinz (Gast)


Lesenswert?

Kein Problem.


Bin leider immer noch nicht schlauer und PJs Beitrag verstehe ich nicht 
so ganz. Die Hardware ist denke ich korekt. Es wird wohl vielleicht eine 
Einstellung im Register fehlen?

von Karl H. (kbuchegg)


Lesenswert?

Teste die Komponenten mal einzeln.

1) Hast du eine Möglichkeit ADCH auszugeben und dir die Werte anzusehen?

2) Lass die PWM mal nicht über den ADC Interrupt laufen,
   sondern weise im main() einfach mal ein paar Werte an OCR2 zu und
   sieh nach, ob der Ausgang reagiert.

Erst mal das Subsystem identifizieren, welches nicht funktioniert, dann 
muss man nicht alles nach der fehlenden Einstellung absuchen.

von spess53 (Gast)


Lesenswert?

Hi

Könnte es sein, das dein ADC wesentlich zu schnell läuft. Ich sehe keine 
Prescalereinstellungen.

MfG Spess

von Heinz (Gast)


Lesenswert?

Erstmal danke für deine Hilfe.

Zu 1: Ich hab zwar eine 4 Stellige 7 Segment Anzeige hier allerdings 
halte ich das für zu aufwendig (Programmcode schreiben um die 7 Segmente 
anzusteuert...)


Zu 2: Ich habe die PWM und den ADC Interrupt durch folgenden Code im 
Interrupt getestet:

int i=0;

ISR(ADC_vect)
{
    if(i==0)
    {
        OCR2=0;
    } else
    OCR2=255;
    i++;
    if(i==2) i=0;
}


Dies bei einer Abtastfrequenz von 1 Hz. Hat alles funktioniert.


Im ADCH steht somit wohl immer ein hoher Wert drin.


@ Spess53


Jop. Das wirds wohl sein. Ich probiers mal aus. Danke.

von Heinz (Gast)


Lesenswert?

Jo geht jetzt. Danke nochmal.

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.