www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Capture mit Analog Comparator


Autor: Hundertvolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
volatile static unsigned short int Timer;

ISR(TIMER1_CAPT_vect)
{
  Timer = ICR1;  
}



 void Init(void)
 {
 unsigned char Temp;
 
 Temp = SREG;
 cli();
 
 ACSR |= ((1 << ACBG) | (1 << ACIC) | (1 << ACIS1));      // Comparator: Bandgap an +, Input Capture an, bei fallender Flanke
 TCCR1B |= ((1 << ICNC1) | (1 << CS10));            // Timer1: Noise Canceler an, Clock: 1:1
 TIMSK |= (1 << TICIE1);                    // Timer1: Input Capture Interrupt enable

 SREG = Temp; 
 }

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?

Autor: Hundertvolt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
interessant... mit einem externen Komparator und Anschluss an den 
ICP1-Pin gibt es die Probleme nicht... ich würde aber gerne den internen 
Komparator nutzen! Ideen?

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ideen?

Externe Referenz über Spannungsteiler, der von einem Portpin leicht 
verstellt wird, wodurch eine Hysterese entsteht.

Also:
- Externe Referenz mit Spannungsteiler zwischen GND und Vcc erzeugen.
- Von einem weiteren Portpin (Ausgang) einen Widerstand zum Spannungs-
  teiler, der die Referenz geringfügig verschiebt.
- In der ICP-ISR den zusätzlichen Pin umschalten und damit die Referenz
  in Gegenrichtung verschieben (Schmitt-Trigger-Verhalten).

Oder:
- Externe Referenz mit Spannungsteiler zwischen GND und Vcc erzeugen.
- Mit internem PullUp-Widerstand diese Referenz geringfügig anheben.
- In der ICP-ISR den internen PullUp an der Referenz ein/aus schalten.

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.