Forum: Mikrocontroller und Digitale Elektronik Arduino Uno pulseIn() Alternative


von Manuel B. (bassblaster)


Angehängte Dateien:

Lesenswert?

Guten Abend,
Ich habe mich erst heute hier angemeldet, und muss euch gleich mit einer 
Frage nerven.

Ich habe vor meine selbst gebaute Frässpindel über den Computer 
anzusteuern, komme aber mit dem Programm einfach nicht auf eine Lösung 
meines Problems. Im Anhang ist ein Bild ("kurzpuls") mit dem 
Eingangssignal, von dem ich den Abstand zwischen den Hochpunkten wissen 
will. ( die Länge des Hochpunktes sind 4us, die länge zwischen den 
Punkten ca. 5ms.)

Normalerweise würde das ja mit pulseIn() funktionieren (damit werden die 
Pulse in der Tat korrekt ausgemessen), aber der Rest meines Programms 
wird blockiert und die Spindel läuft nicht an. Nebenbei: das 
Ausgangssignal ist gleich wie das eines Servos.

Später wir das Programm dann auf einem Attiny 44 laufen, das schränkt 
mich leider doch etwas ein.

Dieser Code, den ich geschrieben habe ist leider etwas träge und kann 
nur Pulse ab einer länge von ca. 2ms verarbeiten (siehe Bild "Langpuls" 
im Anhang, da ist die Pulslänge ca. 2ms) :
1
int steppin = 11;
2
unsigned long start = 0;
3
unsigned long interval = 0;
4
int b = 0;
5
6
void setup() 
7
{ 
8
  Serial.begin(9600);
9
  pinMode(steppin,INPUT);
10
} 
11
 
12
void loop()
13
{
14
  if((digitalRead(steppin) == LOW)&&(b == 0))
15
  {
16
    start = micros(); //Startpunkt setzen
17
    b = 1;            //weitere Ausführung der ersten if funktion unterbinden
18
  }
19
20
  if((digitalRead(steppin) == HIGH) && (b == 1))
21
  {
22
    interval = micros() - start;    //Hier wird die gefragte Pulslänge berechnet
23
    b = 0;                          //weitere Ausführung der zweiten if funktion unterbinden
24
    Serial.println(interval);
25
  }
26
  
27
}

Kann da jemand weiterhelfen?

MfG Bassblaster

von Carl D. (jcw2)


Lesenswert?

Tiny44 hat im 16-Bit Timer1 ein Capture-Register. Damit kann man z.B. 
wenn Timer1 mit 1MHz läuft externe Ereignisse auf die μs genau 
auswerten.

von Matthias M. (Firma: privat) (quadraturencoder)


Lesenswert?

Du musst einen externen Interrupt nutzen, der auslöst, sobald der Input 
sich ändert. Mit dem besagten Timer kannst Du dann die Pulsbreite genau 
bestimmen. Du kannst sogar den externen Interrupt nutzen, um den Timer 
automatisch zu stoppen. So hast Du die Pulsbreite immer genau gemessen, 
ohne einen einzigen Taktzyklus zu verschwenden:

https://www.arduino.cc/en/Reference/AttachInterrupt

von Manuel B. (bassblaster)


Lesenswert?

Danke schon mal für die Antworten,
ich war mir nicht sicher, ob AttachInterrupt dann auch am Attiny 
funktioniert. Weil ich bisher nur Code im Stil wie im Beispiel 
geschrieben habe, muss ich mir jetzt die Avr Programmierung wohl etwas 
genauer ansehen. Da ich den Arduino als Programmer verwende, und ich 
auch die Arduino IDE verwende, stellt sich mir die Frage, ob das 
geschrieben Programm dann auch ohne Probleme auf den Attiny übertragen 
wird.

MfG Bassblaster

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
Noch kein Account? Hier anmelden.