Forum: Mikrocontroller und Digitale Elektronik neue interupt frage


von gartler p. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von ich (Gast)


Lesenswert?

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

von Hülfe (Gast)


Lesenswert?

ich schrieb:
> nimmst du deine Alte methode.

Oh ha. Hab schon den Eröffnungsthread nicht verstanden.

von gartler p. (Gast)


Lesenswert?

}
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
von Karl H. (kbuchegg)


Lesenswert?

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
von ich (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von gartler p. (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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
von gartler p. (Gast)


Lesenswert?

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

von Thomas Z. (tezet)


Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

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

von gartler p. (Gast)


Lesenswert?

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