Ansteuerung Doppelpulsmessplatz

OP #7037960
Lesenswert?
• ▲
▼
Hallo zusammen,
ich versuche gerade eine Ansteuerung eines Doppelpulsmessplatzes zu
schreiben.
Ich bin mir nicht ganz sicher ob ich das mit dem mega328p und C++
realisieren kann.

Ziel soll die einstellung der Pulse/Totzeit auf < 1us sein.

_____||||||_____||||||_____
     |<1us|<1us |<1us|

Ich frage mich ob ein switch/case dafür schnell genug ist. Denkt ihr das
kann Funktionieren?

Mein Ansatz ist:
Timer1 im CTC mode;
...
  case 20:
    TCCR1A = 0bXXXXXXXX; //A ein, CTC
    TCCR1B = 0bXXXXXXXX; //A ein, CTC
    OCR1A= 10;     //erster Puls auf 10 Takte
    break;
  case 21:
    OCR1A= 10;     //Totzeit auf 10 Takte
    break;
  case 22:
    OCR1A= 10;     //zweiter Puls auf 10 Takte
    break;
  case 23:
    TCCR1A = 0b00000000; //A aus, normal port operation
    break;
  }
}
ISR (TIMER1_OVF_vect){
  ov_counter+=1;        //hochzählen bei overflow
...
Gast #7038117
Lesenswert?
• ▲
▼
Hallo David,
im Anhang ein Ausschnitt von meinem Doppelpulsgenerator.
Ich steuere mit meinem uC einen 3fach-Timmer 82C54-10 an und verknüpfe 
die Ausgangssignale. Kann damit sauber Signale im ns und us ausgeben. 
Über IC11/13 gebe ich noch das Trig-Out aus.

Gruß
Walter
Angehängte Dateien:
Gast #7039914
Lesenswert?
• ▲
▼
Hallo,
Der  ATMega hat beim Timer 1 ein zusätzliches Vergleichsregister. Der 
Arduino
DUE ist viel schneller und mit der Library  TimerONE kannst Du ein 
Programm schreiben, das auf Mega und DUE läuft.
Gast #7039977
Lesenswert?
• ▲
▼
Du könntest Timer 1 nehmen, im Phase and frequency correct Modus, OC1A 
auf 3us und OC1B auf 1us stellen und beide Ausgänge per Exor verknüpfen. 
Also so:


OC1A         -----------------------
-------------+                     +-----------------------

OC1B                 -------
---------------------+     +-------------------------------


Ausgang      ---------     ---------
-------------+       +-----+       +-----------------------
#7040037
Lesenswert?
• ▲
▼
David W. schrieb:
> Ziel soll die einstellung der Pulse/Totzeit auf < 1us sein.
>
> _____||||||_____||||||_____
>      |<1us|<1us |<1us|
>
> Ich frage mich ob ein switch/case dafür schnell genug ist. Denkt ihr das
> kann Funktionieren?

Nicht so wirklich. Dein Ansatz, zumal noch mit Interrupt, 
funktioniert bei den kurzen Zeiten nicht. Wenn man solche recht kurzen 
Pulse erzeugen will, nimmt man entweder die Output Compare Funktion der 
Timer oder Assembler.  Zur Not kann man es mittels einiger 
Hilfsfunktionen der libc machen, hab ich vor kurzem getan.

Schau in die Doku zu den Funktionen bzw. Macros _delay_loop_1() und 
delay_loop_2(). Dann noch die IOs direkt per Registerzugriff setzen und 
nicht per digitalWrite() und man kommt in den Bereich von 1us, ggf. 
etwas darunter.
1
PORTD |=  (1<<PD2);
2
_delay_loop_1(5);
3
PORTD &= ~(1<<PD2);
4
_delay_loop_1(5);
5
PORTD |=  (1<<PD2);
6
_delay_loop_1(5);
7
PORTD &= ~(1<<PD2);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 4 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.