KiR0
05.05.2007, 22:01
Hi zusammen,
ich stehen vor einem Programmtechnischen Problem und weiß nicht wie ich dieses lösen soll.
Folgende Problemstellung:
Ich habe 1 drehende Welle eines Motors bei dem ich die Drehzahl messen möchte und bekomme durch einen Induktivaufnahmer ein einwandfrei Sauberes Impulsförmiges Signal.Ich habe für die Drehzahlmessung
schon angefangen Programmcode zu schreiben (Ich arbeite mit Bascom-AVR von Mcselec). Die Messung mache ich mit dem
Capture-Modul des ATMega 32 (ICP). Frage 1: gibt es eine "bessere" Möglichkeit eine Drehzahl hinreichend genau im Bereich
von ca 400-5000 Upm zu erfassen? Die Drehzahlmessung bekomme ich mit dem von mir gestrickten Programm hin. Um mich nicht
mit fremden Federn zu schmücken muß ich jedoch auch sagen daß ich mit die Denkanstöße aus dem Drehzahlmessungs-Programm
vom User "formtapez" geholt habe. Dieses ist gut kommentiert, darum habe ich dies als Beispiel verwendet.
2.Problem:
Ich möchte am Mega32 an den TOSC-Pins einen extra Quarz betreiben um den Timer2 asynchron zu betreiben. Ich möchte
mir damit ein 1.sec signal herstellen. Die Geschichte mit dem Prescaler ist mir klar, ich lasse in der Interruptroutine
dann eine Variable raufzählen, bis auf 32 und habe damit nach jeweils 32 Interruptaufrufen (bei einem Prescaler von 1024)
meine für meine Zwecke hinreichend genaue 1.Sec referenz.
Jetzt bin ich mir aber über eine weitere Problematik nicht sicher, und zwar folgende:
Angenommen der Mega32 misst die Drehzahl und mitten in die Drehzahlmessung platzt der Timer2 mit einem Interrupt hinein.
Was passiert in diesem Fall? Mir ist klar das ich in der Zählroutine für die Drehzahlerfassung die Interrupts Disablen kann,
ich vermute jedoch daß dadurch der Timer2 in seiner "Arbeit" behindert wird, da unter umständen Impulse verschluckt werden.
Dadurch ist meine 1.sec referenz ungenau. Würde es etwas bringen wenn ich den Teiler des Timers2 heruntersetze, evtl.
auf 128? Es müssten, wenn ich mit meiner Argumentation nicht komplett auf dem Holzweg bin, dadurch zwar immer noch
Impulse verloren gehen, da aber mehr interrupts von Timer2 ausgelöst werden, dürfte das nicht mehr so ins gewicht fallen.
Die Sekundenreferenz muß nicht supergenau sein, diese wird für eine Art "Timeout" verwendet. Wenn bei einem Timeout-Zeitraum
von ca. 10 min, dieser statt der angestrebten 10 min. halt 11 min lang ist ist das nicht schlimm.
Als andere Lösungsvariante könnte ich immer wenn Timer2 einen interrupt auslöst in der ISR von Timer2 alle anderen
interrupts verbieten. Dadurch stimmt aber wenn ich richtig denke meine Drehzahlmessung nicht mehr.
Wie würdet Ihr an meiner Stelle so ein Problem lösen? Als Anmerkung: Ich muß die Drehzahl nicht dauernd messen, alle
1 oder 2 sec reicht. Damit der Wert der Drehzahlanzeige nicht so stark schwankt, habe ich mir gedacht daß ich aus sagen wir
mal 3 bis 5 Werten einen Mittelwert bilde um die Anzeige etwas zu beruhigen. Falls das ganze zu aufwendig ist um mit einem
Mega32 erschlagen zu werden, habe ich auch schon gedacht die Drehzahlmessroutine in einen ATTiny2313 auszulagern und
dort ebenfalls außerhalb der ISR, die nur zur Impulserfassung genutzt, wird die ganze rechenarbeit zu erledigen.
Der Drehzahlwert könnte dann über den eingebauten UART fertig berechnet und im Klartext jede sekunde zum Mega32
geschickt werden. Falls sich meine Problemstellung jedoch auch ohne einen 2. AVR lösen lässt, bin ich natürlich zufriedener.
Falls jemand Bascom-Codebeispiele hat, nur her damit, vielleicht kann ich davon etwas lernen.
Für diejenigen die die Hintergründe interessieren hier ein paar infos wie ich auf dieses Projekt gekommen bin:
In dem Betrieb in dem ich Arbeite (als Betriebstechniker) haben wir, da wir ein Metallbetrieb sind jede menge Drehmaschinen.
Von ganz kleinen bis zu den etwas größeren Exemplaren die ohne Probleme ein paar Tonnen an Gewicht auf die Waage bekommen.
Bei einer diese Maschinen haben wir das Problem, daß wenn die Steuerung abstürzt, die auch das Sollwertsignal über zwei
DACs für den Frequenzumformer des 15KW-Spindelmotors (an dem will ich die Drehzahl messen) und des Werkzeugservos
erzeugt dieses einfach auf 0V (von einem Bereich von 0-10V) setzt. Die Freigabe der Umrichter erlischt jedoch nicht!
Dadurch dreht der Drehstrommotor nur mit seiner Mindestgeschwindigkeit. Das wäre ja nicht so schlimm, wenn nicht der
Servomotor der die Werkzeugvorschübe steuert unvermindert weiterlaufen würde. Dadurch das das Material nicht mehr genügend
schnell Rotiert schneiden die Drehwerkzeuge nicht mehr sondern werden durch den nun entstehenden
hohen Druck mechanisch zerstört. Falls jemand weiß was anständige Drehwerkzeuge kosten, wird derjenige mir sicher
Zustimmen daß bei jedem Crash einen haufen Geld zu Bruch geht. Weiterhin werden von der Würgerei die Achslager und die
Motoren auch nicht besser...
Die Steuerung einfach auszutauschen ist momentan nicht machbar da mir die Zeit dazu fehlt und diese würde ich brauchen da
von der Betreffenden Steuerung keine richtigen Pläne mehr da sind und ich somit alles ausmessen müsste. Die französische
Firma die die Steuerung hergestellt hat existiert leider seit Jahren nicht mehr. Die Steuerung an sich ist eigentlich recht
gut, da diese jetzt immerhin schon fast 21 Jahre (!!!) dauerdienst auf dem Buckel hat, aber irgendwann ist alles mal
hinüber (und was der Zahn der Zeit nicht schafft, schafft der Ölnebel der auch in noch so gut abgedichtete Schaltschränke
seinen Weg hineinfindet)... Die Maschinen laufen alle rund um die Uhr und das 7 Tage die Woche, Jahr für Jahr.
Die einzige Ausnahme ist der Weihnachtstag mit den daran anschließenden Feiertagen.
Falls jemand noch Fragen hat, bitte Posten ich werde versuchen soweit es mir möglich ist, alle Fragen zu beantworten.
Mfg,
KiR0
ich stehen vor einem Programmtechnischen Problem und weiß nicht wie ich dieses lösen soll.
Folgende Problemstellung:
Ich habe 1 drehende Welle eines Motors bei dem ich die Drehzahl messen möchte und bekomme durch einen Induktivaufnahmer ein einwandfrei Sauberes Impulsförmiges Signal.Ich habe für die Drehzahlmessung
schon angefangen Programmcode zu schreiben (Ich arbeite mit Bascom-AVR von Mcselec). Die Messung mache ich mit dem
Capture-Modul des ATMega 32 (ICP). Frage 1: gibt es eine "bessere" Möglichkeit eine Drehzahl hinreichend genau im Bereich
von ca 400-5000 Upm zu erfassen? Die Drehzahlmessung bekomme ich mit dem von mir gestrickten Programm hin. Um mich nicht
mit fremden Federn zu schmücken muß ich jedoch auch sagen daß ich mit die Denkanstöße aus dem Drehzahlmessungs-Programm
vom User "formtapez" geholt habe. Dieses ist gut kommentiert, darum habe ich dies als Beispiel verwendet.
2.Problem:
Ich möchte am Mega32 an den TOSC-Pins einen extra Quarz betreiben um den Timer2 asynchron zu betreiben. Ich möchte
mir damit ein 1.sec signal herstellen. Die Geschichte mit dem Prescaler ist mir klar, ich lasse in der Interruptroutine
dann eine Variable raufzählen, bis auf 32 und habe damit nach jeweils 32 Interruptaufrufen (bei einem Prescaler von 1024)
meine für meine Zwecke hinreichend genaue 1.Sec referenz.
Jetzt bin ich mir aber über eine weitere Problematik nicht sicher, und zwar folgende:
Angenommen der Mega32 misst die Drehzahl und mitten in die Drehzahlmessung platzt der Timer2 mit einem Interrupt hinein.
Was passiert in diesem Fall? Mir ist klar das ich in der Zählroutine für die Drehzahlerfassung die Interrupts Disablen kann,
ich vermute jedoch daß dadurch der Timer2 in seiner "Arbeit" behindert wird, da unter umständen Impulse verschluckt werden.
Dadurch ist meine 1.sec referenz ungenau. Würde es etwas bringen wenn ich den Teiler des Timers2 heruntersetze, evtl.
auf 128? Es müssten, wenn ich mit meiner Argumentation nicht komplett auf dem Holzweg bin, dadurch zwar immer noch
Impulse verloren gehen, da aber mehr interrupts von Timer2 ausgelöst werden, dürfte das nicht mehr so ins gewicht fallen.
Die Sekundenreferenz muß nicht supergenau sein, diese wird für eine Art "Timeout" verwendet. Wenn bei einem Timeout-Zeitraum
von ca. 10 min, dieser statt der angestrebten 10 min. halt 11 min lang ist ist das nicht schlimm.
Als andere Lösungsvariante könnte ich immer wenn Timer2 einen interrupt auslöst in der ISR von Timer2 alle anderen
interrupts verbieten. Dadurch stimmt aber wenn ich richtig denke meine Drehzahlmessung nicht mehr.
Wie würdet Ihr an meiner Stelle so ein Problem lösen? Als Anmerkung: Ich muß die Drehzahl nicht dauernd messen, alle
1 oder 2 sec reicht. Damit der Wert der Drehzahlanzeige nicht so stark schwankt, habe ich mir gedacht daß ich aus sagen wir
mal 3 bis 5 Werten einen Mittelwert bilde um die Anzeige etwas zu beruhigen. Falls das ganze zu aufwendig ist um mit einem
Mega32 erschlagen zu werden, habe ich auch schon gedacht die Drehzahlmessroutine in einen ATTiny2313 auszulagern und
dort ebenfalls außerhalb der ISR, die nur zur Impulserfassung genutzt, wird die ganze rechenarbeit zu erledigen.
Der Drehzahlwert könnte dann über den eingebauten UART fertig berechnet und im Klartext jede sekunde zum Mega32
geschickt werden. Falls sich meine Problemstellung jedoch auch ohne einen 2. AVR lösen lässt, bin ich natürlich zufriedener.
Falls jemand Bascom-Codebeispiele hat, nur her damit, vielleicht kann ich davon etwas lernen.
Für diejenigen die die Hintergründe interessieren hier ein paar infos wie ich auf dieses Projekt gekommen bin:
In dem Betrieb in dem ich Arbeite (als Betriebstechniker) haben wir, da wir ein Metallbetrieb sind jede menge Drehmaschinen.
Von ganz kleinen bis zu den etwas größeren Exemplaren die ohne Probleme ein paar Tonnen an Gewicht auf die Waage bekommen.
Bei einer diese Maschinen haben wir das Problem, daß wenn die Steuerung abstürzt, die auch das Sollwertsignal über zwei
DACs für den Frequenzumformer des 15KW-Spindelmotors (an dem will ich die Drehzahl messen) und des Werkzeugservos
erzeugt dieses einfach auf 0V (von einem Bereich von 0-10V) setzt. Die Freigabe der Umrichter erlischt jedoch nicht!
Dadurch dreht der Drehstrommotor nur mit seiner Mindestgeschwindigkeit. Das wäre ja nicht so schlimm, wenn nicht der
Servomotor der die Werkzeugvorschübe steuert unvermindert weiterlaufen würde. Dadurch das das Material nicht mehr genügend
schnell Rotiert schneiden die Drehwerkzeuge nicht mehr sondern werden durch den nun entstehenden
hohen Druck mechanisch zerstört. Falls jemand weiß was anständige Drehwerkzeuge kosten, wird derjenige mir sicher
Zustimmen daß bei jedem Crash einen haufen Geld zu Bruch geht. Weiterhin werden von der Würgerei die Achslager und die
Motoren auch nicht besser...
Die Steuerung einfach auszutauschen ist momentan nicht machbar da mir die Zeit dazu fehlt und diese würde ich brauchen da
von der Betreffenden Steuerung keine richtigen Pläne mehr da sind und ich somit alles ausmessen müsste. Die französische
Firma die die Steuerung hergestellt hat existiert leider seit Jahren nicht mehr. Die Steuerung an sich ist eigentlich recht
gut, da diese jetzt immerhin schon fast 21 Jahre (!!!) dauerdienst auf dem Buckel hat, aber irgendwann ist alles mal
hinüber (und was der Zahn der Zeit nicht schafft, schafft der Ölnebel der auch in noch so gut abgedichtete Schaltschränke
seinen Weg hineinfindet)... Die Maschinen laufen alle rund um die Uhr und das 7 Tage die Woche, Jahr für Jahr.
Die einzige Ausnahme ist der Weihnachtstag mit den daran anschließenden Feiertagen.
Falls jemand noch Fragen hat, bitte Posten ich werde versuchen soweit es mir möglich ist, alle Fragen zu beantworten.
Mfg,
KiR0