Forum: Compiler & IDEs auflösung analogwert


von Christian (Gast)


Lesenswert?

hallo wenn ich meinen Analogwert auf max stelle zeigt er mir 1023 im 
display an! ich würde gerne wisse wo ich die Auflösung ändern kann? zum 
Beispiel auf 256...

gruß
1
#include <avr/io.h>
2
#include "subprogramme.h"
3
#include <util/delay.h>
4
5
 
6
void pwmanalog (void) {
7
8
 uint16_t messwert;
9
10
11
  
12
13
 // ADC 0 - Bit 4 - 0 auf 0
14
 // interne Referenzspannung nutzen Bit 7-6 auf 1
15
16
  ADMUX = 0b01000000;
17
 
18
  
19
// ADC Enable - Bit 7 auf 1
20
// ADC Prescaler 128 - Bit 2-0 auf 1 
21
  ADCSRA = 0b10000111;
22
23
  
24
  while (1) {
25
  
26
  set_cursor (2,1);
27
  lcd_string("Analog-Steuerung");    // Überschrift
28
29
  
30
  set_cursor (0,3);
31
  lcd_string("Analogwert  [V]:");    // Helligkeit in Prozent
32
33
    char puffer_analog [20];      //*
34
  sprintf(puffer_analog, "%4d", messwert);
35
  set_cursor (16,3);
36
  lcd_string (puffer_analog);    //* Ausgabe der Variablen messwert
37
38
39
  
40
    
41
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
42
    
43
  while ( ADCSRA & (1<<ADSC) ) {
44
      ;   // auf Abschluss der Konvertierung warten
45
    }
46
   
47
    messwert = ADCW;        // Wandlungsergebnisse aufaddieren
48
  
49
   if(PINC &(1<<6)) goto menue;  //wenn Taster 1 gedrückt zurück ins Hauptmenü
50
51
};
52
menue: menueposition =1;
53
54
};

von Stefan Kunz (Gast)


Lesenswert?

Teile deinen Messwert einfach durch 4 und nimm die goto-Befehle raus. 
Diese machen es nur unleserlich.

von Christian (Gast)


Lesenswert?

die goto Befehle brauche ich um aus der while(1) schleife rauszukommen 
damit ich wieder zurück ins menü zu gehen kann.

Oder haste eine bessere Alternative?

gruß

von Peter (Gast)


Lesenswert?

Christian schrieb:
> Oder haste eine bessere Alternative?

ja, break;

von Christian (Gast)


Lesenswert?

while ( ADCSRA & (1<<ADSC) ) & ~(PINC &(1<<6)) )
  {
  //schleife..
  }

von Christian (Gast)


Lesenswert?

ahso ^^, danke sehr :)

dachte break nimmt man nur bei Switch Case Anweisungen ...

von Stefan Kunz (Gast)


Lesenswert?

oder while(1)-schleife rausnehmen.  sondern immer wieder die funktion 
aufrufen solange bis was anderes passiert (State-Machine).

von Joachim (Gast)


Lesenswert?

Hallo

Du gibst am Anfang messwert aus, woher der Wert auch immer kommen mag.
Erst weiter unten wird er dann erst ermittelt.
Hat mit deine Problematik nichts zu tun. Aber ist es
wirklich das, was du vorhast??

Gruß
Joachim

von Christian (Gast)


Lesenswert?

ja funktioniert wunderbar...

habe aber noch ne andere Frage, ich habe will 2 verschiedene 
Eingangsspannungen abfragen, einmal 5V und dann 2,5 V. Die 5V 
funktioniert soweit sehr gut da ich die ReFspg. 5V wählen konnte aber 
wie kann ich im Programm sagen dass ich gerne ne Referenzspannung von 
2,5 V hätte.

ADMUX = 0b01000000;

Bit 7 und 6 können verstellt werden soweit ich das im Datenblatt gesehen 
habe. in diesem Fall habe ich die 5V Refspg. die auch Funktioniert.


ADMUX = 0b11000000;

Laut Datenblatt müsste diese Kombi die 2,56V Refspg sein.

wisst ihr da weiter?

von Karl H. (kbuchegg)


Lesenswert?

Christian schrieb:
> ja funktioniert wunderbar...

Aber nur, wenn man am Anfang nicht zu genau hinschaut.

> habe aber noch ne andere Frage, ich habe will 2 verschiedene
> Eingangsspannungen abfragen, einmal 5V und dann 2,5 V. Die 5V
> funktioniert soweit sehr gut da ich die ReFspg. 5V wählen konnte aber
> wie kann ich im Programm sagen dass ich gerne ne Referenzspannung von
> 2,5 V hätte.

Gar nicht.

Entweder du legst die 2.5V als externe Referenzspannung an AREF an und 
teilst deinem ADC mit das er gefälligst die als Referenz benutzen soll
oder du lebst mit den 5V als Referenz.


> Laut Datenblatt müsste diese Kombi die 2,56V Refspg sein.

Die sind aber nicht sehr genau.
Das können auch deutlich weniger sein.
Atmel garantiert dir nur, dass es die Referenzspannung sauber hält, 
nicht dass da exakt 2.56V entstehen.

von Christian (Gast)


Lesenswert?

hmm,

würde also funktionieren dass ich die interne Refspg. 5V Spg. für meine 
5V nehme, und per Programmcode auf externe Refspg. 2,5V umschalten kann, 
diese ich dann für 2,5V nutzen würde....?

mfg

von ms (Gast)


Lesenswert?

Die Referenzspannung bleibt immer bei 5V oder willst du die Spannungen 
unter 2,5V mit einer höheren genauigkeit erfassen?

von Christian (Gast)


Lesenswert?

Nein,

es ist so: ich will zwei verschiedene Eingangsspannungen über einen 
Eingang einlesen, einmal 10V und einmal 5V... so da 10V recht schlecht 
fürn µC ist habe ich ne OP beschaltung gebaut diese mir mit einer 
Verstärkung von 0,5 die Eingangsspannung halbiert. 10V ---> 5V und 5V 
----> 2,5V mein Problem ist nun die Eigentliche 5V die nun 2,5V sind wie 
kann ich die einlesen?

von Karl H. (kbuchegg)


Lesenswert?

Irgendwie ist das was du vor hast nicht sehr logisch.

Auf der einen Seite willst du unbedingt eine externe Referenzspannung 
von 2.5V, damit du Spannungen unter 2.5V mit höchster möglicher 
Auflösung messen kannst, auf der anderen Seite verwirfst du dann 2 Bit, 
indem du den Messwert durch 4 teilst.

Das ist ungefähr so, als ob die den Wasserstand der Donau mit dem 
Mikrometer misst, auf die Anzeigetafel dann aber 3.8Meter hinschreibst.

Wenns dir Spass macht, ok tus, aber so richtig erschliesst sich der Sinn 
der Sache nicht.

von ms (Gast)


Lesenswert?

Du liest deine 5V ein genauso wie du deine 2,5V einliest.
Der Analog Digitalwandler liefert dir das Verhältnis der gemessenen 
Spannung zur Referenzspannung

d.h. bei 5v Referenz und 10 Bit Auflösung (0-1023)

1023 = 5V
512 = 2,5V

um eine Spannung zu erhalten Multiplizierst du deinen A/D-Wert in diesem 
Beispiel mit 4,8mV = 5V/1024 Werte

also spuckt dir dein A/D Wandler 221 aus ist die anliegende Spannung 
1,06V

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.