MCU: dsPIC30F4013
Ich habe ein rätselhaftes Problem bei einem Timer-2, dem ich mit Output
Compare verwende, um ein Steuersignal für ein SC Filter zu erzeugen.
Der Timer-2 wird bei Erreichen der angegebenen Periode (PR2 Register)
wieder auf Null gesetzt. Gleichzeitig ist das Output Compare Modul auf
Toggle gestellt, sodass bei jedem Match der zugeordnete Pin toggelt.
Der Timer(2) läuft geclocked mit 10MHz. Aufgrund des Toggelns ist die
erwartete Frequenz am OC-Pin
f(erwartet) = 10MHz/(2*PR2)
Nun habe ich dies mit verschiedenen Werten für PR2 ausprobiert:
1 | PR2 T (gemessen) T(erwartet) Verhältnis
|
2 | 10000 2,00E-03 0,002 1,00E+00
|
3 | 1000 2,00E-04 0,0002 9,99E-01
|
4 | 100 2,02E-05 0,00002 9,90E-01
|
5 | 20 4,20E-06 0,000004 9,52E-01
|
6 | 10 2,20E-06 0,000002 9,09E-01
|
7 | 5 1,20E-06 0,000001 8,33E-01
|
8 | 3 7,95E-07 0,0000006 7,55E-01
|
Wieso wird die Frequenz bei kleinen werten von PR2 deutlich kleiner als
der erwartete Wert?? Der Timer und das OC läuft ja autonom und nicht
firmwaregesteuert. Es gibt auch keinen aktivierten Interrupt. Eine
Verzögerung beim Erkennen des OC-Kriteriums müsste doch bei der
steigenden und fallenden Flanke gleichermassen zuschlagen. Wie kann man
die Frequnzänderung erklären?
Nur falls das hilft:
1 | T2CONbits.TON = 0;
|
2 | TMR2 = 0x0000;
|
3 | PR2 = t2_period;
|
4 | T2CONbits.TCKPS = t2_prescale; // = immer uaf 0x0, d.h. Prescale = 1
|
5 | OC1R = t2_period;
|
6 | T2CONbits.TON = 1;
|