Hallo,
Ich weiß nicht genau wie ich anfangen soll.
Es geht darum, fortlaufend einen Puls zu generieren, der später dann als
Trigger für ein anderes Gerät dienen soll. Um den Puls zu generieren
verwende ich im Moment ein Arudino Leonardo Board.
Nun zu meinem Problem. Es ist leider nötig, das dieser Puls so wenig wie
möglich schwankt. So wenig wie möglich heisst, am besten garnicht.
Nun anfangs habe ich versuch den Puls einfach mit dem Delay von Arduino
zu realisieren.
Da kamen wenn ich es mir auf dem oszi angeschaut habe allerdings
schwankungen von bis zu 200µs raus. mein nächster schritt war es, den
Flankenwechsel mit einem Timer auszulösen (zb. alle 5ms) diesen hatte
ich dank eine library als interrupt fungieren lassen. da wurde es mit
der zeit auch schon bisschen besser (schwankungen zwischen 10 - 30 µs).
Leider ist das auch immer noch viel zu viel.
Also dachte ich mir, lass ich Arduino halt ganz beiseite. momentan sieht
meine Umsetzung also folgendermaßen aus:
1 | int pin = 10;
|
2 |
|
3 | void setup(){
|
4 | pinMode(pin, OUTPUT);
|
5 |
|
6 | noInterrupts();
|
7 | TCCR1A = 0; // TCCRx - Timer/Counter Control Register
|
8 | TCCR1B = 0;
|
9 | TCNT1 = 0;
|
10 |
|
11 |
|
12 | TCNT1 = 64911;
|
13 | TCCR1B |= (1 << CS10); // no prescaler
|
14 | TIMSK1 |= (1 << TOIE1); // compare interrupts OCIE1A
|
15 | interrupts(); // enable all interrupts
|
16 |
|
17 | }
|
18 |
|
19 | ISR(TIMER1_OVF_vect) // timer compare interrupt service routine TIMER1_COMPA_vect
|
20 | {
|
21 | TCNT1 = 64911;
|
22 | digitalWrite(pin, digitalRead(pin)^1); // toggle pin
|
23 | }
|
24 |
|
25 | void loop()
|
26 | {
|
27 | }
|
In der Version bekomme ich eine Schwankung von ca.7 - 8 µs allerdings
dachte ich dass ich durch das umgehen von Arduino doch auf eine
wesentlich konstantere Zeit kommen würde.
Hat irgendjemand eine idee was ich 1. Falsch mache bzw. 2. besser machen
könnte?
ps.: hab es auch schon versuch den Timer auf "vergleichen zu stellen
(CTC)" das hat allerdings wieder schlechtere Zeiten gebracht.
pss.: Ich hatte noch eine Idee allerdings fehlt es mir da an der
Umsetzung. Da es egal ist, wie lang die Pulse sind und es nur wichtig
ist, das die Steigenden Flanken 100% konstante Abstände haben: Kann ich
dem Arduino nicht irgendwie sagen "Geh jetzt hoch - geh jetzt runter -
mach eine gewisse zeit was du möchtest - geh aber gefälligst exakt da
wieder hoch " usw.
Ich hoffe man hat verstanden wo mein Problem bzw was meine Frage ist. Da
ich in dem Thema doch recht neu bin fällt es mir durchaus schwer immer
die richtigen und passenden Worte für alles zu finden :P