PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ADC - Umrechnung - Verständnisproblem



DIYLAB
15.03.2005, 18:34
Moin Gemeinde,

hab ne Denkblockade und bitte um Hilfe...
Wenn ich bei einer 10Bit Auflösung des ADC Werte von 0 bis 1023 bekomme und dabei eine Eingangsspannung von 0 bis 5V habe, könnte die Berechnung wie folgt ausehen:



Dim A As Word
Dim B As Single
Dim C As Single

Config ADC = Single , Prescaler = Auto
Start Adc

Do
A = Getadc(7)
B = A * 0.48875
C = B / 100
Print C
Loop


Wie kommt der Autor dieses Codeschnipsels auf die "0.48875", anstatt 5 (für 5V) ?
Aber noch wichtiger für mich - wie kann ich diese Umrechnung ohne Fließkommazahlen erreichen?
In anderen Basic-Compilern, z.B. für PICs gibts ja nicht mal die Möglichkeit, mit Fließkommazahlen zu rechnen 8-[
Also muss es ja auch in Bascom ohne diese gehen - bloss wie?
Ich bin noch nie ne Mathe-Leuchte gewesen, darum bitte ich um Hilfe.

Hier mal ein Beispiel aus einem PIC-Basic Compiler, der den ADC-Wert in Volt auf ein LCD gibt:



'************************************************* *****************************
' microcontroller P16F877A
'
' Project: adconlcd
' This project is designed to work with PIC 16F877A
' with minor adjustments, it should work with any other PIC MCU
' that has ADC module.
'
' This code demonstrates how to use library function ADC_read, and library
' procedures and functions for LCD display (4 bit interface)
'
'************************************************* *****************************
program adconlcd

dim ch as byte
dim t as integer
dim a as string[20]
dim tlong as longint

main:
PORTB = 0 ' clear portb
TRISB = 0 ' designate portb as output (LCD is connected to portb)
intcon = 0 ' disable all interrupts
Lcd_init(PORTB) ' initialize (4-bit interface connection)
Lcd_Cmd(PORTB, LCD_CURSOR_OFF) ' send command to LCD (cursor off)
LCD_Cmd(PORTB,LCD_CLEAR) ' send command to LCD (clear LCD)
a = "mikroElektronika" ' assign text to string a
LCD_Out(PORTB,1,1,a) ' print string a on LCD, 1st row, 1st column
a = "LCD example" ' assign text to string a
LCD_Out(PORTB,2,1,a) ' print string a on LCD, 2nd row, 1st column
OPTION_REG = $80
ADCON1 = $82 ' configure VDD as Vref, and analog channels
TRISA = $FF ' designate porta as input
Delay_ms(2000)
a = "voltage:" ' assign text to string a
DoAdc:
t = ADC_read(2) ' get ADC value from 2nd channel
LCD_Out(PORTB,2,1,a) ' print string a on LCD, 2nd row, 1st column

tlong = t*5000
t = longint(tlong >> 10)
ch = t div 1000 ' prepare value for diplay

LCD_Chr(PORTB,2,9,48+ch) ' write ASCII at 2nd row, 9th column
LCD_Chr(PORTB,2,10,".")

ch = integer(t div 100) mod 10
LCD_Chr(PORTB,2,11,48+ch)

ch = integer(t div 10) mod 10
LCD_Chr(PORTB,2,12,48+ch)

ch = t mod 10
LCD_Chr(PORTB,2,13,48+ch)
LCD_Chr(PORTB,2,14,"V")

delay_ms(1)
goto DoAdc
end.


Ich kann dieses Verfahren aber leider nicht so richtig in Bascom übernehmen und bitte um Hilfe.

Viele Grüße,
Bruno

Nick_Knatterton
15.03.2005, 20:11
Hallo,

der Autor des ersten Beispiels hat offensichtlich einen Spannungsteiler mit dem Verhältniss 1/1.95 (z.B. 3,9kOhm/4kOhm) verwendet.
Liegt eine Spannung von 5 V an, erhält der ADC die max. mögliche Eingangsspannung von 2,56V(=Vref), was der höchst möglichen Eingangsspannung des ADC's entspricht (ADC-Wert=1023).
Um von dem ADC-Wert 1023 auf eine Anzeige von 5V zu kommen, muß also dieser Teiler wieder herausgerechnet und auf 1V normiert werden (Auflösung beträgt ja 1023/2,56V )

1023*0.48876/100=5 (Volt)

für die Berechnung der Spannung ohne Fließkomma könnte ich mir folgende Vorgehensweise vorstellen:

Den Spannungsteiler auf genau 2 setzen (z.B. 4,7k/4,7k)
Eine angelegt Spannung von 5 V erzeugt dann einen ADC-Wert von 1000.
Diesen Wert teile ich durch 2 (binär 1-mal shift rechts !) und erhalte einen Ausgabewert von 500. (Jetzt noch das Komma richtig setzen!)
(Bei 4,9V z.B. erhalte ich so einen Ausgabewert von 490)


Gruß
Rolf

DIYLAB
16.03.2005, 21:06
Moin,

danke Rolf für die Denkanstöße.
Werde am Wochenende einiges durchtesten und bis dahin tuts jetzt seit heute die Gleitkomma Variante ganz gut.

Viele Grüße,
Bruno