Go Down

Topic: Zählrichtung bei Timer5 mit externer Clock änderbar? (Read 386 times) previous topic - next topic

Doc_Arduino

#15
Jan 16, 2020, 04:11 pm Last Edit: Jan 16, 2020, 04:12 pm by Doc_Arduino
Nun ja, eigentlich sind es max. 168 Pulse auf dem gesamten Verfahrweg von etwa 50 mm. Das Ganze dauert bei maximaler Geschwindigkeit min. 2 s (also < 100 Hz). Aber ich habe bei sowas immer gerne ausreichend Reserve, daher gehe ich da bei der Auslegung weit über Abtasttheorem ran ;)
Dein Abtasttheorem gilt hier nicht, weil du zählst die Pulse an external Clock Source direkt.
Abtasttheorem wäre gültig wenn du mit fester Abtastfrequenz einen Pin abfragst, also in gleichen zeitlichen Abständen, unabhängig welches Signal gerade anliegt.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

MicroBahner

Wenn nur die Lötnacharbeit bleibt: Meiner Meinung nach würde ja für's Erste eine Drahtbrücke zwischen Pin47 und zB. Pin18 reichen, oder?
Ja, das würde reichen. Du kannst 2 Eingänge ohne weiteres parallel schalten.

Oder Du nimmst die Variante den Zählerstand bei Drehrichtungsumkehr auszulesen und zu nullen. Und je nach aktueller Drehrichtung werden die Zählerstände positiv oder negativ bewertet, wenn Du die aktuelle Position berechnest.
Gruß, Franz-Peter

Doc_Arduino

Hallo,

kann man sicherlich auch machen wenn die absolute Position beim hin- und herfahren egal ist, also nicht erhalten bleiben muss.

Nur mal ganz ehrlich, wer schaltet die Drehrichtung nur für das Programm von Hand um?
Das macht doch kein Mensch.
Wofür hat man den einen µC der alles automatisch erledigen kann wenn man ihn nur lässt.
Die manuelle Methode ist mindestens äußerst fragwürdig für mich.
Projektvorgaben hin oder her. Anders ausgedrückt, dass Projekt war von Anfang an Mist.

Ich hoffe nur für dich das die Vorgaben schon vorher klar umrissen waren und du jetzt nicht auf eigene Kosten rumeiern musst.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

MicroBahner

#18
Jan 16, 2020, 08:36 pm Last Edit: Jan 16, 2020, 08:36 pm by MicroBahner
?? ?? wovon redest Du?
Gruß, Franz-Peter

Doc_Arduino

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

maikscho

Hallo alle zusammen,
vielen Dank erstmal für die ganzen Tipps und Vorschläge.
Ich werde mich jetzt mal im Labor einschließen und alle Varianten durchprobieren. ^^

Ich melde mich nochmal, wenn ich mich vom Lösungsweg festgelegt habe.

Bis dann.
Flugzeugaussenbeleuchtungslampenlagerkistennagelherstellungsfabrikvorsitzender.

MicroBahner

#21
Jan 17, 2020, 09:03 am Last Edit: Jan 17, 2020, 09:56 am by MicroBahner
Worauf bezieht sich deine Frage?
Auf deinen Post #17. Da ist mir unklar, worauf Du dich beziehst, und was Du meinst.

kann man sicherlich auch machen wenn die absolute Position beim hin- und herfahren egal ist,
Was meinst Du da mit 'auch machen' ? Alle Versionen, sowohl die mit einer ISR über Pin18, als auch die Methode von DrDiettrich aus #2 erlauben die absolute Position zu bestimmen ( bei deinem Vorschlag mit dem einfach weiterzählen wüsste ich ehrlich gesagt nicht, wie das gehen soll )

Nur mal ganz ehrlich, wer schaltet die Drehrichtung nur für das Programm von Hand um?
Das macht doch kein Mensch.
Wo steht, dass das gemacht werden soll? Es war nur die Rede davon, dass die Drehrichtung auch vom µC gesteuert wird und daher im Programm jederzeit bekannt ist, in welche Richtung der Motor dreht.
Gruß, Franz-Peter

maikscho

Dein Abtasttheorem gilt hier nicht, weil du zählst die Pulse an external Clock Source direkt.
Abtasttheorem wäre gültig wenn du mit fester Abtastfrequenz einen Pin abfragst, also in gleichen zeitlichen Abständen, unabhängig welches Signal gerade anliegt.
Ja, du hast da natürlich recht XD. An der Stelle sollte man dann doch eher von Grenzfrequenzen sprechen.
Flugzeugaussenbeleuchtungslampenlagerkistennagelherstellungsfabrikvorsitzender.

maikscho

Hallo zusammen,
ich habe mal ein wenig herumprobiert, sowohl die Idee aus Post #2 funkioniert
Code: [Select]

.....
const byte DIRO = 49; //Ansteuerung Polwender links
const byte DIRC = 48; //Ansteuerung Polwender rechts
const byte HAL = 47;  //Inkremental Muss Pin47 sein, da dies der Zugang zu Timer5 für den Hardwarecount ist.
....
volatile int actPos = 0;
....
include <MsTimer2.h>

void HallISR()
{
const int Value=TCNT5;
TCNT5 = 0;
if(digitalRead(DIRC)) {actPos+=Value;}
if(digitalRead(DIRO)) {actPos-=Value;}
}

void setup() {
....
pinMode(HAL, INPUT_PULLUP);
pinMode(DIRO, OUTPUT);
pinMode(DIRC, OUTPUT);
.....

TCCR5A=0;        // reset timer/counter control register A
bitSet(TCCR5B ,CS52);  // Counter Clock source is external pin
bitSet(TCCR5B ,CS51);  // Clock on rising edge
TCNT5 = 0; //initialise Timer5

Serial.begin(115200);
MsTimer2::set(100, HallISR);
MsTimer2::start();
}

void loop() {
... <<Motoransteuerung usw. , dabei Setzen und Rücksetzen der Pins DIRO und DIRC>>..
}

 
als auch die Idee aus Post #3:
Code: [Select]

.....
const byte DIRO = 49; //Ansteuerung Polwender links
const byte DIRC = 48; //Ansteuerung Polwender rechts
const byte HAL = 18;
....
volatile int actPos = 0;
....
void HallISR() {
if(digitalRead(DIRC)) {actPos++;}
if(digitalRead(DIRO)) {actPos--;}
}

void setup() {
....
pinMode(HAL, INPUT_PULLUP);
pinMode(DIRO, OUTPUT);
pinMode(DIRC, OUTPUT);
.....
attachInterrupt(digitalPinToInterrupt(HAL), HallISR, RISING);
}

void loop() {
... <<Motoransteuerung usw. , dabei Setzen und Rücksetzen der Pins DIRO und DIRC>>..
}


Ich habe mich nach den Tests und Rücksprache mit den Projektpartner für die Lösung gemäß Post#2 entschieden. Hauptgrund war natürlich, dass man nicht an den Boards rumdoktern müsste. Außerdem ist es m.M.n. besser, wenn das Ganze über einen "kontrollierten" Timing-Interrupt mit 100 ms läuft. Bei Lösung nach Post #3 würde ja jedes mal, wenn ein Puls kommt, die ISR zünden.... Auch wenn diese ISR hier kürzer ausfällt, dürfte das ja trotzdem den Controller im ungünstigen Fall mehr belasten.

Vielen Dank an alle Tippgeber, ich habe somit die für mich optimale Lösung gefunden. Sofern jetzt nicht noch durch andere nachträgliche "Funktionswünsche" Kollisionen mit der Timer2-Library auftreten, ist das Ding in trockenen Tüchern.

Bis zum nächsten Mal
   der Maik :)
Flugzeugaussenbeleuchtungslampenlagerkistennagelherstellungsfabrikvorsitzender.

Mahimus

Was hier vielleicht schonmal gemeint war mit den Aussagen der anderen: nur weil du eine Drehrichtung vorgibst, heißt das nicht, dass das Teil sofort in die Richtung dreht. Das Teil hat eine Massenträgheit und fährt gegebenenfalls noch vorwärts, während du schon rückwärts zählst. Eine absolute Positionierung kannst du so wahrscheinlich nicht gewährleisten, weil sich Fehler einschleichen können.

Doc_Arduino

#25
Jan 17, 2020, 02:47 pm Last Edit: Jan 17, 2020, 06:24 pm by Doc_Arduino
Hallo,

das wird jetzt mühsam alles auseinanderzuklamüsern.

Ich hatte #16 als alleinigen Post betrachtet und bemerkt das damit die absolute Position verloren geht.

Meine Idee gleicht im Grunde der von #2.

Aber! Ich hatte #8 falsch verstanden. Ich dachte das die Information für die Drehrichtung von extern kommt. Schalter, Jumper, Usereingabe, was weiß ich. Ich wäre mit der Aussage nicht daraufgekommen das damit die interne Drehrichtungsänderung gemeint gewesen ist. Jetzt ist mir das auch klar und alles weitere nun auch.

Dennoch kann ich nur nochmal betonen das ein Drehencoder, einfach 2 Hallsensoren anbauen, die sinnvollere Lösung wäre. Warum? Weil man die Welle immer direkt überwacht um Blockierungen o.ä. mitzubekommen.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

MicroBahner

#26
Jan 17, 2020, 03:34 pm Last Edit: Jan 17, 2020, 03:35 pm by MicroBahner
Bei Lösung nach Post #3 würde ja jedes mal, wenn ein Puls kommt, die ISR zünden.... Auch wenn diese ISR hier kürzer ausfällt, dürfte das ja trotzdem den Controller im ungünstigen Fall mehr belasten.
Diese Belastung kannst Du getrost vernachlässigen. Der könnte da noch vieeel mehr ( ich weis wovon ich rede ;) ). Aber das Argument, die bereits vorhandenen Boards nicht ändern zu müssen ist natürlich durchschlagend.

Wobei ich nicht verstehe, wozu Du da den 100ms Timer Interrupt überhaupt brauchst. Die Lösung scheint mir auch nicht vollkommen wasserdicht, falls die Richtungsumkehr genau in dieses 100ms Intervall fällt.
Es reicht doch den Zähler auszulesen, wenn Du die aktuelle Position bestimmen willst ( Referenzposition +/- Zähler, je nach Richtung). Das Nullen von Timer5 und aktuelle Position als neue Referenzposition speichern musst Du nur machen, wenn Du die Drehrichtung des Motors änderst.
Gruß, Franz-Peter

maikscho

Hallo nochmal, ich wollte den Thread noch sauber abschliessen.
Die Lösung nach #2 ist auch vom Projektpartner so abgesegnet worden. :)

Um die Infos meinerseits/ unseres Projektes zu komplettieren:
Den Ausführungen zu den Problematiken der Achsdynamik pflichte ich voll bei. Glücklicherweise trifft mich bei dem aktuellen Projekt diese Sache nicht: Der Spindeltrieb treibt die Backe eines selbstentwickelten Elektrospanners an. Dort zählt einfach nur, den Spanner schnell zu schließen oder zu öffnen. Den "Lastfall" einer schnellen Richtungsumkehr wird es also (glücklicherweise :) ) nicht geben. Zwischen den Öffnen >> Schließen-Vorgang liegen min. 10 s Umrüstzeit, zwischen Schließen >> Öffnen bis zu 5 min Bearbeitungszeit.
Zusätzlich zur Spannkraft und den beiden Endlagen "voll geöffnet" und "voll geschlossen" soll der Hallsensor redundant zur Überwachung dienen:
Fall 01: Wird Motor angesteuert und am Hallsensor kommen keine weiteren Pulse/ zu langsam Pulse --> Stopp (Fehler Motor/-ansteuerung, Stromversorgung, Mechanik)
Fall 02: Kommen Pulse am Hallsensor, aber nach ausreichend Time-Out keine Endlage (vorn oder Hinten) --> Stopp (mech. Fehler/Versagen Spindel/ -mutter)

Neu dazu kam halt
Fall 03: Verfahrweg von "voll geöffnet" und "voll geschlossen" ist fast durchfahren --> Verfahrgeschwindigkeit drosseln, da bald Endlage erreicht!


Und für diese Szenarien hat sich die Lösung mit dem MsTimer2-ISR = 100 ms als völlig ausreichend gezeigt.

Ich danke allen Tippgebern nochmal vielmals.

 :) der Maik
Flugzeugaussenbeleuchtungslampenlagerkistennagelherstellungsfabrikvorsitzender.

Mahimus

Hallo nochmal, ich wollte den Thread noch sauber abschliessen.

Danke dafür, passiert selten genug.

Go Up