Forum: Mikrocontroller und Digitale Elektronik ADC Werte berechnen, nur wie?


von Heike L. (Gast)


Lesenswert?

Hallo liebe Forengemeinde,

durch Google bin ich auf diese Seite gekommen um mein Problem zu lösen. 
Nun habe ich hier auch schon hin und her gelesen Threads und auch 
Tutorial und komme einfach nicht weiter. ADC und Assembler ist wohl 
nicht so einfach. Ich bekomme über den ADC einen Wert von 0 bis 1023 das 
ist schon mal in trockenen Tüchern.

0=0Volt
1023=5Volt

Somit ist

V=ADC_Wert/204,6

auch gut so.

Nun sollte ich in Assembler wohl

ADC_Wert/2046 nehmen und danach durch 10 teilen.

Also

1023/2046=0,5*10=5

Aber wie mach ich das?

Warum ich nicht durch 204,6 teile? Damit ich nur mit Ganzzahlen rechen 
muss!
Oder denke ich da falsch?

Kann mir das Forum weiter helfen?

von Markus (Gast)


Lesenswert?

Heike L. schrieb:
> 1023/2046=0,5*10=5

Heike L. schrieb:
> Warum ich nicht durch 204,6 teile? Damit ich nur mit Ganzzahlen rechen
> muss!
> Oder denke ich da falsch?ja,
1023/2046 = 0    0*10 = 0

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Wozu brauchst du diesen Spannungswert? Willst du den anzeigen?
Dir ist klar, dass eine "normale" Ganzzahl mit deiner Berechnung nur die 
Werte 0,1,2,3,4 und 5 annehmen können wird?

> Nun sollte ich in Assembler wohl
> ADC_Wert/2046 nehmen
Was gibt 1023/2046?
Richtig: 0

> Oder denke ich da falsch?
Ja.
Ein Tipp: rechne in mV oder in 1/10mV
Also z.B.: ADC-Wert * 489 = hundertstel mV

von Heike L. (Gast)


Lesenswert?

Ich wollte 5,00Volt (1,87Volt) ausgeben keine 5000mV (1870mv)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Heike L. schrieb:
> Ich wollte 5,00Volt (1,87Volt) ausgeben keine 5000mV (1870mv)
Besteht da nicht eine gewisse Ähnlichkeit?
Auf jeden Fall mehr als zwischen 5,00V (1,87V) und 5V (1V)

Also die Schritt für Schritt-Anleitung:
1. Berechne die Spannung mit ausreichend hoher Genauigkeit.
2. Und dann gib von dieser Spannung die Stellen aus, die dich 
interessieren.
3. Platziere bei der Ausgabe ein Komma dort, wo es hübsch aussieht und 
passt.

von Helfer (Gast)


Lesenswert?

Festkommaarithmetik

Wenn du die Ziffern 5 0 0 0 hast und weisst, dass diese Millivolt 
darstellen, ist es easy ein paar Ziffern plus ein Komma plus ein V als 
Einheitszeichen so auszugeben, dass 5,00V auf der Anzeige erscheint.

von Heike L. (Gast)


Lesenswert?

Jou und genau deshalb stellte ich meine Frage hier.

Wie berechne ich in Assembler x/2.046

ADC_Read:
  push xl
  push xh

  ldi  temp2, (1<<REFS0) | (1<<MUX0)
  tst  temp1
  brne ADC_Start
  ldi  temp2, (1<<REFS0)

ADC_Start:
  sts  ADMUX, temp2
  ldi  temp1, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
  sts  ADCSRA, temp1

  lds  temp1,ADCSRA
  sbr  temp1,1<<ADSC
  sts  ADCSRA, temp1

Wait_ADC:
  lds  temp2, ADCSRA
  sbrc temp2, ADSC
  rjmp Wait_ADC

  lds  xl, ADCL
  lds  xh, ADCH

und wie könnte es ab hier weiter gehen?

von MicroSD (Gast)


Lesenswert?

Erstmal den Denkfehler hier:
Heike L. schrieb:
> 0=0Volt
> 1023=5Volt

beseitigen.

1023 im ADCW bedeutet nicht 5V, sondern "Spannung größer als 4,9951... 
V".

d.H. für deine Rechnung nimmst du "1024 == 5V". Und Dividieren durch 
1024 ist auch in ASM recht einfach, dafür reicht ein wenig 
Bit-Schieberrei.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Heike L. schrieb:
> Wie berechne ich in Assembler x/2.046
Überhaupt nicht.

Sondern du rechnest x*(1000000/2046) und ignorierst die unnötigen 
Dezimalstellen.
10000000/2046 = 488,758 = 489
Kommt dir diese Zahl bekannt vor?

von Heike L. (Gast)


Lesenswert?

Hättet Ihr auch Assembler Code?

von Hannes L. (hannes)


Lesenswert?

Heike L. schrieb:
> Hättet Ihr auch Assembler Code?

Beitrag "Re: Spannungsmesserbau mit XMega128"

...

von Heike L. (Gast)


Lesenswert?


von Markus (Gast)


Lesenswert?

beratungsresistent?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Heike L. schrieb:
> Beitrag "Re: ADC Werte berechnen, nur wie?"
Ja nun, ein wenig solltest du schon noch selber machen...

von Holger P. (Gast)


Angehängte Dateien:

Lesenswert?

Heike L. schrieb:
> Hättet Ihr auch Assembler Code?

Also ich habe das mal so gemacht. Ist durch den Faktor 49 nicht sehr 
genau aber mir ging es nur ums verstehen.

Heike L. schrieb:
> Nun habe ich hier auch schon hin und her gelesen Threads und auch
>
> Tutorial und komme einfach nicht weiter.

Najahier ist z.b. folgendes zu finden. Darüber habe ich mich schlau 
gemacht. http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC

Also so habe ich es gemacht, wobei meine Werte normal nicht im x liegen:
1
; in Spannung umrechnen
2
   clr     Dummy1             
3
   clr     Dummy2
4
5
   ldi     Dummy3,49          ; Faktor 49 
6
 
7
   mul     xl, Dummy3         ; Multiplikation
8
   add     Dummy1, r0         ; und akkumulieren
9
   adc     Dummy2, r1
10
 
11
   mul     xh, Dummy3         
12
   add     Dummy2, r0         
13
14
   movw    x,Dummy1         ; Kopiert Registerpaar
15
    
16
   ldi     Dummy1,'0'-1     ; Ziffernzähler direkt als ASCII Code
17
    
18
Volt:
19
   inc     Dummy1
20
   subi    xl, low(10000)   ; Wie oft geht die 10000 in X
21
   sbci    xh, high(10000)  
22
   brcc    Volt
23
                                    
24
   rcall   lcd_data
25
   ldi     Dummy1,','       ; , setzen
26
   rcall   lcd_data
27
28
   subi    xl, low(-10000)  
29
   sbci    xh, high(-10000) 
30
31
   ldi     Dummy1, '0'-1    ; Ziffernzähler direkt als ASCII Code
32
Volt_H:
33
   inc     Dummy1
34
   subi    xl, low(1000)    ; Wie oft geht die 1000 in X   
35
   sbci    xh, high(1000)   
36
   brcc    Volt_H
37
                                    
38
   rcall   lcd_data
39
   subi    xl, low(-1000)   
40
   sbci    xh, high(-1000)  
41
42
   ldi     Dummy1, '0'-1    ; Ziffernzähler direkt als ASCII Code
43
Volt_Z:
44
   inc     Dummy1
45
   subi    xl, low(100)     ; Wie oft geht die 1000 in X
46
   sbci    xh, high(100)    
47
   brcc    Volt_Z
48
                                    
49
   rcall   lcd_data
50
   ldi     Dummy1,'V'       ; V setzen
51
   rcall   lcd_data

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.