會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





MACHACC(PID)使用問題-PIC16F1614
初級會員
註冊日期:
2016/05/03 21:00
所屬群組:
註冊會員
文章: 29
等級: 4; EXP: 12
HP : 0 / 78
MP : 9 / 489
離線
不好意思又來求助..實在是看整個下午還看得很灰。
使用的PIC是PIC16F1614
用MAPLAB IDEX + MCC做設定

這次想問MACHACC(PID)的使用方式,如圖
Open in new window












想問Z0是當前誤差,PIDxZ1是上一筆誤差,PIDxZ2是上上筆誤差這樣理解對嗎?

我看手冊
PIDxK1 = (Kp+Ki*T+kd/T)
PIDxK2 = -(kp+ 2kd/T)
PIDxK3 = (Kd/T)

所以實際到Adder輸出的值是 Kp(Z0-Z1)+Ki*T(Z0) (Kd先假設0不使用)
然後輸出的Adder值又會跟PIDxOUT上一筆數值做累加。
這邊的問題是Sample Time 如果設0.1ms的話,每0.1ms Accumulator就會做一次累加嗎?
那Accumulator的數值會不會很容易溢位?

第三個問題是 我最大誤差為20,000 但是我要輸出的數值只有300的解析度。
我看MCC上的Kp與Ki值的設定好像只能到小數點一位,
這樣我最後出來的值還是會比300大很多,這部分我還是需要再程式中用軟體的方式做除法嗎?

最後問有沒有這部分的範例或課程呢? 手冊翻來翻去都還是看不太懂正確的使用方式。

5月20日 16:55:00
轉換PDF檔 列印


Re: MACHACC(PID)使用問題-PIC16F1614
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14342
等級: 72; EXP: 81
HP : 1077 / 1795
MP : 4780 / 74228
離線
想問Z0是當前誤差,PIDxZ1是上一筆誤差,PIDxZ2是上上筆誤差這樣理解對嗎?

YES

我看手冊
PIDxK1 = (Kp+Ki*T+kd/T)
PIDxK2 = -(kp+ 2kd/T)
PIDxK3 = (Kd/T)

所以實際到Adder輸出的值是 Kp(Z0-Z1)+Ki*T(Z0) (Kd先假設0不使用)然後輸出的Adder值又會跟PIDxOUT上一筆數值做累加。
這邊的問題是Sample Time 如果設0.1ms的話,每0.1ms Accumulator就會做一次累加嗎?

YES, if T = 0.1, it means it samples every 0.1ms and calculate the PIDOUT every 0.1ms. You need an interrupt every 0.1ms to do it.

那Accumulator的數值會不會很容易溢位?

穩態時, PI參數在合理範圍內,如果輸出一直無法達到命令值就很容易飽和。請參考下面章節說明。
如附圖。

第三個問題是 我最大誤差為20,000 但是我要輸出的數值只有300的解析度。
我看MCC上的Kp與Ki值的設定好像只能到小數點一位,
這樣我最後出來的值還是會比300大很多,這部分我還是需要再程式中用軟體的方式做除法嗎?

Usually the PID output is much larger than the physical register value you specify.
If so, you may shrink the PID output value by “right shift” to fit into the register range.

A divide instruction may also work but cost more execution time.
A Q format multiply method is much more efficient instead of the “Divide”.

附加檔案:



jpg  擷取.JPG (55.54 KB)
16_5b026ce56ffe5.jpg 426X499 px

5月21日 14:53:25
轉換PDF檔 列印


Re: MACHACC(PID)使用問題-PIC16F1614
初級會員
註冊日期:
2016/05/03 21:00
所屬群組:
註冊會員
文章: 29
等級: 4; EXP: 12
HP : 0 / 78
MP : 9 / 489
離線
請問MATHACC功能裡最後的數據該怎麼拿出來使用呢?

MATHACCResult MATHACC_ResultGet(void)
{
MATHACCResult data;

data.byteLL = PID1OUTLL;
data.byteLH = PID1OUTLH;
data.byteHL = PID1OUTHL;
data.byteHH = PID1OUTHH;
data.byteU = PID1OUTU;

return data;
}

我寫
unsigned long int PI_Value;

PI_Value = MATHACC_ResultGet() ;

這樣會跳出錯誤
main.c:112: error: (182) illegal conversion between types
struct S1097 -> unsigned long
main.c:112: error: (181) non-scalar types can't be converted to other types
(908) exit status = 1


BUILD FAILED (exit value 2, total time: 6s)

5月22日 16:37:24
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project