2016-07-27 83 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

請注意,Ardunio板不能跑得那麼快。例如,對於analogRead,讀取模擬輸入大約需要100微秒(請參閱:https://www.arduino.cc/en/Reference/AnalogRead)。對於analogWrite,它會產生大約490 Hz(2ms)的波形。而且您可能會在代碼的其他部分發現更多延遲,這些代碼並未顯示在此處。

+0

我試圖增加頻率到31khz,但由於某種原因它不工作,任何想法爲什麼? int myEraser = 7; TCCR3B&=〜myEraser; int myPrescaler = 1; TCCR3B | = myPrescaler; –

0

一般來說,最好不要在中斷時做很多工作,你在這裏沒有顯示你的中斷代碼,但是以10uS的速率,你無法真正做到太多。你在用哪個板子?一種解決方案可能是在您的中斷中設置一個標誌,然後在主循環中處理中斷,但事實是,如果每10毫秒需要完成的工作超過了您的處理器在此時需要完成的工作。考慮在發生時序衝突的情況下應該延遲哪部分代碼,並以這種方式構造代碼,中斷優先於其他任何事情。