Geachte Forum leden,
Ik gebruik een GPS NEO 6 met 1 PPS uitgang naar
een PIC 16F690. Alles draait goed, maar mijn oplossing kan
zonder uitmiddelen maar een resolutie aan van 4Hz op de 20MHz.
Ik ben gestart met uitmiddelen, maar wil minimaal 0,1 Hz halen
Is er een "slim" algorithme ?
Kun je een oplossing zodanig opschrijven dat ik er met BASIC
mee overweg kan.
STUK VERKLARING EN HUIDIGE CODE HIERONDER
pic basic code:
'; Wacht op extern interrupt van de GPS 1 x per seconde
'; start Timer1
'; Laat TIMER 1 vrijlopen
'; Na 76 keer TIMER 1 doorlopen te hebben
'; Staat er een getal in CCP1 gelijk aan TIMER 1
'; Wacht tot interrupt.
'; lees CCP1 uit , moet ongeveer 19264 zijn
'; BIJREGELING
'; Gebruik de timer 1 als PWM om de temperatuur te regelen.
'; Vergelijk Temp met timer1, als gelijk of groter is
'; dan PORTA.2 wordt hoog en daarmee het crystal
'; verwarmt.
'; Als CCP1 vroeger valt dan 19264 dan incr Temp
'; Gelijk dan geen verandering
'; Later dan decr Temp
CCPOLD = 19264
DelayMS 1000
Print At 1,1, "GPS Accurate"
PIR1 = %00000000
;Cls
'; start counting
Clear
While PIR1.2 = 0 ; wacht op eerste rising edge van CCP
Wend
TIMER1 = 0 ; Zet Timer1 op 0
PIR1.2 = 0 ; reset flag
PIR1.0 = 0
CCPNEW = 0
WACHT: ; Wacht loop
While PIR1.2 = 0 ; wacht op rising edge van CCP
Wend ; CCPNEW bevat TIMER 1 waarde
Xerror = (CCPNEW - CCPOLD - 19264) ; krijg error vergeleken met "perfect" xtal
PIR1.2 = 0;
CCPOLD = CCPNEW; ; neem nieuwe waarde over
; Xerror bevat afwijking t.o.v ideaal met een resolutie van 200nS
; Ideaal is 20.00000MHz
Inc Index ; Uitmiddelen van 8 seconden geeft resolutie van 0.5 Hz op 20 MHz
If Index = 9 Then Index = 1
Rot[Index] = Xerror
Rys = Rot[1] + Rot[2]
Rys = Rys + Rot[3] + Rot[4]
Rys = Rys + Rot[5] + Rot[6]
Rys = Rys + Rot[7] + Rot[8] ; Rys = 4x zo groot om van 5 Mhz naar 20Mhz te gaan
Print At 1,1 ,Dec Xerror, " HZ ", Dec Rys, " ", Dec Index
Print At 2,1 , Dec 20000000+ Rys/2 ," Hz", " v66 "
[Bericht gewijzigd door GJ_ op donderdag 20 februari 2020 16:57:35 (1%)