
Zitat von
wkrug
Probier mal pro sekunde nur 8 aufeinanderfolgende Messwerte aufzuaddieren und das Ergebnis duch 8 zu teilen.
Ich glaub, so etwas hab ich schon gemacht und verworfen. Bevor ich die Säge wieder anschmeiße und Meßreihen dazu aufnehme
:meintest Du es so? ...
In einem Ringpuffer mit 8 Plätzen ( Middle( 8 ) ) werden 8 aufeinanderfolgende ICP Meßwerte, also der Abstand von einer Zündung zur anderen reihum abgespeichert.
Ist nach etwa einer Sekunde ein Update der Anzeige dran, wird der Mittelwert der letzten 8 Meßwerte gebildet und angezeigt. Siehe Code.
Code:
$regfile = "ATtiny2313.DAT"
$framesize = 24
$swstack = 24
$hwstack = 34
$crystal = 8000000
$baud = 57600
$lib "mcsbyteint.lbx"
Dim Icr_new As Word
Dim Icr_old As Word
Dim Icr_difference As Word
Dim Upmd As Dword
Dim Upm_o As Word
Dim Tov_count As Byte
Dim Middle(8) As Word
Dim Ar_idx As Byte
Dim Idx As Byte
Dim Diff As Dword
Dim Icp_alive As Byte
Dim Disp_upd As Byte
Dim Icp_events As Word
Print "Drehzahlmessung"
Tccr1b = Bits(cs11 , Ices1) 'prescaler = 8, input capture event on rising edge
On Timer1 Update_display
Enable Timer1
On Icp1 Get_icr
Enable Icp1
Enable Interrupts
Do
Loop
Get_icr: 'called by an ICP event
Incr Icp_events
Icr_new = Icr1 'save ICR register
Icr_difference = Icr_new - Icr_old
Icr_old = Icr_new
If Idx < 8 Then Incr Idx Else Idx = 1 'value into 8 elements ring buffer
Middle(idx) = Icr_difference 'value into 8 elements ring buffer
Icp_alive = 1
Return
Update_display:
Incr Tov_count
If Tov_count >= 15 Then 'display update in about 1s interval
Incr Disp_upd 'sequence number for display update
For Ar_idx = 1 To 8
Diff = Middle(ar_idx) + Diff 'add last 8 values before display upd
Next
Upmd = 480000000 / Diff 'calculate rpm 60.000.000/(diff/8)
Upm_o = Upmd
If Icp_alive = 0 Then Upm_o = 0
'Remark Print " " ; Chr(13) ; Upm_o ; Chr(13);
Print Disp_upd ; ": " ; Upm_o ; " " ; Icp_events
Tov_count = 0
Diff = 0
Icp_alive = 0
Icp_events = 0
End If
If Disp_upd = 60 Then Disp_upd = 0
Return
Lesezeichen