Hallo zusammen,
ich versuche im Moment eine Art "Seismograph" für Audiosignale zu
basteln. An einer Führungsschiene hängt ein Schlitten mit einem Stift,
der von einem Schrittmotor über einen rudimentären Seilzug auf und ab
gefahren werden kann.
Es funktioniert auch ganz gut, leider nur sehr langsam. Sobald ich
versuche den Motor schneller anzufahren, dreht er durch. Auch beim
Richtungswechsel scheint er einige Schritte zu verlieren…
Man muss den Motor wohl mit einer "Rampe" anfahren, um die maximale
Geschwindigkeit erreichen zu können. Viele Beispiele, die ich dazu im
Netz gefunden habe, beziehen sich aber leider auf Anwendungen, bei denen
der Motor zu einer bestimmten Position fahren soll, dann zur Nächsten,
dann zur Nächsten…
In meinem Fall habe ich ja ein Echtzeit-Signal durch ein Mikrofon am
ADC. Ich muss also irgendwie dynamisch eine Rampe hinbekommen, die z.B.
bei jedem Richtungswechsel erfolgt.
Das ganze läuft bei mit mit einem Schrittmotor, über einen Sparkfun
EasyDriver (Allegro 3967) an einem Arduino Uno (atmega328p). Der Treiber
bekommt ein 50%-Duty-Cycle PWM für die Steps, Geschwindigkeit lässt sich
über die Periode regeln.
1 | Timer1.initialize();
|
2 | Timer1.attachInterrupt(save_step); //position speichern
|
3 | Timer1.setPeriod(400);
|
1 | void save_step(){
|
2 | steps += ( digitalRead(V_DIR_PIN) == HIGH) ? 1 : -1;
|
3 | }
|
Mein erster Ansatz ist es, in der save_step() die Rampe einzubauen: Bei
einem Richtungswechsel wird eine Variable ramp_step auf 0 gesetzt:
1 | void save_step(){
|
2 | if( ramp_step < 10 ){
|
3 | Timer1.setPeriod(ramp_values[ramp_step]);
|
4 | ramp_step++;
|
5 | }
|
6 |
|
7 | steps += ( digitalRead(V_DIR_PIN) == HIGH) ? 1 : -1;
|
8 | }
|
Das funktioniert auch soweit, aber doch nicht so richtig gut. Bzw. weiss
ich nicht, was die optimalen Werte für meinen Motor (Oriental PK243,
Leihgabe von einem Freund) sind.
Jemand noch Vorschläge, Tipps, etc?
Vielen Dank