Das ist der Code meines LM335... Zuerst habe ich nur den ADC eingelesn, das ging prima. Aber dann soll er es in Temperatur umrechnenCode://---------------------------------------------------------------------- #define F_CPU 3686400 // Taktfrequenz des myAVR-Boards #include <avr\io.h> // AVR Register und Konstantendefinitionen #include <inttypes.h> //---------------------------------------------------------------------- uint16_t readADC(uint8_t channel) { uint8_t i; uint16_t result = 0; ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1); //ADEN = ADC Enable ADMUX = channel; //Kanal wählen; REFs0+1 -> interne Referenz 2,56V verwenden, REFS1 gibt es bei Attiny13 nicht //Dummy-Readout (unten), misst 1* Ergebnis, wird nicht gespeichert ADCSRA = ADCSRA | (1<<ADSC); // Schaltet bei ADCSRA das ADSC-Bit ein, d.h. Messung starten while(ADCSRA & (1<<ADSC)); //Warte bis Messvorgang vorbei ist // Nun 3* Spannung auslesen, Durchschnittswert ausrechnen for (i=0; i<3; i++) { // Schleife, startet 3* ADCSRA = ADCSRA |(1<<ADSC); // Einmal messen while(ADCSRA & (1<<ADSC)); //Warte bis Messung vorbei result = result + ADCW; // Resultate zusammenzählen (R1+R2+R3) -> später alles /3 } ADCSRA = ADCSRA & (~(1<<ADEN)); //ADC wieder deaktivieren result=result/3; // Durchschnittswert return result; } main () { int spannung, einer,zehner, komma, temperatur=0; DDRB=0b00001111; while (true) { PORTB=PORTB|(1<<PB1); waitMs(50); PORTB=PORTB&(~(1<<PB1)); waitMs(50); uint16_t result = readADC(2); spannung=(result*2978)/100; temperatur=(spannung-20000); zehner=(temperatur)/100; einer=(temperatur-100*zehner)/10; komma=(temperatur-100*zehner-10*einer); for (int k=0;k<zehner;k++) { PORTB=PORTB|(1<<PB2); waitMs(100); PORTB=PORTB&(~(1<<PB2)); waitMs(100); } for (int h=0;h<einer;h++) { PORTB=PORTB|(1<<PB1); waitMs(100); PORTB=PORTB&(~(1<<PB1)); waitMs(100); } for (int g=0;g<komma;g++) { PORTB=PORTB|(1<<PB0); waitMs(100); PORTB=PORTB&(~(1<<PB0)); waitMs(100); } waitMs(1100); } return 0; }
(Wenn Spannung = 2019mV, dann sind es 19 °C also d=-2000)
Und jetzt macht er nur den ersten Blink-Befehl in der while schleife, dann wartet er und macht ihn wieder....
Teiler habe ich keine Ahnung...Der erste Punkt Wegen der Schwankungen wäre es die Schaltung und das Programm auf grobe Fehler zu untersuchen. D.h.
- stimmt der Teiler für den AD-takt: so etwa 50 - 250 kHz sollte es sein
- genug ( > 100 µs) Zeit nach dem Einschalten der Referenz, wenn die interne Ref. genutz wird ?
- sind Abblockkondensatoren an GND-VCC und AGND-AVCC vorhanden ?
- sind GND und AGND sovie VCC und VCC angeschlossen ?
- Stimmt die Ref. Spannung (unter 2 V bzw. 1 V) sind je nach µC nicht gut
Wenn der Sensor extern per langem Kabel verbunden ist, kann ein Kondensator (ca. 100 nF) parallel zum Sensor helfen HF Einkopplungen abzuschwächen. Gegen 50 Hz hilft das aber nicht viel.
Wenn es 50 Hz Einkopplungen sind, hilft es ein paar (z.B: 100) Werte zu mitteln, am besten über eine Zeit die ein vielfaches von 20 ms ist.
Muss ich gleich mal nachschauen, aber da er aus einem Demoprogramm stammt...
Nachdem ixch die interne Referenz eingeschaltet habe, wartet er nicht, sondern startet gleich. Allerdings ist dies eine Dummy-Messung.
Das passt dann doch?
AVCC gibt es beim ATtiny13 gar nicht. Kondensator hängt keiner dran... Soll ich zwischen VCC und GND einen Keramikkondensator einbauen?
Referenz ist intern 1,1V beim Widerstandsmesser, das solte also stimmen
Mit einem längerem Kabel ist er übrigens auch nicht verbunden....
Leider beherrsche ich noch kein UART, das geht somit erst späterAls test für die Art der Störungen wäre ein Testprogramm geeigent, dass erstmal etwa 100 Werte in RAM schreibt, und die dann zum PC sendet. An den Werten kann man dann meist sehen was man für Störungen hat.![]()







Zitieren
Lesezeichen