AD_Wandlung mit Atmega2060

Gast #2865554
Lesenswert?

Hallo,
Ich bin Anfänger im AVR uC Programmierung und ich habe das Tutorial 
gelesen und hat diese Beispiel laufe lassen aber ich weiss nicht wie ich 
überprüfe können, ob das Signal umgewandelt wurde. am Eingang mein  ADC 
also am PORTF habe ich VTG als Analogsignal am PF0 angeschloßen.

hier ist nochmal mein code
1
#include <avr/io.h>
2

3

4
     
5
  /* ADC_Initialisieren */
6

7
 void ADC_Init(void)
8
  {  
9
    uint16_t  result;
10
 
11
    ADMUX = (1<<REFS1) | (1<<REFS0);       //  interne Referenzspannung nutzen
12
    ADCSRA = (1<<ADPS2) | (1<<ADPS0);     //  Frequenzvorteiler 32
13
    ADCSRA |= (1<< ADEN);                 //  ADC aktivieren
14
    ADCSRA |= (1<<ADSC);                  //  Start der  ADC_Wandlung, wenn ADC_Wandlung fertig dann ADSC auf 0 setzen.
15
 
16
    while ( ADCSRA & (1<<ADSC) ) {}      // auf Abschluss der Konvertierung warten
17
      
18
    result = ADCW ;                     // ADCW ( wo die gemessene Werte gespeichern sind) muss einmal gelesen werden sonst wird Ergebnis der nächste Wandlung nicht übernommen.Zum erstmal wird ADC verworfen
19
  }
20

21
   
22
   
23
   /* ADC Einselmessung */
24
   
25
  uint16_t ADC_Read(uint16_t channel)
26
   {
27
   ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);    // Channel waehlen ohne andere Bits zu Beeinflussen
28
     ADCSRA |= (1<<ADSC);                           //  Start der  ADC_Wandlung, wenn ADC_Wandlung fertig dann ADSC auf 0 setzen.
29
    
30
   while ( ADCSRA & (1<<ADSC) ) {}               // auf Abschluss der Konvertierung warten
31
     return ADCW;                                  // ADC  auslesen aus dem Register ADCW und zurückgeben
32
   }  
33
   
34
 
35
 
36
 /* Beispielaufrufe*/   
37
   
38
 int main(void)
39
{  
40
   uint16_t adcval;
41
   ADC_Init();
42
   
43
     while(1)
44
      { adcval = ADC_Read(0);  // Kanal 0
45
      //mach was mit adcval code à suivre       
46
      }
47
}

Danke
Claude
#2865587
Lesenswert?

Claude schrieb:
> Hallo,
> Ich bin Anfänger im AVR uC Programmierung und ich habe das Tutorial
> gelesen und hat diese Beispiel laufe lassen aber ich weiss nicht wie ich
> überprüfe können, ob das Signal umgewandelt wurde.

Ganz einfach:
Irgendwo ausgeben

Wo genau, das hängt jetzt davon ab, welche Möglichkeiten du hast. 
Möglich wäre zb

  * LCD
  * per UART auf ein Terminal
  * 8 LED an einem Port
  * etwas ungenauer, nichts desto trotz aber trotzdem aussagekräftig:
    eine LED an einem Port, die man in der Helligkeit dimmt
  * eng damit verwandt: eine PWM die man sich mit einem Oszi ansieht
  * Servo, welches seine Stellung proportional zum Messwert ändert
  * ...

letzten Endes spielt es keine große Rolle, was du benutzt. Hauptsache 
die kriegst eine Idee vom Zahlenwert. Zur Not reicht es auch schon, wenn 
man mitkriegt, dass sich der WErt verändert, wenn man zb ein Poti am ADC 
anschliesst und das von einer Endstellung in die andere dreht und mitten 
drinn eine LED ausgeht bzw. beim Drehen in die andere Richtung wieder 
angeht. Selbes Spiel, nur mit 2 bis n LED.
Denk dir was aus - wie könntest du noch einen Zahlenwert 'sichtbar' 
machen?
Gast #2865597
Lesenswert?

Hi

>AD_Wandlung mit Atmega2060

ATMega2560 oder was?

>am Eingang mein  ADC
>also am PORTF habe ich VTG als Analogsignal am PF0 angeschloßen.

VTG von wo? STK500/600? Besser wäre eine regelbare Spannung im Bereich 
0...VREF.

>ADMUX = (1<<REFS1) | (1<<REFS0);       //  interne Referenzspannung nutzen

Wären beim ATMega2560 2,56V. Also sollte die Eingangsspannung im Bereich 
0...2,56V liegen.

>aber ich weiss nicht wie ich
>überprüfe können, ob das Signal umgewandelt wurde.

Im einfachsten Fall LEDs an einen freien Port anschließen. Dabei ist es 
aber sinnvoller ADLAR in ADMUX zu setzen und das Ergebnis in ADCH 
auszulesen.

MfG Spess
Gast #2865751
Lesenswert?

Vielen Dank an euch Heinz und Spess für Ihre Anworte,
 es hat mir geholfen  aber ich habe noch eine Sorge der Status LED bei 
mein STK600 binken Rot und am Ausgang bei den LEDS (also PORTA = 
adcval;) ändert sich das digitalisierte Signal von alleine ohne dass ich 
die Spannung am Poti verändert habe.Ich nutze den uc Atmega2560

Bitte wo könnte das Problem liegen ??


MFG
Claude
1
#include <avr/io.h>
2
//#include <avr/delay.h>
3

4
     
5
  /* ADC_Initialisieren */
6

7
 void ADC_Init(void)
8
  {  
9
    uint16_t  result;
10
 
11
    ADMUX = (1<<REFS1) | (1<<REFS0);       //  interne Referenzspannung nutzen
12
    ADCSRA = (1<<ADPS2) | (1<<ADPS0);     //  Frequenzvorteiler 32
13
    ADCSRA |= (1<< ADEN);                 //  ADC aktivieren
14
    ADCSRA |= (1<<ADSC);                  //  Start der  ADC_Wandlung, wenn ADC_Wandlung fertig dann ADSC auf 0 setzen.
15
 
16
    while ( ADCSRA & (1<<ADSC) ) {}      // auf Abschluss der Konvertierung warten
17
      
18
    result = ADCW ;                     // ADCW ( wo die gemessene Werte gespeichern sind) muss einmal gelesen werden sonst wird Ergebnis der nächste Wandlung nicht übernommen.Zum erstmal wird ADC verworfen
19
  }
20

21
   
22
   
23
   /* ADC Einselmessung */
24
   
25
  uint16_t ADC_Read(uint16_t channel)
26
   {
27
   ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);    // Channel waehlen ohne andere Bits zu Beeinflussen
28
     ADCSRA |= (1<<ADSC);                           //  Start der  ADC_Wandlung, wenn ADC_Wandlung fertig dann ADSC auf 0 setzen.
29
    
30
   while ( ADCSRA & (1<<ADSC) ) {}               // auf Abschluss der Konvertierung warten
31
     return ADCW;                                  // ADC  auslesen aus dem Register ADCW und zurückgeben
32
   }  
33
   
34
 
35
 
36
 /* Beispielaufrufe*/   
37
   
38
 int main(void)
39
 
40
{  DDRA = 0xff;
41
   uint16_t adcval;
42
   ADC_Init();
43
   
44
     while(1)
45
      { adcval = ADC_Read(0);  // Kanal 0
46
    PORTA = adcval;
47
  //  _delay_ms(1000);
48
      //mach was mit adcval code à suivre       
49
      }
50
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren