poti messen mit adc

Gast #1937677
Lesenswert?

hallo leute,

ich möchte den potentiometerwert mittels adc wandler einlesen und an den 
leuchtdioden anzeigen, jedoch hab ich da eine frage muss ich einen 
spannungsteiler machen wenn ich den wert auslesen will oder reicht es 
wenn ich den poti direkt am ADC anschließe?

danke lg thomas
#1937712
Lesenswert?

thomas schrieb:

> ich möchte den potentiometerwert mittels adc wandler einlesen und an den
> leuchtdioden anzeigen, jedoch hab ich da eine frage muss ich einen
> spannungsteiler machen wenn ich den wert auslesen will oder reicht es
> wenn ich den poti direkt am ADC anschließe?

Beides:
Du schliesst das Poti direkt an den ADC an. Aber du verschaltest es so, 
dass es einen Spannungsteiler bildet.

Man kann sich ja ein Poti so vorstellen, dass die Poti-interne 
Widerstandsbahn durch den Abgreifer in 2 getrennte Widerstände 
unterteilt wird, deren Wert sich ändert, wenn man den Abgreifer 
verschiebt.

Und genau das ist ja ein Spannungsteiler: 2 Widerstände, wobei die 
gteilte Spannung am Verbindungspunkt der Widerstände abgegriffen wird.
#1937720
Lesenswert?

thomas schrieb:
> also verbinde ich eines der anschlüsse mit dem ground und die anderen 2
> anschlüsse mit den eingängen des ad wandlers?

Das wäre dann kein Spannungsteiler

Ein Endpunkt kommt an GND. Der andere Endpunkt an Vcc.
Am 3. Potianschluss hast du dann eine Spannung, die du durch verdrehen 
des Potis von 0 bis Vcc verstellen kannst.
#1937727
Lesenswert?

thomas schrieb:
> ka wir haben die schaltung von der Schule bekommen und gelötet

Das ist ja das eigentlich traurige.
(abgesehen davon, dass eine Frage nach Beschaltung ganz sicher nichts im 
GCC Forum verloren hat)

Die Bezeichnung des Widerstands und der Spule mag eventuell damit 
zusmmenhängen, dass der Zeichner ein gewisser "Manfred Schnöll" ist.
#1937778
Lesenswert?

thomas schrieb:
> also ich hab den potentiometer wie im Anhang angeschlossen, ist das
> soweit ok?

Häng ein Voltmeter an PC0 und sieh nach ob du durch verdrehen des Potis 
dort die Spannung ändern kannst.
Manchmal ist man mit Selbsthilfe einfach besser bedient als wie wenn man 
für alles und jeden eine Tante braucht, die mit einem aufs Klo Lulu 
machen geht.
Wer eine Schaltung zusammenlötet, sollte eigentlich kein Problem damit 
haben, mit einem Voltmeter Spannungen nachzumessen.

> d.h. jetzt kann ich mit dem programmieren beginnen oder?

Ja.
Gast #1937870
Lesenswert?

Ich hab jetzt ein Problem mit dem Programm :S

Ich hab mein Eingangssignal an PC0 angeschlossen. Jedoch verändern sich 
bei den LED´s nichts. Hier ist der Programmcode:

1
#include <avr/io.h>
2
#include <inttypes.h>
3
int main (void)
4
{
5
/* ADC initialisieren */
6
void ADC_Init(void) {
7
 
8
  uint16_t result;
9
 
10
  ADMUX = (1<<REFS1) | (1<<REFS0);      // interne Referenzspannung nutzen
11
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
12
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
13
 
14
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
15
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
16
 
17
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
18
  while (ADCSRA & (1<<ADSC) );          // auf Abschluss der Konvertierung warten
19
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
20
     Wandlung nicht übernommen. */
21
  result = ADCW;
22
}
23
 
24
/* ADC Einzelmessung */
25
uint16_t ADC_Read( uint8_t channel )
26
{
27
  // Kanal waehlen, ohne andere Bits zu beeinflußen
28
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
29
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
30
  while (ADCSRA & (1<<ADSC) )     // auf Abschluss der Konvertierung warten
31
    ;
32
  return ADCW;                    // ADC auslesen und zurückgeben
33
}
34

35
if(ADCW = 0,7)        // erste LED leuchtet
36
{
37
  DDRC = 1;
38
  PORTC=PORTC &254;
39
}
40

41
if(ADCW = 1,4)        // zeite LED leuchtet
42
{
43
  DDRC = 2;
44
  PORTC=PORTC &252;
45
}
46

47
if(ADCW = 2,1)      // dritte LED leuchtet
48
{
49
  DDRC = 8;
50
  PORTC=PORTC &246;
51
}
52

53
if(ADCW = 2,8)      // vierte LED leuchtet
54
{
55
  DDRC = 16;
56
  PORTC=PORTC &238;
57
}
58

59
if(ADCW = 3,5)      // fünfte LED leuchtet
60
{
61
  DDRC = 32;
62
  PORTC=PORTC &222;
63
}
64

65
}
#1937903
Lesenswert?

U.R. Schmitt schrieb:
> Floh schrieb:
>> [X] du brauchst ein C-Buch.
>
> [X] Du musst das Buch lesen
> [X] Du musst die Grundlagen auch verstehen
> [X] Du musst wissen wie ein µC und seine Peripherie prinzipiell
> funktioniert
>
> Entweder
> [ ] Du hast einen total besch. Lehrer.
> oder
> [ ] Du bist zu faul um im Unterricht aufzupassen

Nana, Schüler und Anfänger. Ich finde seinen Ansatz sehr kreativ und gar 
nicht mal so verkehrt!
#1937915
Lesenswert?

Ich würds mal irgendwie so probieren:
1
#include <avr/io.h>
2
#include <inttypes.h>
3

4
/* ADC initialisieren */
5
void ADC_Init(void) {
6
 
7
  uint16_t result;
8
 
9
  ADMUX = (1<<REFS1) | (1<<REFS0);      // interne Referenzspannung nutzen
10
  ADCSRA = (1<<ADPS1) | (1<<ADPS0);     // Frequenzvorteiler
11
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
12
 
13
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
14
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
15
 
16
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
17
  while (ADCSRA & (1<<ADSC) );          // auf Abschluss der Konvertierung warten
18
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
19
     Wandlung nicht übernommen. */
20
  result = ADCW;
21
}
22

23
/* ADC Einzelmessung */
24
uint16_t ADC_Read( uint8_t channel )
25
{
26
  // Kanal waehlen, ohne andere Bits zu beeinflußen
27
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
28
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
29
  while (ADCSRA & (1<<ADSC) )     // auf Abschluss der Konvertierung warten
30
    ;
31
  return ADCW;                    // ADC auslesen und zurückgeben
32
}
33

34

35
int main (void)
36
{
37

38
ADC_Init();
39

40
while(1){
41
if(ADC_Read(0) <= 30)        // erste LED leuchtet
42
{
43
  DDRC = 1;
44
  PORTC=PORTC &254;
45
}
46

47
else if(ADC_Read(0) <= 60)        // zeite LED leuchtet
48
{
49
  DDRC = 2;
50
  PORTC=PORTC &252;
51
}
52

53
else if(ADC_Read(0) <= 90)      // dritte LED leuchtet
54
{
55
  DDRC = 8;
56
  PORTC=PORTC &246;
57
}
58

59
else if(ADC_Read(0) <= 120)      // vierte LED leuchtet
60
{
61
  DDRC = 16;
62
  PORTC=PORTC &238;
63
}
64

65
else if(ADC_Read(0) <= 150)      // fünfte LED leuchtet
66
{
67
  DDRC = 32;
68
  PORTC=PORTC &222;
69
}
70
}
71
}
#1937930
Lesenswert?

Daniel V. schrieb:
> thomas schrieb:
>> ../ad_wandler_1.c:70: error: expected declaration or statement at end of
>> input
>> make: *** [ad_wandler_1.o] Error 1
>> Build failed with 1 errors and 0 warnings...
>>
>>
>>  da komt die fehlermeldung heraus
>
> Na denken musst du schon auch ein bißchen. Vielleicht fehlt das
> Semikolon bei der While-Schleife?

Seit wann braucht es da ein Semikolon.

Allerdings:
* Code einrücken wäre angebracht.
* Die DDR macht man am Programmanfang und lässt sie dann nach
  Möglichkeit in Ruhe.
* Das hier
    PORTC=PORTC &222;
  ist wohl so ziemlich die schlimmste Schreibweise die man finden kann.
  Da sieht man so gar nicht was da eigentlich passiert.
  Da ist ja die Schreibweise als Binärkonstante noch besser.
Gast #1937933
Lesenswert?

thomas schrieb:
> das einzige was wir vom lehrer lernen is schauts im tutorial nach :D

Also das erstere :-( Was für eine Ausbildung/Schule machst Du denn 
(Klasse Lehrjahr)
Dein Problem ist daß Dir so wie es aussiehst überall die Grundlagen 
fehlen. Du brauchst auf jeden Fall ein C-Buch und das musst du lesen und 
verstehen.
Für hier und jetzt:
Unterschied zwischen verschiedenen Datentypen?
Unterschied zwischen Zuweisung und Vergleichsoperator?
Was ist eine Funktion und wie rufe ich sie auf?
Was ist main()?
und und und...

Wenn Du das Interesse hast, dann klappt das auch mit der Zeit und Du 
kriegst bei einzelnen Problemen hier Hilfe.


Daniel V. schrieb:
> Nana, Schüler und Anfänger. Ich finde seinen Ansatz sehr kreativ und gar
> nicht mal so verkehrt!
Halt typisch irgendwelche Beispiele durchgeflöht und zusammenkopiert 
ohne auch nur annähernd zu verstehen was los ist.
Sorry ich bin noch von der alten Fraktion die sagt lieber erst mal nur 5 
Zeilen Code aber die selber geschrieben und verstanden. Auch wenn hinten 
nur "Hello World" rauskommt.
#1937941
Lesenswert?

1
int main (void)
2
{
3
  int ADCValue = 0;
4

5
  ADC_Init();
6
  DDRC = (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4) | (1<<PC5);
7

8
  while(1){
9
    
10
    ADCValue = ADC_Read(0);
11

12
    PORTC = 0;
13
    if( ADCValue <= 30 )        // erste LED leuchtet
14
      PORTC = (1<<PC1);
15

16
    else if( ADCValue  <= 60 )        // zeite LED leuchtet
17
      PORTC = (1<<PC1) | (1<<PC2);
18

19
    else if( ADCValue <= 90 )      // dritte LED leuchtet
20
      PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3);
21

22
    else if( ADCValue <= 120 )      // vierte LED leuchtet
23
      PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4);
24

25
    else if( ADCValue <= 150 )      // fünfte LED leuchtet
26
      PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4) | (1<<PC5);
27
  }
28
}

Sofern die LED leuchten, wenn eine 1 am Portbit ausgegeben wird.

Edit: Was bei dir nicht der Fall ist.
D.h. du hast dann ein LED Band, bei dem die LED ausgehen, je höher die 
Spannung wird.
#1937947
Lesenswert?

Ausserdem:
laut Schaltplan liegen die LED an PC0, PC1, PC3, PC4 und PC5.
Lediglich PC2 ist soweit frei, dass man dort ein Poti anschliessen 
könnte.

Den ADC liest man daher nicht vom Kanal 0, sondern vom Kanal 2

Es sei denn natürlich, dein Schaltplan von weiter oben stimmt so nicht 
mehr.

Also: Wo hast du dein Poti angeschlossen?
Was hast du mit der LED gemacht, die normalerweise auf PC0 gejumpert 
ist?
#1937951
Lesenswert?

Karl heinz Buchegger schrieb:
> Ausserdem:
> laut Schaltplan liegen die LED an PC0, PC1, PC3, PC4 und PC5.
> Lediglich PC2 ist soweit frei, dass man dort ein Poti anschliessen
> könnte.
>
> Den ADC liest man daher nicht vom Kanal 0, sondern vom Kanal 2
>
> Es sei denn natürlich, dein Schaltplan von weiter oben stimmt so nicht
> mehr.

Naja, der Kanal 0 kam von mir, hab einfach mal irgendeinen genommen...
#1937957
Lesenswert?

Daniel V. schrieb:
> Karl heinz Buchegger schrieb:
>> Ausserdem:
>> laut Schaltplan liegen die LED an PC0, PC1, PC3, PC4 und PC5.
>> Lediglich PC2 ist soweit frei, dass man dort ein Poti anschliessen
>> könnte.
>>
>> Den ADC liest man daher nicht vom Kanal 0, sondern vom Kanal 2
>>
>> Es sei denn natürlich, dein Schaltplan von weiter oben stimmt so nicht
>> mehr.
>
> Naja, der Kanal 0 kam von mir, hab einfach mal irgendeinen genommen...

Ist ok.
Nur: AN PC0 kann man auch über den Jumper eine LED drann hängen.
Was hast du mit der LED gemacht? Ist der Jumper offen? (Denn dann hast 
du nur 4 LED zur Verfügung und nicht 5)
#1937967
Lesenswert?

Daniel V. schrieb:
> Karl heinz Buchegger schrieb im Beitrag #1937955:
>
>> Ist ok.
>> Nur: AN PC0 kann man auch über den Jumper eine LED drann hängen.
>> Was hast du mit der LED gemacht? Ist der Jumper offen?
>
> Ich mach garnix mit dem Board. Das war nur ein Beispiel von mir. Der TE
> hat doch das Problem...

Offentliche Entschuldigung.
Ich hab übersehen, dass diese Antwort nicht von thomas kam.

Trotzdem liegt es jetzt an ihm, aufzuzeigen, was er aus seinem 
Schaltplan gemacht hat. Der lässt ja durch die Jumper gewisse Freiheiten 
zu.
#1937996
Lesenswert?

thomas schrieb:
> das poti hab ich an einem ende an vcc das andere ende am gnd und den
> mittleren ausgang am eingang vom ad wandler

Kabel direkt gelötet, oder wie?

> und bei j13 - j17 hab ich
> halt die leds

Also doch Jumper, oder wie?
Wenn du dein Poti an den PC0 geklemmt hast, dann kannst du die dort 
befindliche LED nicht benutzen. Du kannst nicht gleichzeitig am selben 
PIN mit dem ADC die Spannung messen und dann auch noch eine LED an 
diesem Pin ansteuern. Das heißt, können tust du schon, nur wird dann der 
ADC nur Unsinn messen.
#1938003
Lesenswert?

thomas schrieb:
> Ich hab nur bei JMP2 einen Jumper reingesetzt, bei den anderen hab ich
> keine jumper drinnen

Wieso JMP2?
Das ist doch der Jumper am unteren Ende vom µC im Schaltplan, mit dem 
man sich selbst den Reset Pin unter dem Hintern wegziehen kann.

Oder meinst du einen anderen?


Sieh mal:
Von unserer Seite des Bildschirms kann keiner auf deine Platine schauen. 
Wir haben nur den Schaltplan und das was du erzählst. Und das was du 
erzählst passt so gar nicht zu dem, was sich laut Schaltplan als 
vernünftig darstellt.
#1938007
Lesenswert?

thomas schrieb:
> ich hab schon verschiedene programme geschrieben mitdenen ich die leds
> ansteuern konnte d.h. so leuchten lassen konnte wie ich es wollte z.b.
> blinkled oder das alle der reihe nach leuchten bei den leds sollte daher
> kein problem bestehen

Also sind die Jumper dort gesetzt?

Gut.

Nur: an PC0 musst du den LED Jumper entfernen, wenn du den Pin als ADC 
Eingang benutzen willst.
Gast #1938059
Lesenswert?

Das Programm funktioniert! Ich hab einfach die LED rausgenommen am Port 
PC0, jetzt hab ich nur 4 leds zur verfügüng aber das ist auch ok
1
   if( ADCValue  <= 60 )        // zeite LED leuchtet
2
      PORTC = (1<<PC1) | (1<<PC2);
3

4
    else if( ADCValue <= 90 )      // dritte LED leuchtet
5
      PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3);
6

7
    else if( ADCValue <= 120 )      // vierte LED leuchtet
8
      PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4);
9

10
    else if( ADCValue <= 150 )      // fünfte LED leuchtet
11
      PORTC = (1<<PC1) | (1<<PC2) | (1<<PC3) | (1<<PC4) | (1<<PC5);
12
  }
13
}

den befehl der die erste led ansteuert hab ich einfach rausgenommen 
jedoch weis weis ich nicht wie sie auf die werte 60,90,120,150 gekommen 
sind ich hab die werte willkürlich geändert und herausgefunden das das 
programm geht, jetzt müsste ich nur wissen wie sie zu den werten 
gekommen sind um das ganze genauer zu machen

ich verwende einen 8,2k potentiometer
spannung am potentiometer max 3,6V
#1938126
Lesenswert?

thomas schrieb:

> jedoch weis weis ich nicht wie sie auf die werte 60,90,120,150 gekommen
> sind

Die haben wir einfach geschätzt bzw. irgendwelche Werte mal angenommen 
damit was dort steht.

Dein ADC liefert dir Werte zwischen 0 und 1023.

1023 ist Vollausschlag und der wird dann erreicht, wenn die zu messende 
Spannung der Referenzspannung entspricht (nicht ganz, aber machen wirs 
nicht komplizierter als unbedingt notwendig)

http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#ADC_.28Analog_Digital_Converter.29

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