• slider image 71
  • slider image 72
  • slider image 73
:::


Browsing this Thread:   1 Anonymous Users






MACHACC(PID)使用問題-PIC16F1614
#1
中級會員
中級會員


查看用戶資訊
不好意思又來求助..實在是看整個下午還看得很灰。
使用的PIC是PIC16F1614
用MAPLAB IDEX + MCC做設定

這次想問MACHACC(PID)的使用方式,如圖
縮圖












想問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大很多,這部分我還是需要再程式中用軟體的方式做除法嗎?

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

發表於: 2018/5/20 16:55
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: MACHACC(PID)使用問題-PIC16F1614
#2
版主
版主


查看用戶資訊
想問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”.

Attach file:



jpg  (0.00 KB)


發表於: 2018/5/21 14:53
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: MACHACC(PID)使用問題-PIC16F1614
#3
中級會員
中級會員


查看用戶資訊
請問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)

發表於: 2018/5/22 16:37
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.

[進階搜尋]