- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 3 von 3

Thema: ADC - Umrechnung - Verständnisproblem

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von DIYLAB
    Registriert seit
    31.10.2004
    Ort
    Berlin
    Beiträge
    156

    ADC - Umrechnung - Verständnisproblem

    Anzeige

    Praxistest und DIY Projekte
    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:

    Code:
    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
    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:

    Code:
    '******************************************************************************
    ' 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

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    23.11.2004
    Ort
    Bocholt
    Beiträge
    20
    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

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von DIYLAB
    Registriert seit
    31.10.2004
    Ort
    Berlin
    Beiträge
    156
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen