Forum: Mikrocontroller und Digitale Elektronik AD_Wandlung mit Atmega2060


von Claude (Gast)


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

von Karl H. (kbuchegg)


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?

von spess53 (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

spess53 schrieb:

>>also am PORTF habe ich VTG als Analogsignal am PF0 angeschloßen.
>
> VTG von wo?

Jetzt muss ich blöd fragen.
Was ist ein VTG?

von spess53 (Gast)


Lesenswert?

Hi

>Was ist ein VTG?

Wird bei den STKs üblicherweise als Abkürzung für VTARGET verwendet.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Was ist ein VTG?
>
> Wird bei den STKs üblicherweise als Abkürzung für VTARGET verwendet.

Ah, danke.
Drum konnte ich damit nix anfangen.

Dann geh ich völlig mit dir konform: Da sollte erst mal ein Poti zum 
Einstellen einer Spannung ran. Ist ja auch viel "interessanter" beim 
Spielen mit dem Programm.

von Claude (Gast)


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
}

von spess53 (Gast)


Lesenswert?

Hi

>Bitte wo könnte das Problem liegen ??

Sieh indem anderen Thread nach.

MfG Spess

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.