[問題] PID控制的程式,執行時間太長,如何加速?
這個PID控制計算的function跑太慢,佔去60%的CPU時間,請問該如何化簡呢?
(正式版 keil uVision4)
void SetFeedback(void)
{
static int tempErr;
int u,Err;
ADCHL = ADCH; //載入揮發性變數
Err = ADCHL - 127; //求誤差
KI_Sum += Err;
if (KI_Sum>30000) KI_Sum= 30000;
else if(KI_Sum<-30000)KI_Sum=-30000;
if(125<=ADCHL || 129>=ADCHL)KI_Sum=0;//積分重置
KD_Diff = Err-tempErr;
tempErr=Err;
if (KD_Diff>30000) KD_Diff= 30000;
else if(KD_Diff<-30000)KD_Diff=-30000;
u = (Err*18) //P
+ (KI_Sum) //I
+ (KD_Diff*14) //D
;
if(u>255) u=255; //設定上限
else if(u<-255) u=-255; //設定下限
if(u>0) //正轉
{
CCAP0H = (~u)&0xFF;
CCAP1H = 0xFF;
}
else if(u<0) //反轉
{
CCAP0H = 0xFF;
CCAP1H = (0xFF+u)&0xFF; //去掉負號
}
else if(0==u)
CCAP0H=CCAP1H=0xFF;
printf("ADCHL=%d, u=%d\n",ADCHL,u);
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.122.47.23
※ 編輯: deo2000 來自: 140.122.47.23 (12/07 00:40)
※ 編輯: deo2000 來自: 140.122.47.23 (12/07 00:41)
推
12/07 04:17, , 1F
12/07 04:17, 1F
→
12/07 04:17, , 2F
12/07 04:17, 2F
→
12/07 04:18, , 3F
12/07 04:18, 3F
→
12/07 04:19, , 4F
12/07 04:19, 4F
→
12/07 04:20, , 5F
12/07 04:20, 5F
→
12/07 04:20, , 6F
12/07 04:20, 6F
→
12/07 04:21, , 7F
12/07 04:21, 7F
不是x86上抄的耶...@@ 這是我看著增強型8051的datasheet一行一行寫出來的
這些程式執行時間在11~13ms
我將*18 替換成 <<4 + <<1
*14 替換成 <<3 + <<2 + <<1
但是一點都沒有變快
※ 編輯: deo2000 來自: 140.122.44.137 (12/07 12:14)
推
12/07 20:41, , 8F
12/07 20:41, 8F
謝謝
後來我發現幾乎是printf佔去,其他只有30us,所以把printf留在main,其他放中斷
※ 編輯: deo2000 來自: 140.122.44.137 (12/07 21:35)
推
12/07 22:34, , 9F
12/07 22:34, 9F
→
12/07 22:36, , 10F
12/07 22:36, 10F
→
12/07 22:37, , 11F
12/07 22:37, 11F
謝謝,原本都放在main, 中斷只用來刻10ms的時間刻度讓main poll
推
12/07 22:40, , 12F
12/07 22:40, 12F
→
12/07 22:41, , 13F
12/07 22:41, 13F
因為需要夠大的變數, 只好用int
※ 編輯: deo2000 來自: 140.122.43.34 (12/08 15:53)
推
12/10 21:08, , 14F
12/10 21:08, 14F
推
12/11 01:32, , 15F
12/11 01:32, 15F
ASM 近期熱門文章
PTT數位生活區 即時熱門文章