- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 3 von 3

Thema: PCF8591 Analogspannungsausgabe

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381

    PCF8591 Analogspannungsausgabe

    Anzeige

    LiFePo4 Akku selber bauen - Video
    He Jungs!

    Mein Problem ist die analoge Spannungsausgabe bei einem PCF8591.
    Das proggen ist nicht das Prob, wie lässt sich ein Analogwert z.Bsp.: 3,45V in Hex wandeln (8Bit) das ich dies dann zum PCF schicken kann?

    Danke & Gruß
    MAT

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Bin schon ein stückchen weiter gekommen:

    Vout=Vref*(D7/2+D6/4+D5/8+D4/16+D3/32+D2/64+D1/128+D0/256)

    soweit zur Formel..... D7-0 stehen für die Bits des Analogwertes der zum PCF gesendet wird.
    Nur leider Suche ich eine Möglichkeit aus einer Kommazahl die Bits D7-D0 herauszubekommen. Hat jemand ne Idee?

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    25.03.2006
    Ort
    Hinsdorf
    Alter
    49
    Beiträge
    381
    Sooo habsch selber herausgefunden! \/

    Also: in der obrigen Formel bekomme ich für 10101011 (171/256)*5=3,33V heraus und daraus folgt:

    1. gewünschte Spannung: 3,25/5=0,56
    2. mit 256 multiplizieren und danach runden oder alles mit dem Windowsrechner rechnen => dort kann man sich gleich das Ergebnis in HEX oder BIN umwandeln lassen

    3. kompilieren und es stimmt...fast

    Bei mir lese ich mit einem Multimeter 3,23V und nach Wandlung mit dem Chip 3,248V, was will man(n) mehr


    Code:
    '**********************************************************
    
    'Programm            : I2C-Ansteuerung PCF8591
    'By                  : mat-sche@web.de
    'Compiler            : BASCOM-AVR  1.11.9.1
    'Hardware            : Mega läuft als Master holt
    '                      Daten über I2C vom ADC
    '
    'Board               : kleines
    'Chip type           : MEGA32
    
    '**********************************************************
    
    $regfile = "m32def.dat"                                                                             ' specify the used micro
    $crystal = 8000000                                                                                  ' used crystal frequency
    $baud = 19200                                                                                       ' use baud rate
    $hwstack = 150                                                                                      ' default use 32 for the hardware stack
    $swstack = 150                                                                                      ' default use 10 for the SW stack
    $framesize = 40                                                                                     ' default use 40 for the frame space
    '$sim
    $lib "i2c_twi.lbx"
    
    
    '-----------------2x16 LCD Display an Port c =>Conector -------------------------------------------------------------------------------------------------
    Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2       ' Pinbelegung "LCD-Port)"
    '                SV8          6                5               4              3              7              8           ' Pinbelegung SV9 Board
    
    
    Config Lcd = 16 * 2
    Config Porta = Output
    Config Lcdbus = 4
    Initlcd
    Print "Start"
    
    Cursor Off Noblink                                                                                  ' Cursor und Blinken abschalten.
    Cls
    
    '------------------------------------------------------------------------------- Config TWI
    Config Twi = 100000                                                                                 ' Init TWBR und TWSR
    ' TWI gleich einschalten, das macht Bascom ansonsten erst beim I2CStart !
    Twcr = &B00000100                                                                                   ' nur TWEN setzen
    
    Config Sda = Portc.1                                                                                'SDA und SCL als Hardware-TWI definieren
    Config Scl = Portc.0
    Const Pcf8591write = &H90                                                                           'PCF TWI Adresse zum schreiben des Controlbyts
    Const Pcf8574read = &H91                                                                            'PCF TWI Adresse zum Auslesen der Datenbyts
    
    Ddra = &B00000000                                                                                   ' PortA wird als Eingang verschalten
    '------------------------------------------------------------------------------- Config Variablen
    Dim U_wert As Single                                                                                ' Variablen
    Dim Dat As Byte
    Dim Lcd_text As String * 5
    
    '------------------------------------------------------------------------------- Config Controllbyte PCF
    I2cstart
    I2cwbyte Pcf8591write                                                                               'Schreibadresse senden
    I2cwbyte &B00000000                                                                                 'Kontrollbyte
               '1. immer null
                 '2. 1= Analog Out enable                    '
                   '3-4. Messwahl: 00= single input; 01= 3 differential input; 10= kanal 0&1= single end, kanal 2&3= differential; 11= 2 differntial inputs
                      '5.immer null
                        '6. 1= Autoincrement Flag an (nach jedem Acknowled wird eine Wandlung vom nächsten Kanalangestoßen)
                          '7-8.A/D Kanalnummer: 00=cha0; 01=cha1; 10=cha2; 11=cha3
     I2cstop                                                                                            'TWI Übertragung abgeschlossen
    
    
     Do
    '------------------------------------------------------------------------------- A/D Kanal 0 auslesen nach Tastendruck
    If Pina.7 = 1 Then                                                                                  'nach jeden Tastendruck PCF8591 Analogwert auslesen
    
    I2cstart
    I2cwbyte Pcf8574read                                                                                ' Leseadresse übermitteln
    I2crbyte Dat , Ack                                                                                  'Dummy => benötigt da ja nach jedem Ack erst die vorhergehende Wandlung gesendet wird; Ack bedeutet dass noch weitere Datenbyts abgefragt werden
    I2crbyte Dat , Nack                                                                                 'Messwert von kanal0, Nack=> es wird kein weiteres Datenbyte abgefragt
    I2cstop                                                                                             '
      Print " Wertdat = " ; Dat
      Print Err                                                                                         'TWI übermittlung OK? 1= nein, 0= i.O.
    
    End If
    
     U_wert = Dat * 5
    U_wert = U_wert \ 254
    Lcd_text = Fusing(u_wert , "#.###")                                                                 'FUSING returns a formatted string of a single value.
    
    'Cls
      Locate 1 , 1
         Lcd " U-Wert " ; Lcd_text
         Locate 2 , 1
         Lcd " Wert_Dat= " ; Dat
    
    '------------------------------------------------------------------------------- D/A Kanal Spannung ausgeben auf Tastendruck
    If Pina.6 = 1 Then
    I2cstart
    I2cwbyte Pcf8591write                                                                               'Schreibadresse senden
    I2cwbyte &B01000000                                                                                 'Kontrollbyte
               '1. immer null
                 '2. 1= Analog Out enable                    '
                   '3-4. Messwahl: 00= single input; 01= 3 differential input; 10= kanal 0&1= single end, kanal 2&3= differential; 11= 2 differntial inputs
                      '5.immer null
                        '6. 1= Autoincrement Flag an (nach jedem Acknowled wird eine Wandlung vom nächsten Kanalangestoßen)
                          '7-8.A/D Kanalnummer: 00=cha0; 01=cha1; 10=cha2; 11=cha3
    
     I2cwbyte &HA6 , Nack
     I2cstop
     End If
    
    Loop
    End
    MAT

Berechtigungen

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

LiFePO4 Speicher Test