Forum: Compiler & IDEs Probleme mit ADC Bin am Verzweifeln(Werte stimmen nicht pt100)


von Kevin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich hab ein Problem und zwar bekomme ich bei meiner Umrechnung öfters 
sehr merkwürdige Ergebnisse bei der Umwandlung des ADC. Wenn 
Zimmertemperatur dann zeigt die Umrechnung 8 Grad oder irgend welche 
Werte die nicht stimmen. Wenn ich die Funktion jetzt ein paar mal 
aufrufen dann erscheind irgendwann das richtige Ergebnis, danach wieder 
das gleiche Problem. Hatte auch schon Tage da hatte ich genau mit dem 
gleichen Code kein Problem.
Wenn ich das Programm auf den Atmega8 neu übertrage dann lüpt es.

Atmega8 MyAvrMK2 Board mit externen quarz 3686400 hz

Spannungsteiler 250 Ohm Widerstand und Pt100 gemessen




Info:
1
void ADC_Init() 
2
{
3
 
4
  uint16_t ergebnis;
5
    ADMUX |= (1<<REFS1) | (1<<REFS0);              // interne Referenzspannung nutzen
6
    ADCSRA |= (0<ADPS1) | (1<<ADPS2) | (1<<ADPS0);       // Frequenzvorteiler
7
    ADCSRA = (1<<ADEN);                         // ADC aktivieren
8
 
9
     //----------Dummylauf---------------------
10
  
11
  //  ADMUX |= (1<<ADLAR);////////////neu/////
12
    ADCSRA |= (1<<ADSC);                          // eine ADC-Wandlung 
13
    while (ADCSRA & (1<<ADSC) ) {}                // auf Abschluss der Konvertierung warten
14
    ergebnis = ADCL;////////////////////////neu/
15
  ergebnis |= (ADCH<<8);
16
  
17
}
18
19
20
/*------------ADC Einzelmessung----------------------- */
21
float ADC_Read()
22
{
23
  uint16_t ergebnis ;
24
//uint16_t ergebnis2;
25
26
  ADCSRA |= (1<<ADSC);                     // eine Wandlung "single modus"
27
    while (ADCSRA & (1<<ADSC) ) {}           // auf Abschluss der Konvertierung warten
28
    ergebnis = ADCL;/////////////neu 
29
  ergebnis |= (ADCH<<8);////////////////neu; 
30
31
  return ergebnis;  ////////////neu                    // ADC auslesen und zurückgeben
32
}
33
34
35
//-------------Umrechnen in Temperatur-----------------------------------------------
36
37
//MinT.  0°C   = 100 Ohm 
38
//MaxT.219°C  = 182,5 Ohm
39
// Bei 1°C unterschied = 82,5/219 = 0,3783105 Ohm
40
41
42
//--------------Berechnung pt100 Wiederstand----------------
43
void Temperatur(int t) 
44
{
45
  float sensor  = t;                // Wert zwischenspeichern
46
  float U_PT100   = sensor * 2.56 /1023.0;      // Spannung vom PT100 errechnen
47
  float U250     = 4.79 - U_PT100 ;          // I = U / R
48
  float I_PT100   = U250 / 250.0;       
49
  float R_PT100   = U_PT100 / I_PT100;        // Wiederstand vom PT100  
50
   R_PT100   = R_PT100 - 1.0;            // Leitungswiderstand
51
52
//--------------Berechnung Temperatur-----------------------
53
  float grad ;
54
  if (R_PT100 < 182.5)
55
  {
56
    float tmp =  182.5 - R_PT100;
57
    tmp = tmp / 0.3783105; 
58
    grad = 219.0 - tmp;
59
  }  
60
  int int_grad = (int) grad;
61
62
  if ( UCSRA & (1<<UDRE))
63
  USART_Transmit(int_grad);
64
65
}
66
int main( void )
67
{
68
69
ADC_Init();            
70
          
71
  //initialisierung der Ein- und Ausgänge der Ports
72
  //ini_iO();
73
74
  DDRD  = 0b11111100;
75
  DDRB  = 0b00000001;  
76
         
77
   
78
   PORTD = 0x00;      //initialisierung der pulldown Wiederstände, damit ein 
79
  PORTB = 0b11111110;    //eindeutiges Signal anliegt
80
81
  
82
    // =========================================================  
83
84
  
85
  USART_Init ( UBRR_VAL );
86
87
  while (1) 
88
    {  
89
90
  
91
    //Wenn das RXC-Bit des UCSRA-Register gesetzt ist, wurde ein Zeichen empfangen  
92
      if ( (UCSRA & (1<<RXC)) )    
93
      {
94
          //Das empfangende Zeichen wird in die vordefinierte Variable gespeichert
95
          c = USART_Receive();
96
          if( UCSRA & (1<<UDRE)) {
97
        switch(c) {
98
  case 'S':
99
          // Status senden
100
          status();
101
          _delay_ms(2000); 
102
          t = ADC_Read();
103
          
104
          Temperatur(t);

von Stefan E. (sternst)


Lesenswert?

1
   ADCSRA |= (0<ADPS1) | (1<<ADPS2) | (1<<ADPS0);       //Frequenzvorteiler
2
   ADCSRA = (1<<ADEN);                         // ADC aktivieren
Du betreibst den ADC viel zu schnell (1,8432 MHz), da sind seltsame 
Ergebnisse kein Wunder.

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.