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 ...
David W. schrieb: > Ansteuerung eines Doppelpulsmessplatzes Ich lese da "Messplatz". Da stellt sich sofort die Frage nach Flexibilität, Genauigkeit, Wiederholbarkeit. Wieso keinen Pulsgenerator besorgen, z.B. hier: https://www.keysight.com/de/de/products/pulse-generator-products.html
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
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.
Danke für die Rückmeldungen, ich schaue mir alles an und prüfe welche Option am besten passt. MfG Daivd
Jester schrieb: > Ich lese da "Messplatz". Da stellt sich sofort die Frage nach > Flexibilität, Genauigkeit, Wiederholbarkeit. Wieso keinen Pulsgenerator > besorgen, z.B. hier: > https://www.keysight.com/de/de/products/pulse-generator-products.html Ich habe kein Angebot angefordert aber ich denke, das liegt nicht innerhalb meines Budgets.
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 --------- --------- -------------+ +-----+ +-----------------------
Die Timer der AtXmegas haben deutlich mehr Möglichkeiten als die klassischen Atmegas. Dort gibt es unter anderem einen Dual-Slope-PWM Modus. Daraus und bei 32MHz Takt sollte sich sowas in Software zusammenbauen lassen.
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); |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.