2016-07-27 24 views
1

Ich arbeite an einem Firmware-Code, ich setze Interrupt-Zeit auf 10us, aber jetzt läuft die Schleife alle 5ms, die viel viel langsamer ist. Irgendeine Idee, wie man die Schleife beschleunigt, ist hoch schätzen Sie!Interrupt in Arduino

unsigned long lastTime; 
double BAT_I_FB, Output, Setpoint= 8 ; 
double errSum=0, lastErr,error=99; 
double kp=0.1, ki=15, kd=0; 
double KdVal,KpVal,KiVal,PID,BUS_V; 
double SampleTime = 10; 

void loop() { 

unsigned long now = micros(); 

int timeChange = (now-lastTime); 

if(timeChange >= SampleTime) 
{ 
/*Compute all the working error variables*/ 
BAT_I_FB = analogRead(pins[15].arduinoPinNumber); 
BAT_I_FB = float(BAT_I_FB * (5.0/1024)) * pins[15].multiplier; 


error = Setpoint - BAT_I_FB; 
errSum += error; 
double dErr = (error - lastErr); 

BUS_V = analogRead(pins[18].arduinoPinNumber); 
BUS_V = float(BUS_V * (5.0/1024)) * pins[18].multiplier; 

/*compute PID Output*/ 

PID = kp * error +ki/10000 * errSum + kd * 1000 * dErr; 

Output = (PID-100) * (-2.5); 

analogWrite(2, Output); 


/*Remember some variable for next time*/ 
lastErr = error; 
lastTime = now; 

} 
+1

Wie schnell ist dieser Prozessor und wie viel Code ist in der Interrupt-Handler? Sie können möglicherweise nur eine Handvoll Anweisungen in 10us ausführen - in diesem Fall lautet die Lösung: "Mach weniger Sachen oder besorg dir einen schnelleren Prozessor". – immibis

Antwort

0

beachten Sie, dass Ardunio Board nicht so schnell laufen kann. Bei analogRead beispielsweise dauert das Lesen eines Analogeingangs etwa 100 Mikrosekunden (siehe: https://www.arduino.cc/en/Reference/AnalogRead). Für analogWrite wird eine Welle von ungefähr 490 Hz (2 ms) erzeugt. Und möglicherweise gibt es weitere Verzögerungen von anderen Teilen des Codes, die Sie hier nicht angezeigt haben.

+0

Ich habe versucht, die Frequenz auf 31 kHz zu erhöhen, aber aus irgendeinem Grund funktioniert es nicht, irgendeine Idee warum? int myEraser = 7; TCCR3B & = ~ myEraser; int myPrescaler = 1; TCCR3B | = meinPrescaler; –

0

Im Allgemeinen ist es am besten, nicht viel Arbeit in einem Interrupt zu machen, Sie haben hier Ihren Interrupt-Code nicht angezeigt, aber mit einer 10uS-Rate können Sie sowieso nicht viel tun. Welches Board verwendest du? Eine Lösung könnte sein, eine Markierung in Ihrem Interrupt zu setzen und dann den Interrupt in Ihrer Hauptschleife zu verarbeiten, aber die Tatsache bleibt, dass, wenn die Arbeit, die Sie tun müssen, alle 10uS übersteigt, was Ihr Prozessor in dieser Zeit leisten kann. Denken Sie darüber nach, welchen Teil Ihres Codes im Falle eines Timing-Konflikts zurückgestellt werden soll und strukturieren Sie Ihren Code so, dass Interrupts Vorrang vor allem anderen haben.