AD-Wandler + Portfunktionen bei Atmega8 verwenden

OP #691594
Lesenswert?
• ▲
▼
Hallo Allerseits!

Ich habe gerade folgendes Problem: Ich will am Kanal 0 (PC0) des ADU 
eine Spannung einlesen. Soweit funktioniert das Ganze. Nur habe ich am 
PORTC, welchen auch der ADU verwendet, bei PC4 und PC5 zwei Relais, 
angesteuert mit zwei FET's, hängen.

Setze ich nun bei DDRC DDC4 und DDC5, also Relais als OUT, so bekomme 
ich vom Wandler total unsinnige Werte. Und das für mich seltsamste, die 
Spannung an PC0 steigt auf etwa 1,4V circa.

Kann ich eignetlich den ADU und die anderen freien I/O Pins in der 
selben Schaltung nutzen? Wenn nein, brauche ich nicht mehr lange 
Programmfehler suchen...im DB habe ich nichts treffendes gefunden

Vielen Dank!
Philipp
OP #691634
Lesenswert?
• ▲
▼
Also:

Avcc hängt mit einer Spule zu 10µH auf 5V, Aref ebenfalls, dazu noch ein 
100nF Ker.Kond auf Masse. Laut DB sind PC0 -> ADC0 PC1 -> ADC1 ... PC4 
-> ADC4/SDA PC5 -> ADC5/SCL

Die Relais schalten tadellos ein und aus; nur sobald es schaltet spinnt 
der ADC.

Werde nachher mal probieren das Gate vom FET vom µC zu trennen, schauen 
was dann passiert.
Gast #691644
Lesenswert?
• ▲
▼
Hi

Datenblatt S.202

4. If any ADC [3..0] port pins are used as digital outputs, it is 
essential that these do not switch while a conversion is in progress. 
However, using the Two-wire Interface (ADC4 and ADC5) will only affect 
the conversion on ADC4 and ADC5 and not the
other ADC channels.

Noch Fragen?

MfG Spess
OP #691660
Lesenswert?
• ▲
▼
Die Wandlung mache ich in einem Unterprogramm.

Auszug aus dem Hauptprogramm, wo der ADU abgefragt wird:
...
if(takt==0)
{  takt=RELOAD;
   zeit_gesamt--;
   if(zeit_gesamt==0)
   {    cli();
        //PUMPE_AUS;
        //HEIZUNG_AUS;
  PORTC&=~(1<<PC4);
  PORTC&=~(1<<PC5);

  takt=RELOAD;
  hh_menue   = hh_read;
  mm_menue   = mm_read;
  ss_menue   = ss_read;
  zeit_gesamt = hh_menue*3600 + mm_menue*60 + ss_menue;
  startbit=0;
  lcd_cls();
  break;
    }

    temp_in = (int)(CONST_TEMP*ADU_ch(ANALOGIN_KANAL));   //Kanal 0

    if( (temp_in < aetztemp-HYSTERESE)&&bit_heiz==0)
    {  PORTC|=(1<<PC4);
        bit_heiz=1;
  //HEIZUNG_EIN;
    }
    if( (temp_in > aetztemp+HYSTERESE) &&bit_heiz==1)
    {  PORTC&=~(1<<PC4);
        bit_heiz=0;
  //HEIZUNG_AUS;
    }
...

Auszug aus dem UP zur Wandlung:

int ADU_ch(unsigned char mux)
{   char i;    //Indexvariable
    int result =0;  //Ergebnis

    ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1);  //Wandler
                                                   //einschalten,125kHz
    ADMUX = mux;                   //Gewünschter Kanal
    ADCSRA |= (1<<ADSC);      //Wandlung starten (single
                                                //step)
    while (ADCSRA & (1<<ADSC));      //Warten bis Wandlung
                                                //abgeschlossen
    for (i=0; i<4; i++)        //4 Wandlungen
    {  ADCSRA |= (1<<ADSC);      //Wandlung starten (single
                                                //step)
  while (ADCSRA & (1<<ADSC));          //Warten bis Wandlung
                                                //abgeschlossen
  result += ADCW;        //Ergebnisse aufsummieren
     }
     ADCSRA &= ~(1<<ADEN);      //Wandler wieder
                                                //ausschalten
     result /=4;        //Mittelwert
     return result;        //Rückgabewert
}

Habe auch schon versucht die Timer-Ints im UP zu deaktivieren und am 
Ende wieder zu aktivieren, hat aber nix gebracht.
Aber kaum kommentiere ich den Befehl zu setzten des DDRC aus, geht der 
Wandler normal, so wie er sollte!

So, jatzt gehe ich mal schnell die Gates trennen, schun wasser da sagt

grüße
philipp
OP #691679
Lesenswert?
• ▲
▼
So, jetzt bin ich noch etwas ratloser.

Trenne ich die Gates vom µC, lasse aber den DDRC so, wie er sein sollte 
mit PC4 und 5 als OUT, so gehts.

Schalte ich nun irgendwann während der Programmlaufzeit das Gate an den 
gesetzten µC PC4 oder 5, dann geht die Spannung am Eingang des ADU 
aufwärts.

Kann es sein, dass ich vom Port zu viel Strom ziehe? dass er deswegen 
spinnt?
Anbei auch der Schaltplan, die Relais hängen aber nicht wie gezeichnet 
auf 5v sondern auf 12V

Hoffe mir kann jemand helfen, ich hab keine Idee mehr, warum das Zeug 
nicht funkt!

philipp
Angehängte Dateien:
OP #691873
Lesenswert?
• ▲
▼
So, habe gerade nochmals probiert, und kam zu folgendem Ergebniss:

Nehme ich 12V von einem externen Netzteil, um die Relais zu schalten, 
bleibt die Spannung am PC0 so wie sie soll.

Ursprünglich habe ich die Spannung, welche im Schaltplan mit 9V 
bezeichnet wurde als Schaltspannung fürs Relais hergenommen. Die habe 
ich gemessen, sie lag bei 13V. Die Relais brauchen 12V, also müsste das 
ja klappen

Der Trafo hat aber nur 6VA, ja ja im nachhinen hätti iach ihn auch auf 
20VA dimensioniert, desshalb wird warscheinlich die Spannung 
zusammensinken. Sinken, wohlgemerkt, weil das Teil hinter dem 
Gleichrichter im geschalteten Zustand immer noch 11,8V lieferte.

Jedenfalls werde ich jetzt sicher eine Trafo größerer Leistung und vor 
allem höherer Nennspannung einbauen; Lieber ein paar Watt an den 
Spannungsreglern verbraten, als den ganzen Tag soch dumme Fehler zu 
suchen!

So, vielen Dank nochmals an alle, jedenfalls weiß ich jetzt, dass ich 
den PORT und den ADC in der selben Schaltung verwenden kann. Ist ja 
immerhin auch was...

PS. Die Schaltung für die Konstanstromquelle ist nicht aktuell. Der 
317er hat eine Begrenzung, was den Einstell-Widerstand betrifft.

Grüße
Philipp

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