PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : schnelle A/D Wandlung von 16 Kanälen mit max/min Auswertung



kaktus
07.07.2008, 21:39
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.





' 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

kaktus
10.07.2008, 00:10
Kann wirklich keiner helfen?