Arduino Uno pulseIn() Alternative

OP #4403017
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
Angehängte Dateien:
(Firma: privat) #4403556
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
OP #4403576
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

Antwort schreiben

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.

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.