Moin,
ich möchte einen AD-Wandler am Mega32 verwenden.
So habe ich den Ad-Wandler angeschlossen wenn ich AVCC als Referenz
verwenden möchte.
AVCC an +5V
GND an GND
AREF mit Kondensator an GND
An PA0 (ADC0) habe ich eine Spannung von 0,6V - 2V.
Mein C-Code bis jetzt:
1 | define F_CPU 8000000UL
|
2 | #include <avr/io.h>
|
3 | #include <util/delay.h>
|
4 | #include "Lcd-routines.h"
|
5 | #include <stdlib.h>
|
6 |
|
7 | int main(void)
|
8 | {
|
9 |
|
10 | void ADC_Init(void){
|
11 |
|
12 | ADMUX = (1<<REFS0); //AVcc als Referenz
|
13 | ADCSRA = (1<<ADPS2) | (1<<ADPS1); //Frequenzvorteiler
|
14 | ADCSRA |= (1<<ADEN); //ADC Aktivieren
|
15 | //Dummy readaot
|
16 | ADCSRA |= (1<<ADSC);
|
17 | while (ADCSRA & (1<<ADSC)){}
|
18 | (void) ADCW;
|
19 | }
|
20 | uint16_t ADC_Read( uint8_t channel ){
|
21 |
|
22 | //Kanal wählen
|
23 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
|
24 | ADCSRA |= (1<<ADSC); //Eine Wandllung sigel conversion
|
25 | while (ADCSRA & (1<<ADSC)){} //Auf Abschluss warten
|
26 | return ADCW;
|
27 | }
|
28 | DDRA = 0b00000000;
|
29 | PORTA = 0b00000000;
|
30 | DDRC = 0b11111111;
|
31 |
|
32 | lcd_init();
|
33 |
|
34 | char out0[16];
|
35 | char out1[16];
|
36 | uint16_t infrarot;
|
37 | uint16_t test=120;
|
38 |
|
39 | while (1)
|
40 | {
|
41 | lcd_clear();
|
42 | lcd_string("Testausgabe");
|
43 | itoa(test,out0,10);
|
44 | lcd_setcursor(0,2);
|
45 | lcd_string(out0);
|
46 | _delay_ms(1000);
|
47 | lcd_clear(),
|
48 |
|
49 |
|
50 | infrarot=ADC_Read(0);
|
51 | itoa(infrarot,out1,10);
|
52 | lcd_setcursor(0,0);
|
53 | lcd_string("Abstand");
|
54 | lcd_setcursor(0,2);
|
55 | lcd_string(out1);
|
56 |
|
57 | _delay_ms(1000);
|
58 | lcd_clear();
|
59 |
|
60 | }
|
61 | }
|
Bei der Testausgabe funktioniert alles. Und bei der infrarot Ausgabe
erhalte ich eine 0. Sieht einer den Fehler?
Liebe Grüße