[問題] PID控制的程式,執行時間太長,如何加速?

看板ASM (組合語言)作者 (800IM)時間11年前 (2013/12/07 00:39), 編輯推噓6(609)
留言15則, 4人參與, 最新討論串1/1
這個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
你只說明compiler, 並沒有說明你的chip是甚麼架構
12/07 04:17, 1F

12/07 04:17, , 2F
假設使用8051或8bit的MCU, 你的程式看起來像是從x86
12/07 04:17, 2F

12/07 04:18, , 3F
直接抄過來用, 請試著用8bit的思維去實作這個功能
12/07 04:18, 3F

12/07 04:19, , 4F
中間的變數u運算中用了兩個整數乘法,應該是這裡最占
12/07 04:19, 4F

12/07 04:20, , 5F
時間,但我不熟這個控制方式,所以我沒辦法跟你說
12/07 04:20, 5F

12/07 04:20, , 6F
所以你應該去思考你要如何用8bit去實現這個演算法
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
用Keil模擬沒有這麼慢.把printf去掉再跑看看.
12/07 20:41, 8F
謝謝 後來我發現幾乎是printf佔去,其他只有30us,所以把printf留在main,其他放中斷 ※ 編輯: deo2000 來自: 140.122.44.137 (12/07 21:35)

12/07 22:34, , 9F
對不起 我錯了 我沒看到最後一行的printf= =
12/07 22:34, 9F

12/07 22:36, , 10F
另外 如果要在51裡面用printf建議改寫一下
12/07 22:36, 10F

12/07 22:37, , 11F
如果是放中斷 那就不建議放printf 中斷應該越精簡越好
12/07 22:37, 11F
謝謝,原本都放在main, 中斷只用來刻10ms的時間刻度讓main poll

12/07 22:40, , 12F
另外 我提到這個程式像是x86 style, 因為你都是用int
12/07 22:40, 12F

12/07 22:41, , 13F
type做運算...不過變種51夠快 那就沒差(  ̄ c ̄)y▂ξ
12/07 22:41, 13F
因為需要夠大的變數, 只好用int ※ 編輯: deo2000 來自: 140.122.43.34 (12/08 15:53)

12/10 21:08, , 14F
請問8051 的 printf 是印到哪阿 = =
12/10 21:08, 14F

12/11 01:32, , 15F
UART
12/11 01:32, 15F
文章代碼(AID): #1IeVt8UY (ASM)
文章代碼(AID): #1IeVt8UY (ASM)