Wann immer ich bisher mit den Timern Impulslängen gemessen hatte, waren immer deutliche Abweichungen in den Meßwerten.
Nun werkel ich gerade an eine eigene DCF-Decodierung welche letzendlich auf eine Hardware laufen die auf niedrige Taktrate und Energieeffizienz (Batteriebetrieb, gerne > 1 Jahr) optimiert ist.
Dachte zuerst an 1MHz Quarz an einem Mega328PB. Alternativ, weil 1MHz Quarze selten und ungenau sind (bis zu +-100ppm!) auch 4MHz Quarz mit DIV8 für 500kHz Taktfrequenz.
Aktuell bin ich aber noch bei der DCF-Decodierung an einem NANO (16MHz Resonantor) und aktivierter DIV8-Fuse für 2MHz Takt.
An INT0 hängt ein DCF1 von Pollin
Display All
Eine Zuordnung der Meßwerte ist problemlos möglich, aber die Abweichungen sind doch enorm...
Timer1 läuft mit 2MHz / 64 = 31,25kHz entsprechend mit 32µs Auflösung.
Impulslängen 100ms werden mit 2868-4726 (x32µs = 91,776 - 151,232ms) gemessen.
Impulslängen 200ms werden mit 6196 - 7918 (x32µs = 198,272 - 253,376ms) gemessen.
Impulspausen 800ms werden mit 23609 - 25166 (x32µs = 755,488 - 805,312ms) gemessen.
Impulspausen 900ms werden mit 27000 - 28415 (x32µs = 864,0 - 909,28ms) gemessen.
Impulspausen 1900ms werden mit 58574 - 59326 (x32µs = 1874,368 - 1898,432ms) gemessen.
Wie bereits erwähnt ist die Zuordnung durchaus klar trennbar, keine Meßwerte die zwischen diesen Bereichen liegen.
Dennoch frage ich mich wo die Ungenauigkeiten genau her kommen?
Klar, die NANO's haben einen ungenauen 16MHz Resonator drauf, nur hätte ich gedacht das der /8 Vorteiler den Fehler weitgehend kleiner hält.
Ebenso irritiert mich:
Addiere ich die Impulslängen mit dem darauf folgenden Pauselängen, welche beide ziemlich ungenau erfasst werden, lande ich erstaunlicher weise bei korrekten 996 - 1010ms
Display All
Sollwerte sollten eigentlich sein:
100ms mit Zählwert 3125
200ms mit Zählwert 6250
800ms mit Zählwert 25000
900ms mit Zählwert 28125
Wo sind diese Ungenauigkeiten begründet? Der ungenaue Resonator der NANO's oder eher Ausgabeungenauigkeiten (Flankenform?) der DCF-Empfänger?
Würde ja mein DSO mal dran hängen, wenn das nicht letzte Woche abgeraucht wäre.
Jürgen
Nun werkel ich gerade an eine eigene DCF-Decodierung welche letzendlich auf eine Hardware laufen die auf niedrige Taktrate und Energieeffizienz (Batteriebetrieb, gerne > 1 Jahr) optimiert ist.
Dachte zuerst an 1MHz Quarz an einem Mega328PB. Alternativ, weil 1MHz Quarze selten und ungenau sind (bis zu +-100ppm!) auch 4MHz Quarz mit DIV8 für 500kHz Taktfrequenz.
Aktuell bin ich aber noch bei der DCF-Decodierung an einem NANO (16MHz Resonantor) und aktivierter DIV8-Fuse für 2MHz Takt.
An INT0 hängt ein DCF1 von Pollin
BASCOM Source Code
- $regfile = "m328pdef.dat" 'ARUNDIO-NANO Prozessor
- $crystal = 2000000 'ARUNDIO-NANO Originalquarz 16MHz mit DIV8 auf 2MHz geteilt
- $hwstack = 400
- $swstack = 400
- $framesize = 600
- $baud = 9600
- Config Portb = &B00000000 'Pull Up Deaktiviert (0) oder aktiviert (1)
- Config Portc = &B00000000 'Pull Up Deaktiviert (0) oder aktiviert (1)
- Config Portd = &B00000000 'Pull Up Deaktiviert (0) oder aktiviert (1)
- Ddrb = &B11111111 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
- Ddrc = &B11111111 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
- Ddrd = &B11111010 'definieren der verwendeten Ports ( 1 = ausgang; 0= eingang)
- Dim 1word as Word
- Dim 2word as Word
- Dim I as byte
- Dim Neword as Byte
- Dim Msek as Word
- wait 5
- Print "Config Timer und INT0"
- Config Timer1 = Timer,Prescale=64 ' Timer 1 mit 2MHz / 64 = 31,25kHz entsprechend 32µs laufen lassen
- Config INT0 = Change
- Print "Ready"
- Timer1 = 0
- Enable INT0
- Enable interrupts
- On INT0 leseT
- Do
- If Neword = 1 then gosub Ausgabe
- Loop
- leseT:
- 2word = Timer1
- Timer1 = 0
- Neword = 1
- I = I + 1
- Return
- Ausgabe:
- Msek = 2word / 32
- Print "Zählwert: ";2word;" = ";Msek;"ms"
- Neword = 0
- Return
Eine Zuordnung der Meßwerte ist problemlos möglich, aber die Abweichungen sind doch enorm...
Timer1 läuft mit 2MHz / 64 = 31,25kHz entsprechend mit 32µs Auflösung.
Impulslängen 100ms werden mit 2868-4726 (x32µs = 91,776 - 151,232ms) gemessen.
Impulslängen 200ms werden mit 6196 - 7918 (x32µs = 198,272 - 253,376ms) gemessen.
Impulspausen 800ms werden mit 23609 - 25166 (x32µs = 755,488 - 805,312ms) gemessen.
Impulspausen 900ms werden mit 27000 - 28415 (x32µs = 864,0 - 909,28ms) gemessen.
Impulspausen 1900ms werden mit 58574 - 59326 (x32µs = 1874,368 - 1898,432ms) gemessen.
Wie bereits erwähnt ist die Zuordnung durchaus klar trennbar, keine Meßwerte die zwischen diesen Bereichen liegen.
Dennoch frage ich mich wo die Ungenauigkeiten genau her kommen?
Klar, die NANO's haben einen ungenauen 16MHz Resonator drauf, nur hätte ich gedacht das der /8 Vorteiler den Fehler weitgehend kleiner hält.
Ebenso irritiert mich:
Addiere ich die Impulslängen mit dem darauf folgenden Pauselängen, welche beide ziemlich ungenau erfasst werden, lande ich erstaunlicher weise bei korrekten 996 - 1010ms
Source Code
- Zählwert: 6980 = 225ms
- Zählwert: 24326 = 784ms = 1009ms
- Zählwert: 6860 = 221ms
- Zählwert: 24527 = 791ms = 1012ms
- Zählwert: 3573 = 115ms
- Zählwert: 27680 = 892ms = 1007ms
- Zählwert: 6914 = 223ms
- Zählwert: 24404 = 787ms = 1010ms
- Zählwert: 6639 = 214ms
- Zählwert: 24898 = 803ms = 1017ms
- Zählwert: 3163 = 102ms
- Zählwert: 27852 = 898ms = 1000ms
- Zählwert: 6656 = 214ms
- Zählwert: 24742 = 798ms = 1012ms
100ms mit Zählwert 3125
200ms mit Zählwert 6250
800ms mit Zählwert 25000
900ms mit Zählwert 28125
Wo sind diese Ungenauigkeiten begründet? Der ungenaue Resonator der NANO's oder eher Ausgabeungenauigkeiten (Flankenform?) der DCF-Empfänger?
Würde ja mein DSO mal dran hängen, wenn das nicht letzte Woche abgeraucht wäre.
Jürgen