Guten tag allerseits hab mal wieder ne bastlerei ausgefasst es geht um ein hubsystem mit 3 motoren, die per pulsweite gefahren werden, motoren drehen max 3000rpm und müssen im anfahr und bremsbetrieb auf drehzahl nur geprüft werden, denn bis dato funktioniert dieses hubsystem einigermassen ich habe mittels einem atmega 2560 auf dem mega board bereits was programmiert (arduino software) Ich mache einen timer mit 16 bit im ctc mode zum auslöser einer interrupt -> also zeitfenster...mit oszi dann genaues zeitfenster von 0,05sec eingestellt da die drehzahl niedrig ist, ist dann mittels externem interrupt das hochzählen zu ungenau, weil ja beim bremsen teilweise für 2-3sec mit unter 500rpm gefahren wird.... zeitfenster klein, frequenz niedrig, hochzählen sinnlos....habe da messfehler von bis zu +/-40% Leider ist auf dem Mega Board nicht alles ausgeführt an möglichen anschlüssen....also, timer0 ist reserviert für system, timer1 verwendet schon ne andere sache, timer2 hat nur 8 bit und keinen ICR timer 3,4,5 wären toll, aber die ICPs sind nicht alle zugänglich am Board wieder einmal für nen Elektrotechniker etwas zu wenig Wissen hat wer eine idee? falls ich noch unzureichend infos da gelassen hab, bitte nicht lynchen....hab mal eben schnell bestand aufgenommen hier
Was du gerade merkst, das ist das die beiden Messmethode * fixes Zeitfenster, zählen der Pulse in diesem Zeitfenster * variables Zeitfenster durch die zu messenden Pulse, fixen schnellen Basistakt zueinander 'reziprokes' Verhalten haben. soll heissen: wo die eine Methode ungenau wird, wird die andere genauer. Und umgekehrt. Wenn du an ICP nicht rankommst, dann musst du eben dein Capturing 'händisch' machen. Deine jetzige Messmethode liefert dir ja zumindest einen groben Wert. Wenn du anhand dieses Wertes erkennst, dass du dich im ungenauen Bereich bewegst, dann stellst du die Strategie um: Dein Timer liefert dir nicht mehr das Zeitfenster von 0.05s sondern du konfigurierst um auf ordentlich Speed. Dafür fungiert der externe Interrupt nicht mehr als 'Antrieb' für den Zähler sondern als Marke für das Zeitfenster, in dem du den Timer laufen lässt. Der Zählerstand im Timer verrät dir dann, wie lange dieses Zeitfenster war. -> Beide Messmethoden implementieren und bei Bedarf umschalten. Ob Bedarf ist oder nicht erkennst du am jeweiligen Zahlenwert des Messergebnisses.
Ich fasse zusammen: 3 Motoren auf Drehzahl prüfen. Du hast dir eine Systemclock mit 20Hz gebaut. Du zählst die Pulse in den 50µs und berechnest dann die Drehzahl draus. Bei Langsamen Drehzahlen macht man es Anders rum man Zählt die Zeit zw. 2 Takten. Du Zählst also in deiner System Uhr 3 Variablen (8 Bit breit(geht bis 0,08 Hz runter)) hoch bis der Interrupt kommt kopierst den Wert der passenden Variable in um und setzt das Original auf 0, somit hast du dann die Zeitmessung von vorne begonnen. Und für die Höheren Frequenzen nimmst du deine Alte methode. MfG ich
ich schrieb: > nimmst du deine Alte methode. Oh ha. Hab schon den Eröffnungsthread nicht verstanden.
} a es geht darum, dass nach jeder 10.fahrt die hubvorrichtung resettet werden muss, weil ja nicht immer gut ausbalanciert auf-ab gefahren wird was hält ihr davon? bin eben nicht sicher, ob ich da mit dem pin18 (int3) mit der einstellung selbiges, wie mit dem icp bewirke das ganze müsst ich für 3 motoren machen... Die funktionen dann in der loop aufrufen brauch ich diese flags auch? Also, die indikatoren, ob was zu tun ist, oder nicht? ANSCHLUSS AN DIGITAL PIN 18 passt?
1 | volatile unsigned int starttime_rear=0; |
2 | volatile unsigned int endtime_rear=0; |
3 | volatile unsigned int overflow_rear=0; |
4 | volatile unsigned float frequency_rear; |
5 | |
6 | |
7 | cli(); |
8 | TCCR3B = 0; |
9 | TCCR3B = (1<<ICES3)|(1<<CS30); |
10 | TIMSK3 = (1<<ICIE3)|(1<<TOIE3); |
11 | sei(); |
12 | |
13 | |
14 | |
15 | ISR(TIMER3_CAPT_vect) |
16 | {
|
17 | static unsigned int first_rise=1; |
18 | if(first_rise==1) |
19 | {
|
20 | starttime_rear=ICR3; |
21 | nroverflows_rear=0; |
22 | first_rise=0; |
23 | |
24 | }
|
25 | else
|
26 | {
|
27 | endtime_rear=ICR3; |
28 | first_rise=1; |
29 | }
|
30 | }
|
31 | |
32 | ISR(TIMER3_OVF_vect) |
33 | {
|
34 | nroverflows++; |
35 | }
|
36 | |
37 | |
38 | void Frequency_rear() |
39 | {
|
40 | frequency_rear=(nroverflows_rear*65536.0) + endtime_rear - starttime_rear; |
41 | frequency_rear=8000000.0/frequency_rear; |
:
Bearbeitet durch User
Ich würde mir das ganze so per Vorteiler einrichten, dass ich die Overflows nicht berücksichtigen brauche. Denn erstens brauch ich die Drehzahl nicht auf Tausendstel U/Min genau. Und zweitens ist diese Drehzahl sowieso nur für den Bruchteil einer Sekunde gültig. Schliesslich beschleunigen bzw. bremsen die Motoren ja gerade, was die Aussagekraft einer maximal genauen Drehzahl auf 47 Nachkommastellen dann doch etwas limitiert. Zumindest die Kommastellen 45 und 46 sind dann ein klein bischen zweifelhaft wenn einige Physiker recht haben und die Zeit auch gequantelt ist :-)
:
Bearbeitet durch User
Hallo, wie wird die Hubvorrichtung geresettet? weil wenn das nur ein in Refposition fahren ist, würde ich den Taster/Schalter mit der die Vorrichtung betätigt wird nehmen und dann einfach Zählen. wenn Bei 10 dann ab in Refposition und fertig. MfG ich
gartler p. schrieb: > } > a es geht darum, dass nach jeder 10.fahrt die hubvorrichtung resettet > werden muss, weil ja nicht immer gut ausbalanciert auf-ab gefahren wird Ich seh hier keinen Zusammenhang mit einer unbedingt notwendigen Drehzahlmessung.
Die hubvorrichtung muss momentan per hand resettet werden, denn nach 10 fahrten stoppt sie einfach und dann muss man brutal mit 1 schalter für alle 3 motoren nach unten gefahren werden...das kann dann sein, dass 2 motoren unten sind, einer noch nicht ganz...die 2 haben sozusagen schon kurzschluss, einer fährt unsaubere lösung und anschlagtaster kann man hier aus platzgründen nicht adaptieren und wenn man bedenkt, dass es 14m fahrhöhe sind....naja, die asm sind nicht exakt gleich schnell....eh klar aber was kann man zu meiner codelösung anmerken? hab kompiliert...paar Variablenfehler hab ich schon korrigiert aber generell brauch ich die ICPs für diese art der interrupts oder kann ich alternativ die pins selber so abfragen?
gartler p. schrieb: > Die hubvorrichtung muss momentan per hand resettet werden, denn nach 10 > fahrten stoppt sie einfach und dann muss man brutal mit 1 schalter für > alle 3 motoren nach unten gefahren werden...das kann dann sein, dass 2 > motoren unten sind, einer noch nicht ganz...die 2 haben sozusagen schon > kurzschluss, einer fährt > > unsaubere lösung Ich seh immer noch nicht, wozu man da jetzt die Drehzahl brauchen würde. Das läuft doch, wenn ich es richtig verstanden habe, darauf hinaus, Motorstillstand zu detektieren. Oder wie definiert sich 'eine Fahrt'? Motorstillstand ist aber leicht. Wenn in einem bestimmten Zeitintervall vom Motor kein einziger 'Ich drehe noch'-Puls kommt, dann steht er wohl. Ob der im Maximum mit 2800U/min oder mit 2750U/min dreht, ist mir da doch völlig Banane. > aber was kann man zu meiner codelösung anmerken? Ja. Schön kopiert. > brauch ich die ICPs für diese art der interrupts oder kann ich > alternativ die pins selber so abfragen? Du kannst auch selber abfragen. Ist halt alles nur eine Frage, wie genau es sein muss. Und genau das stelle ich erst mal in den Raum.
:
Bearbeitet durch User
Wie genau es sein muss: Bei 10 fahrten je nach last steht das teil sichtbar schief...3cm bei der schiene gemesssen da hier einige 100kg bewegt werden, mitunter stahlwalzen, kann man sich vorstellen, dass das gefährlich werden kann die uralten motoren da sind auch n risiko investiert werden soll nix mehr, kein geld für umbauten ist da inkrementalgeber und fu wären sonst toll ich will nur, dass bei der fahrt nach unten die drehzahl überwacht wird, eine korrektur wird dann nach jeder fahrt selbständig vorgenommen ..und nur bei leerfahrten will ausserdem ein paar daten mitschreiben lassen, dann sehen wir mal weiter gut kopiert...des passt schon ich muss diese routine in meinen kopf kriegen und verarbeiten wie spreche ich die pins denn so an? oder ist bereits alles richtig konfiguriert? wie gesagt, die icps sind nicht zugänglich
Was willst du mit den Drehzahlen aller Motoren anfangen? Willst Du daraus dann die absoluten Positionen ermitteln und dann ggf. einen Motor nachstellen? Das wird nicht gehen, denn die berechnete Position wird mit der Zeit immer stärker von der realen abweichen. Grundsätzlich anderer Ansatz: Einen Beschleunigungssensor an der Plattform befestigen. Wenn diese still steht, kann die Richtung der Erdbeschleunigung gemessen werden. Daraus kann man die absolute Schieflage ermitteln und einen Motor nachstellen - bis alles wieder gerade ist.
Thomas Z. schrieb: > Grundsätzlich anderer Ansatz: > Einen Beschleunigungssensor an der Plattform befestigen. Wenn diese > still steht, kann die Richtung der Erdbeschleunigung gemessen werden. > Daraus kann man die absolute Schieflage ermitteln und einen Motor > nachstellen - bis alles wieder gerade ist. Das halte ich für eine vernünftige Idee. Dem TO gehts doch eigentlich nicht um Drehzahlen oder ähnliches. Er will, daß die Platform nicht schief hängt. Also sollte man genau das messen und in Ordnung bringen. Zur Not einfach ein "altes" Smartphone mit Doppelklebeband an die Platform und ne App geschrieben. MfG Klaus
Das mit platform schief geht sogar einfacher, weil am motor bereits anzeigen für stromverbrauch sind....bei dem gewicht sieht man sogar schon bei solchen abweichungen einen unterschied, wenn man sie vorher abliest und vergleicht ich wollte auch nicht in fahrt die motoren aus und einschalten...das ist bei solch alten motoren nicht gerade die feine art aber inzwischen hab ich nach eeewigen einstellversuchen die richtigen registereinstellungen gefunden cli(); GICR=(1 <<INT1); MCUCR=(1 <<ISC11); TCCR1B=(1 <<CS10); TIMSK=(1<<TICIE1)|(1 <<TOIE1); sei(); Dann eine ISR(INT1_vect) und eine ISR(TIMER1_OVF_vect) Aber kann mir einer sagen, warum gegenüber dem ICP ein kleiner messfehler besteht?
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.