Hallo Neutro,
habe gerade keine Hardware hier, also ist der Code ungetestet - kannst ja mal versuchen.
Analogeingang0 wird alle 800µs eingelesen.
wenn der Wert größer 2,5V also größer 512 ist, wird er zur Variable Mittelwert gerechnet.
gleichzeitig wird gezählt, wie oft gemessen wurde.
ist der Analogeingang0 gleich 512 oder kleiner, wird mit den vorher gemessenen Werten gerechnet,
d.h. Variable Mittelwert / Zaehler(wie oft gemessen wurde)
Danach wird das Ergebnis über RS232 ausgegeben($baud = 19200 )
Code:
'Wechselspannung messen / STFan 12.02.2012
'-------------------------------------------------------------------------------
'Konfiguration µC:
$regfile = "m8def.dat" 'AT-Mega8
$crystal = 8000000 '08 MHz
$baud = 19200
'-------------------------------------------------------------------------------
'8Bit Timer0: 50Hz bei 1Sekunde -> 20ms -> 25 Messungen in 20ms -> alle 0,8ms eine Messung also 1250 Messungen pro Sekunde
Config Timer0 = Timer , Prescale = 64
On Timer0 Timer0_isr
Const Timer0vorgabe = 156
Enable Timer0
Enable Interrupts
'-------------------------------------------------------------------------------
'Ein- Ausgänge:
Config Portc = Input
'-------------------------------------------------------------------------------
'Analogmessung
Config Adc = Single , Prescaler = Auto , Reference = Avcc
'-------------------------------------------------------------------------------
'Variablen
Dim Analog0 As Word
Dim Zaehler As Byte
Dim Mittelwert As Integer , Mittelwert2 As Single
Dim Merker As Byte 'Merker = 0 = analogwerte werden eingelesen
'Merker = 1 = Werte wurden berechnet
'Merker = 2 = Werte wurden ausgeben
Dim Spitzenwert As Single
Dim Effektivwert As Single
'-------------------------------------------------------------------------------
'Programm
Do
If Merker = 1 Then
Print "Mittelwert2: " ; Mittelwert2 'Ausgabe des Mittelwert2
Spitzenwert = Mittelwert2 * 1.571 'berechnen Spitzen wert
Print "Spitzenwert: " ; Spitzenwert
Effektivwert = Spitzenwert / 1.414 'berechnen Effektivwert
Print "Effektivwert: " ; Effektivwert
Merker = 2
End If
Loop
'_______________________________________________________________________________
'...............................................................................
Timer0_isr:
Timer0 = Timer0vorgabe
Start Adc
Analog0 = Getadc(0) 'Analogwert messen
Stop Adc
If Analog0 > 512 Then
Incr Zaehler
Mittelwert = Mittelwert + Analog0
Merker = 0
Else
If Merker = 0 Then
Merker = 1 'Damit nach den Messungen nur einmal der Mittelwert berechnet wird!
Mittelwert2 = Mittelwert / Zaehler 'Effektivwert berechnen
Zaehler = 0 'Variable zurücksetzen
Mittelwert = 0 'Variable zurücksetzen
End If
End If
Return
Lesezeichen