Hallo,
ich habe folgendes Problem:
Ich steuere kontinuierlich einen Schrittmotor mit der AccelSteper-Lib an und möchte jetzt noch zusätzlich einige Daten auf einem LCD-Display ausgeben.
Ohne LCD-Ausgabe--> Schrittmotor läuft ohne Ruckler, einwandfrei
Mit LCD-Ausgabe--> Aussetzer immer dann, wenn das LCD-Display beschrieben wird.
Also habe ich im ersten Versuch das Display nur 10 mal pro Sekunde beschrieben:
timer=millis();
if (timer-LCD_timer>=100){
lcd.setCursor(0, 0);
lcd.print(millis());
LCD_timer=timer;
}
Jetzt kann man die Unterbrechungen des Schrittmotors deutlich mit 10 Hz wahrnehmen.. ![]()
Als nächsten Versuch habe ich dann einen InterruptTimer benutzt um die stepper.run(); Funktion priorisiert außerhalb der Hauptschleife aufzurufen:
void setup() {
cli();//stop interrupts
//set timer2 interrupt at 8kHz
TCCR2A = 0;// set entire TCCR2A register to 0
TCCR2B = 0;// same for TCCR2B
TCNT2 = 0;//initialize counter value to 0
// set compare match register for 8khz increments
OCR2A = 15;// = (16*10^6) / (8000*8) - 1 (must be <256)
// turn on CTC mode
TCCR2A |= (1 << WGM21);
// Set CS21 bit for 8 prescaler
//TCCR2B |= (1 << CS21);
TCCR2B |= (1 << CS22) | (1 << CS21);
// enable timer compare interrupt
TIMSK2 |= (1 << OCIE2A);
sei();//allow interrupts
}
und dann:
ISR(TIMER2_COMPA_vect){
stepper.run();
}
Hier wiederrum ist das Problem, dass ich nicht mehr die Maximalgeschwindigkeit des Schrittmotors erreiche. Bei OCR2A < 15 läuft der Schrittmotor dann wieder annähernd mit seiner Geschwindigkeit, mit der er ohne Display lief. Aber das Display wird dann auch nur noch sporadisch und stark verzögert beschrieben.
Es scheint also so, als könnte ich entweder nur einen verzögerungsfreien Schrittmotorbetrieb ohne Display erreichen. Stößt der Arduino Uno hier einfach an seine Performancegrenzen oder mache ich etwas falsch?