Hallo,
ich versuche, auf einem Mega32 (auf 14 MHz) mit Hilfe des analogen
Komparators eine Frequenz eines Dreieckssignals (etwa 3 kHz) zu messen.
Spitze-Spitze etwa 2,5V, auf GND referenziert. Daher habe ich die
interne Bandgap (etwa 1,35V) vom µC als Referenz geschaltet. Jedes Mal,
wenn das Dreieckssignal an dieser Spannung in einer Richtung (also
entweder immer die steigende oder immer die fallende Flanke)
vorbeikommt, will ich den Timer1-Capture auslösen, im Timer1 Capture
Interrupt den Wert auslesen und wieder auf das nächste Signal warten:
1 | volatile static unsigned short int Timer;
|
2 |
|
3 | ISR(TIMER1_CAPT_vect)
|
4 | {
|
5 | Timer = ICR1;
|
6 | }
|
7 |
|
8 |
|
9 |
|
10 | void Init(void)
|
11 | {
|
12 | unsigned char Temp;
|
13 |
|
14 | Temp = SREG;
|
15 | cli();
|
16 |
|
17 | ACSR |= ((1 << ACBG) | (1 << ACIC) | (1 << ACIS1)); // Comparator: Bandgap an +, Input Capture an, bei fallender Flanke
|
18 | TCCR1B |= ((1 << ICNC1) | (1 << CS10)); // Timer1: Noise Canceler an, Clock: 1:1
|
19 | TIMSK |= (1 << TICIE1); // Timer1: Input Capture Interrupt enable
|
20 |
|
21 | SREG = Temp;
|
22 | }
|
So weit, so gut, klappt in den meisten Fällen auch. Ich habe aber immer
wieder "Ausrutscher" drin, wo zwei aufeinanderfolgende Captures den
gleichen Wert des Timers zurückliefern. Wenn ich den Noise Canceler
aktiviere, wird das besser, aber nicht gut. Wie kann das sein? Ich würde
ja einen an der Spannungsgrenze springenden Komparator vielleicht noch
verstehen, aber wenn der Noise Canceler mit einer Verzögerung von 4
Takten dazwischen ist, kann es doch überhaupt nicht sein, dass 2 Events
den gleichen Wert liefern?