-
        

Ergebnis 1 bis 2 von 2

Thema: schnelle A/D Wandlung von 16 Kanälen mit max/min Auswertung

  1. #1
    Benutzer Stammmitglied Avatar von kaktus
    Registriert seit
    17.05.2004
    Beiträge
    34

    schnelle A/D Wandlung von 16 Kanälen mit max/min Auswertung

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    hallo Forum,

    anbei mein Bascom Code:

    Was könnte man hier noch optimieren?
    Was bewirkt der Befehl set sfior.adhsm? (nicht verwendet) Ist die A/D Wandlung schneller? Steigt der Strom?
    Was ist mit Noise Reduktion Modus?
    Kann ich was in Funktionen packen?


    Es soll so schnell wie möglich aus 16 A/D Eingängen ein aktueller,ein maximaler und ein Minimaler Messwert gesucht werten. Zwecks Erhöhung der Genauigkeit wird aus dem aktuellen Wert ein Mittelwert gebildet ( / 199). soweit sogut.

    Anfangs hatte ich den Code anders:

    Eine Endlosschleife die ständig Daten einliest, und einen programmierten Timer der jede Sekunde die Daten via RS232 ausdruckt. Problem war nur das die Hauptschleife stehts IRGENDWO unterbrochen wurde und mein Mittelungswert nie passte da auch die Schleifen durchläufe um +- 1 schwankten.




    Code:
    '                  RoboterNetz Board RN-Mega2560 ab Version 1.0 und
    '
    'Aufgabe:
    'Sammelt Daten der A/D Wandler ein, bildet max und min für jeden Kanal
    'und gibt Daten über USB Port 4 bzw RS232 aus
    '
    '##############################################################
    
    'Diese Anweisung setzt die Fusebits automatisch korrekt (Syntax $PROG LB, FB , FBH , FBX )
    $prog , 255 , &B11011001 ,                                  'Quarz an / Teiler aus / Jtag aus
    
    $regfile = "m2560def.dat"
    $hwstack = 82                                               '80
    $framesize = 68                                             ' 64
    $swstack = 68                                               '44
    
    $crystal = 16000000                                         'Quarzfrequenz
    
    Config Pind.5 = Output
    Led Alias Portd.5
    
    $baud = 57600
    
    
    Const Tz = ","                                              ' Trennzeiche ist ein Komma
    
    Dim Kanal As Byte
    'Min Max Buffer
    Dim Adcmax(16) As Word                                      'Tabelle Maximum Werte
    Dim Adcmin(16) As Word                                      'Tabelle Minimum Werte
    Dim Adcakt(16) As Long                                      'Tabelle Aktueller Messwert
    Dim Index As Byte                                           'Zeiger auf Speicherplatz
    Dim Wert As Word
    Dim X As Single
    Dim Loop_counter As Long
    Declare Sub Printdata
    
    
    ' *** ADC ***
    Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1
    Start Adc
    
    
    
    '*** Hauptschleife ***
    
    Do
      For Loop_counter = 1 To 199 ' Anzahl der Messungen
    
          Led = 1
    
              For Kanal = 0 To 15
    
                          If Kanal > 7 Then Kanal = Kanal + 24  ' Wegen Bascom 1.11.9.1 Bug notwendig
                   Wert = Getadc(kanal)
                          If Kanal > 7 Then Kanal = Kanal - 24  ' Wegen Bascom 1.11.9.1 Bug notwendig
    
                   Kanal = Kanal + 1  ' Array ADCmax startet bei 1 und nicht bei 0
    
    
                   Adcakt(kanal) = Adcakt(kanal) + Wert
    
                   If Adcmax(kanal) < Wert Then Adcmax(kanal) = Wert
                   If Adcmin(kanal) > Wert Then Adcmin(kanal) = Wert
                   If Adcmin(kanal) = 0 Then Adcmin(kanal) = Wert       ' Wenn = 0 im Speicher (kleinster Wert) trotzdem überschreiben
    
                   Kanal = Kanal - 1
    
                   Next Kanal
    
    
         Next Loop_counter
    
    Gosub Printdata
    
    
    Loop
    
    
    
    
    
    
    Printdata:
    Led = 0
    
    For Index = 1 To 16
          Print Adcmax(index) ; Tz;                             ' Maximum Werte
          Adcmax(index) = 0
    Next Index
          Print "*" ;                                           ' Trennzeichen
    
          For Index = 1 To 16
          Print Adcmin(index) ; Tz;                             'minimum Werte
          Adcmin(index) = 0
    Next Index
          Print "A" ;                                           ' Trennzeichen
    
    For Index = 1 To 16
          X = Adcakt(index) \ 199
          Print Fusing(x , "####.#") ; Tz;
          Adcakt(index) = 0
    Next Index
    
    
    
    Loop_counter = 0
    
    Print                                                       ' CR & LF
    Return

  2. #2
    Benutzer Stammmitglied Avatar von kaktus
    Registriert seit
    17.05.2004
    Beiträge
    34
    Kann wirklich keiner helfen?

Berechtigungen

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