• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
  • slider image 488
  • slider image 491
:::


Browsing this Thread:   1 Anonymous Users






Re: 程式會自動停止,想請問如何除錯?
#8
新會員
新會員


查看用戶資訊
參照:

edwardlee 寫道:
在此說說我的觀點, 投R大一票, 短時間的控制, 定點dsp使用浮點計算控制量, 相當不切時宜, 建議以Q格式計算即可.



謝謝e大的回答 , 對於e大說的 Q格式運算 , 我自己也有試著了解並做了一些實驗 , 但不知道自己的觀念是否正確 , 還請e大幫我檢查我的思維 , 謝謝

Q.15小數格式 是指在做 " 乘法運算 "時 , 若乘數為一小數值 -1.00 ~ +0.9998 , 透過 Q.15格式 運算達到相似於 浮點數 運算的結果是嗎?

ex : 被乘數為 signed int格式 12267
乘數 0.68393 -> 則 Q.15 表示為 22411
因此我程式寫法
Ans = ((long)12267 * 22411 ) >> 15;

我利用Watch(Debug mode with ICD2)觀看運算結果得知 Ans = 8389 , 此結果相當於 浮點數運算 12267 * 0.68393 = 8389.769

想請問e大 , Q.15小數乘法是這樣使用的嗎?

假設上述方法可行 , 那還有另一個問題 , 當 " 乘數 " 是大於1.0的小數值時 , 是否就不能用 Q.15 格式了?

因為我現今PI控制器設計完後 Kp = 1.3679 , 大於Q.15表示的小數範圍 , 而我自己的想法是將 Kp 視為 Kp = 2 * 0.68395
則如此乘2的部分利用左偏1bit , 而 乘0.68395 則同樣利用 Q.15的運算方法 -> 0.68395 的Q.15表示為 22411

ex : 和上述相同 假設 被乘數為 (signed int) 12267
我的程式寫法
Ans = ((long)12267 * 22411 ) >> 15 << 1;
相當於 = ((long)12267 * 22411 ) >> 14;

利用Watch觀看 , 運算結果 Ans = 16779 , 結果和浮點數運算 12267 * 1.3679 = 16780.0293 結果相近.

但我知道 大於1.0的Q.15小數乘法 , 相乘結果好像會遇到 " 溢位 " 的問題.

ex : 這次假設 被乘數(signed int)為 26653 , 運算結果Ans也宣告為signed int

利用上述的程式寫法
Ans = ((long)26653 * 22411 ) >> 14;
利用Watch觀看 , 運算結果Ans = 36457 . 但這運算結果 Ans 在 signed int 中卻會被視為 "負數" 吧?!(超出32767 , 正數*正數結果卻產生負數) 如此再將此Ans做後續的處理 , 好像會造成無法預期的馬達控制響應(不穩定的震盪)

我現在想到的處理方法為 Ans運算後再加上 範圍判斷限制
ex :
Err = 26653; // Err : signed int , Ans : signed int
Ans = ((long)26653 * 22411 ) >> 14; // Ans = Err * 1.3679
if( (unsigned int)Ans > 32767 && Err >0 )
Ans = 32767; // 正數*正數 , 結果 Ans不應該為負
else if( (unsigned int)Ans < 32768 && Err <0 )
Ans = -32768; // 負數*正數 , 結果 Ans不應該為正


想請問我程式這樣的想法正確嗎? 因為小弟我學寫程式的功力和經驗還很淺 , 還請各前輩們多多指導!!
謝謝

發表於: 2008/8/2 11:48
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 程式會自動停止,想請問如何除錯?
#7
新會員
新會員


查看用戶資訊
很感謝大家熱心的回答 ^^

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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 程式會自動停止,想請問如何除錯?
#6
資深會員
資深會員


查看用戶資訊
在此說說我的觀點, 投R大一票, 短時間的控制, 定點dsp使用浮點計算控制量, 相當不切時宜, 建議以Q格式計算即可.

以電流控制而言, 既然已經使用dsPIC, 何需屈就於5KHz, 幾乎沒聽過dsp電流控制使用這麼慢的控制速度, 若是把頻寬算進來,
很少有架構可以這樣用的, 畢竟Delay過久, 難保震盪嚴重.

我倒是不建議多開中斷, 在數位控制的有限時間內, 已經佔用不少執行時間, 多開中斷, 會造成時序處理問題的困擾以外, 進出中斷的時間耗費更是可惜.
"多個中斷源時,減少發生衝突的機會" 這句話跟我的經驗完全相反, 甚是有趣, 只有一個中斷時, 跟誰衝突呢? 在某dsPIC還發生過, 某兩個同一加權的中斷發生時, 就會產生trap, 而TI 28DSP, 同一加權的中斷, 就算有先後順序, 還是會被切入中斷, 權限一樣也沒用, 這時甚至還要注意這類問題, 衝突機會減少的論點我還不解.

中斷基本上絕對是要儘量簡化, 一般只留基礎邏輯程式與即時控制的自控程式, 相對的, 自控就必須使用最佳的方式撰寫, 需意識到, 寫自控常常都是夾縫中求生存, 系統效能需求越來越大, 但是DSP的速度尚未提升到相對的優質狀態, 那麼不早點習慣嚴苛的執行效率需求, 系統沒機會寫大.

一樣是SVPWM向量控制, 在馬達跟發電Inverter, 效能需求就是天壤之別, 望您能想像, 然而可以移到主程式嗎? 呵呵~

發表於: 2008/7/29 22:26
Thanks,
Edward Lee
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 程式會自動停止,想請問如何除錯?
#5
高級會員
高級會員


查看用戶資訊
5KHz的中斷每次只有0.2ms那如果浮點數運算超過這個時間,就會產生重複中斷,也就是每次都只計算一半,工作永遠無法有做完的時候,因此我習慣上會將中斷中的動作盡量簡化,中斷程式只做相當少的動作,如此可減少對主程式的影響,也可在同時開多個中斷源時,減少發生衝突的機會

發表於: 2008/7/29 20:30
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 程式會自動停止,想請問如何除錯?
#4
版主
版主


查看用戶資訊
參照:
我將PI控制器寫在 AD中斷內(5KHz)

用 STOPWATCH 的計算程式執行的時間功能來算一下 PI 所花掉的時間,如果可以的話不建議使用浮點方式運算,我想不會有人在這麼短的時間內用浮點數計算PI的除非你使用的是 Floating-Point DSP

發表於: 2008/7/29 8:11
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 程式會自動停止,想請問如何除錯?
#3
版主
版主


查看用戶資訊
程式是不會停止執行的(因為不是在 Sleep Mode) 所以有可能是發生了數學運算的錯誤產生了 Trap ,而你又沒有對此 Trap 做任何的處理變成了 reset 動作,所以程式就失控了。
建議使用 MPLAB SIM (你有用 ICD2 除錯嗎?) 配合 Watch Window 的功能來除錯吧! 順便參考一下設定 trap 的例子加到程式裡來做事件處理及除錯用。

Attach file:


Link only for registered users

發表於: 2008/7/29 8:05
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 程式會自動停止,想請問如何除錯?
#2
新會員
新會員


查看用戶資訊
抱歉補充一下 , 我採用的MCU 是 dsPIC30F4011

我將PI控制器寫在 AD中斷內(5KHz)

有確保過 執行完 AD中斷服務程式 時間仍在 1/5K (s)以內

發表於: 2008/7/28 20:40
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


程式會自動停止,想請問如何除錯?
#1
新會員
新會員


查看用戶資訊
各位前輩們 , 我最近寫了馬達電流控制的程式

在電流控制器的部分採用基本的 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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------