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);
|