-
2^n-faches Oversampling reicht nicht, damit gewinnst Du nur ein halbes Bit. Da Du durch Überabtastung die Energie des Quantisierungsrauschens und nicht seine Amplitude verringerst, musst Du 2^2n-mal überabtasten!
Ob Du mit dem genannten Board was erreichst kann ich Dir nicht sagen, wenn kein systematischer Fehler eine Tendenz in die Messwerte bringt, so dass Du die Stoachastik nicht für Dich arbeiten lassen kannst, sollte es gehen.
Ich meinte die Schaltungsauslegung für einen externen ADU-Chip.
Der genannte Controller mit allem drum und drin kostet als komplettes Eval-Kit um die 80 Euro netto, für 300 bekommt man ein Devkit mit Echtzeitsimulator oder sowas.
-
Hallo Steffen,
dein Code ist etwas unübersichtlich und nicht sehr effektiv.
Ich würde es etwa so machen: (bitte nicht auf die Syntax achten)
For i = 0 To 7 (Schleife für 8 ADC-Eingänge)
Summe(i) = 0 (löschen)
For n = 0 to 15 (Schleife für 16faches oversampling)
Summe(i) =Summe(i)+ GetADC(i)
next n
Zwölfbitwert(i)=Summe(i)/4 (oder "shift right 2")
next (I)
Im Feld "Zwölfbitwert(i)" hast du dann die Ergebnisse aller Eingänge mit 12bit Auflösung, also 4096 Schritten,
alles weiter hängt davon ab, was du damit machen willst.
Gruß, Rene
-
danke rene,
ich muß sagen trotz deiner enormen anstrengen mir zu helfen fehlen mir einfach zu viele Kenntnisse um es hinzubekommen. Ich habe es jetzt mal versucht in eine Programm umzusetzen dieses wurde auch fehlerfrei kompiliert aber es kommt irgendwie nur mist dabei raus. Ich habe den Eindruck das er den analogport nun irgendwie gar nicht mehr berücksichtigt.
Auf der RS232 spuckt er mir nun periodisch dies aus :
565
65
65
65
65
65
65
6565
Hier ist der Code den ich versucht habe
Code:
' ------------- Hier die üblichen RN-Control Anweisungen --------------
$regfile = "m32def.dat"
$crystal = 16000000 'Quarzfrequenz
$baud = 38400
Config Adc = Single , Prescaler = Auto
Config Porta = Input '
' Port A als Anlogeingang konfigurieren
Start Adc
Dim Summe(64) As Byte
Dim I As Single
Dim N As Single
Dim Zwoelfbitwert(64) As Byte
For I = 0 To 7 'Schleife für 8 ADC-Eingänge
Summe(i) = 0 ' löschen
For N = 0 To 15 ' Schleife für 16faches oversampling
Summe(i) = Summe(i) + Getadc(i)
Next N
Print Zwoelfbitwert(i) = Summe(i) / 4
Waitms 500
Next I
Vermutlich sind die Datentypen oder die Array Zuweisungen falsch.
Gruß
Steffen
-
Sowohl Summe als auch Zwölfbitwert müssen(!!!) schon Integertypen oder Word sein, Byte geht nur bis 256 Werte. Du brauchst aber min 16000!
Dafür kannst du für N und I aber Byte nehmen.
Lasse zum Testen die äußere Schleife weg, aslo nehme nur ein einzigen ADC Eingang.
Gruß, Rene
-
Ich nochmal,
wenn ich mich recht entsinne geht bei Bascom das hier nicht:
Print Zwoelfbitwert(i) = Summe(i) / 4
Du musst erst
"Zwoelfbitwert(i) = Summe(i) / 4 " rechnen lassen dann erst:
"print Zwoelfbitwert(i)"
Aber lasse erstmal die (i) weg, und arbeite nur mit einem ADC,
Gruß, Rene
-
so ich habe es nochmal mit deinen Verbesserungsvorschlägen probiert aber es liefert leider keine Anzeige auf der RS232.
Ich habe nun selber mal versucht ein Programm zu schreiben welches aus 16 Messwerten die Summe errechnet und dann durch 16 dividiert aber ob das was bringt ist mir ein Rätsel.
Jedenfalls sieht es jetzt so aus :
Code:
' ------------- Hier die üblichen RN-Control Anweisungen --------------
$regfile = "m32def.dat"
$crystal = 16000000 'Quarzfrequenz
$baud = 38400
Config Adc = Single , Prescaler = Auto
Config Porta = Input '
' Port A als Anlogeingang konfigurieren
Start Adc
Dim Summe As Word
Dim I As Word
Dim N As Word
Dim Summegeteilt As Word
Dim A As Word
A = Getadc(0)
Summe = 0
For I = 0 To 15
Summe = Summe + A
If I = 15 Then
Summegeteilt = Summe / 16
Print "Die Summe wäre: " ; Summegeteilt
End If
Waitms 100
'Print Summe
Next I
Ist das vom Prinzip her richtig ?
Gruß
Steffen
-
Hallo, das hier ist getestet und funktioniert einwandfrei:
Dim I As Byte
Dim Summe As Word
Dim Zwoelfbit As Word
Dim Zehnbit As Word
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc
Do
Summe = 0
For I = 0 To 15
Zehnbit = Getadc(0)
Summe = Summe + Zehnbit
Next
Zwoelfbit = Summe / 4
Print Zwoelfbit
Loop
-
Hallo Mosi,
danke dir für die enorme Hilfe. Nun habe ich noch eine Verständnisfrage zur Summe die du durch 4 teilst.
Wenn ich nur den reinen Mittelwert haben möchte dann teile ich wieder durch 16 das ist klar und wenn man dann durch 4 teilt dann habe ich wohl die 4096 Werte die 12 Bit entsprechen ?
So ganz mit dem Teilungsfaktor habe ich das noch nicht verstanden.
Bis jetzt läuft das Programm einwandfrei. Mit den Arrays bin ich zwar nicht klar gekommen aber es geht auch ohne Arrays ganz gut.
Gruß
Steffen
-
Nein, dann hast Du einen mit vier multiplizierten 10bit-Wert, die letzten beiden bits sind Augenwischerei, selbst bei vorausgesetztem stochastischen Eingangssignal wirst Du nie 12bit-Monotonie hinbekommen.
-
@shaun
meinst du ich hätte mir die Arbeit sparen können ?
Das ich eine Mittelwertbildung habe die mir zumindest ein paar Schwankungen kompensiert sehe ich ja ein. Ich denke das hilft zumindest nur ein klein wenig.
Wo es gar kein Sinn machen würde ist wenn ich einen Meßwert habe der nicht schwankt da hab ich so oder so 10 Bit.
Ich hätte ja noch die option 2 Analogeingänge gleichzeitig zu beschalten und daraus den Mittelwert zu bilden aber letztendlich vermute ich das das nur Augenwischerei ist und nichts bringt.
Nun ja momentan habe ich das ganze Prinzip des hier vorgestellten Codes selber noch nicht 100% verstanden.
Vieleicht kennt ja doch jemand eine eindeutige Antwort ... den Sinn und Nutzen hätte ich nun schon noch irgendwie feststellen wollen.
Gruß
Steffen