2016-07-27 31 views
1

ファームウェアコードで作業していますが、割り込み時間を10usに設定しましたが、ループは5msごとに実行されています。これはずっと遅くなります。どのようにループをスピードアップするかについてのアイデアは非常に感謝しています!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

このプロセッサはどのくらいの速さで、どのくらいのコードが割り込みハンドラに入っていますか?あなたは10usでほんの一握りの命令を実行することができるかもしれません。その場合、解決策は「より少ないものやより速いプロセッサを得る」ことです。 – immibis

答えて

0

アルドゥニオのボードはそれほど高速に動作しません。たとえば、analogReadの場合、アナログ入力を読み取るのに約100マイクロ秒かかります(https://www.arduino.cc/en/Reference/AnalogRead参照)。 analogWriteの場合、約490Hz(2ms)の波を生成します。そして、ここに示していないコードの他の部分からの遅延がさらにあるかもしれません。

+0

私は31khzに周波数を上げようとしましたが、何らかの理由でそれが動作しませんでした。 int myEraser = 7; TCCR3B&=〜myEraser; int myPrescaler = 1; TCCR3B | = myPrescaler; –

0

一般に、割り込みではあまり作業しないことをお勧めします。割り込みコードはここに表示されませんでしたが、10uSレートではあまり効果がありません。どのボードを使用していますか? 1つの解決策は、割り込みにフラグを設定し、メインループで割り込みを処理することですが、実際には10uSごとに行う必要がある処理が、その時間にプロセッサが達成できるものを超える場合です。タイミングの競合が発生した場合に、コードのどの部分を延期し、コードをそのように構造化するかについて考えてください。割り込みは他のすべてよりも優先されます。

関連する問題