Re: 程式會自動停止,想請問如何除錯?
|
||||
---|---|---|---|---|
新會員
|
很感謝大家熱心的回答 ^^
1.首先很謝謝版主提供的 Trap 範例... 但因為我沒用過 Trap,點開範例來看發現程式部分是不是只有 Trap 的中斷服務程式而已阿? Trap不需要先去致能初始化嗎? (像ADC中斷須先致能) 然後還想請教版主,例如當 算數Trap 發生時,會進到相對應的ISR中 void _ISR _MathError(void) { INTCON1bits.MATHERR = 0; while(1); } 想請問 ISR內程式只有這兩行程式 , 如此dsPIC不會reset 但就會一直卡在while(1)那行嚕? 如此意思是說我們可以將中斷點 ( debuge mode with ICD2 ) 放在while(1)那行,檢驗是否是算數錯誤以找到我們程式錯誤的地方嗎? 還請版主教導 ^^ 2.另外說明一下我為何想採用 float 做為PI控制器的運算 原本我將AD中斷設為10KHz處理一次 ( 包含回授訊號處理+電流PI+PWM調變輸出 ) , PI控制器的部份採用整數格式運算 ( Q.15格式應用在需小數相乘的部分 ) 但是經由控制器的設計後 , 得到PI控制器參數為 Kp = 1.36 因為我想說 Q.15 能夠表示的小數範圍為 -1.000~+0.998 , 沒辦法表示大於1.0的小數 , 所以想採用float格式做乘法運算 , 但只針對電流PI控制器的部份採用float格式 . ex : err * 1.36 (err為int轉換成float格式 : 數值範圍 -32768 ~ +32767 ) 但因為加上 耗時的 float格式運算 , 發現只好將我的AD中斷頻率降低為 5KHz . 我是利用 一隻I/O腳位輸出High low訊號(進出AD ISR) , 利用示波器看我AD中斷的處理時間 , 有滿足在1/5K (s)以內. 本想說這樣即使中斷(取樣)頻率較慢 , 但閉迴路系統應該還是可以正常運作吧?! 但結果卻是發生了 程式自己停止的情況 囧rz...
發表於: 2008/8/2 10:45
|
|||
|
Re: 程式會自動停止,想請問如何除錯?
|
||||
---|---|---|---|---|
資深會員
|
在此說說我的觀點, 投R大一票, 短時間的控制, 定點dsp使用浮點計算控制量, 相當不切時宜, 建議以Q格式計算即可.
以電流控制而言, 既然已經使用dsPIC, 何需屈就於5KHz, 幾乎沒聽過dsp電流控制使用這麼慢的控制速度, 若是把頻寬算進來, 很少有架構可以這樣用的, 畢竟Delay過久, 難保震盪嚴重. 我倒是不建議多開中斷, 在數位控制的有限時間內, 已經佔用不少執行時間, 多開中斷, 會造成時序處理問題的困擾以外, 進出中斷的時間耗費更是可惜. "多個中斷源時,減少發生衝突的機會" 這句話跟我的經驗完全相反, 甚是有趣, 只有一個中斷時, 跟誰衝突呢? 在某dsPIC還發生過, 某兩個同一加權的中斷發生時, 就會產生trap, 而TI 28DSP, 同一加權的中斷, 就算有先後順序, 還是會被切入中斷, 權限一樣也沒用, 這時甚至還要注意這類問題, 衝突機會減少的論點我還不解. 中斷基本上絕對是要儘量簡化, 一般只留基礎邏輯程式與即時控制的自控程式, 相對的, 自控就必須使用最佳的方式撰寫, 需意識到, 寫自控常常都是夾縫中求生存, 系統效能需求越來越大, 但是DSP的速度尚未提升到相對的優質狀態, 那麼不早點習慣嚴苛的執行效率需求, 系統沒機會寫大. 一樣是SVPWM向量控制, 在馬達跟發電Inverter, 效能需求就是天壤之別, 望您能想像, 然而可以移到主程式嗎? 呵呵~
發表於: 2008/7/29 22:26
|
|||
Thanks,
Edward Lee |
||||
|
Re: 程式會自動停止,想請問如何除錯?
|
||||
---|---|---|---|---|
高級會員
|
5KHz的中斷每次只有0.2ms那如果浮點數運算超過這個時間,就會產生重複中斷,也就是每次都只計算一半,工作永遠無法有做完的時候,因此我習慣上會將中斷中的動作盡量簡化,中斷程式只做相當少的動作,如此可減少對主程式的影響,也可在同時開多個中斷源時,減少發生衝突的機會
發表於: 2008/7/29 20:30
|
|||
|
Re: 程式會自動停止,想請問如何除錯?
|
||||
---|---|---|---|---|
版主
|
參照:
我將PI控制器寫在 AD中斷內(5KHz) 用 STOPWATCH 的計算程式執行的時間功能來算一下 PI 所花掉的時間,如果可以的話不建議使用浮點方式運算,我想不會有人在這麼短的時間內用浮點數計算PI的除非你使用的是 Floating-Point DSP
發表於: 2008/7/29 8:11
|
|||
|
Re: 程式會自動停止,想請問如何除錯?
|
||||
---|---|---|---|---|
版主
|
程式是不會停止執行的(因為不是在 Sleep Mode) 所以有可能是發生了數學運算的錯誤產生了 Trap ,而你又沒有對此 Trap 做任何的處理變成了 reset 動作,所以程式就失控了。
建議使用 MPLAB SIM (你有用 ICD2 除錯嗎?) 配合 Watch Window 的功能來除錯吧! 順便參考一下設定 trap 的例子加到程式裡來做事件處理及除錯用。 Attach file: Link only for registered users
發表於: 2008/7/29 8:05
|
|||
|
Re: 程式會自動停止,想請問如何除錯?
|
||||
---|---|---|---|---|
新會員
|
抱歉補充一下 , 我採用的MCU 是 dsPIC30F4011
我將PI控制器寫在 AD中斷內(5KHz) 有確保過 執行完 AD中斷服務程式 時間仍在 1/5K (s)以內
發表於: 2008/7/28 20:40
|
|||
|
程式會自動停止,想請問如何除錯?
|
||||
---|---|---|---|---|
新會員
|
各位前輩們 , 我最近寫了馬達電流控制的程式
在電流控制器的部分採用基本的 PI 控制器 我是用 浮點數(float)格式做運算 最後控制器輸出結果再換回 整數(int)格式 再去調變產生 PWM 輸出 控制Inverter 我的問題是 : 利用浮點數做運算,我的程式會執行到一半自動停止 , 但看不到程式停在哪裡(沒有看到綠色箭頭) , 想請問這是哪部份出了錯嗎? 我的PI控制器是參考文件 AN1078 所寫的 我的程式部分如下 : //只有Ref_Id , Id , Vde為signed int格式 , 其餘皆為float格式 Id_command = Ref_Id; // Id_command : float , // Ref_Id : signed int Id_feedback = Id; // Id_feedback : float , // Id : signed int Id_error = Id_command - Id_feedback; // Ki_F = 0.09216 , Kp_F = 1.3679 (float) Id_sum_F = Id_sum_F + Id_Ki_F * Id_error; // Id_sum_F為積分項 Id_U_F = Id_sum_F + Id_Kp_F * Id_error; // Id_U_F 為PI控制器輸出 if(Id_U_F > 18917) // 經過輸出飽和限制 , 產生電壓命令 Vde = 18917; else if(Id_U_F < -18917) Vde = -18917; else Vde = Id_U_F; // Vde : signed int 不知道各位前輩們有沒有遇到過相似的問題 , 可否教小弟我如何 除錯解決問題嗎? 謝謝各位 P.S. 我有試過將 PI 控制器內全部改採用 整數格式 運算 , 程式就不會停止了 , 那這樣是跟浮點數運算有關嗎?
發表於: 2008/7/28 20:36
|
|||
|