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
Die AD kanaele sollte unabhaengig sein. Welches sind den die anderen Funktionalitaeten am PortC ? Allenfalls bestehen Abhaengikeiten. zB muss ARef irgendwo sein.
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.
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
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
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
Hast du schon mal die Spannung an den Pins im beschalteten und im unbeschalteten Zustand gemessen?
Es kann sein das sich AREF verschiebt, deine GND-Leitung ungünstig liegt und sich dadurch das Potential verschiebt usw. Also von einem fixen GND-Punkt, vielleicht beim Spannungsregler, die Spannungen in beiden Fällen messsen.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.