Code:
//----------------------------------------------------------------------
#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;
}
Das ist der Code meines LM335... Zuerst habe ich nur den ADC eingelesn, das ging prima. Aber dann soll er es in Temperatur umrechnen
(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....
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.
Teiler habe ich keine Ahnung...
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....
Als 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.
Leider beherrsche ich noch kein UART, das geht somit erst später
Lesezeichen