Re: 解決PWM亂開問題
|
||||
---|---|---|---|---|
資深會員
|
沒有數值的範圍關念~~
1240 *123=多少? 0x0253C8 可以 ,0x53C8 也對 , 0xC8 也行 先搞清楚你的數值範圍有多大~~你是如何存放資料的? 你用 2byte 來放 4680 *10 當然可以, 4680 * 16 就掛了 要放 4680 * 16 就得有 3BYTE 才得下
發表於: 2009/8/20 14:02
|
|||
|
Re: 解決PWM亂開問題
|
||||
---|---|---|---|---|
初級會員
|
謝謝edwardlee回答:
我再解釋一下,因為我們求出來Kp與Ki值就是這麼大,所以已經不需要Q格式的問題,現在我的規格就是要達到D_now=4680*(e_now-e_last)+195*e_now+D_last;,其實一開始就是用這個規格去測試,結果就是會造成我所謂的"亂開"因此將Kp與Ki值降到很小便不會出現"亂開",變大就會。 若以大的規格去測試,那我該從程式的哪方面去下手解決掉震盪的問題?麻煩了
發表於: 2009/8/20 13:32
|
|||
|
Re: 解決PWM亂開問題
|
||||
---|---|---|---|---|
資深會員
|
呵呵~~亂開? 真是口語化的說法!!
D_now=1*(e_now-e_last)+0.0097*e_now+D_last; 定點dsp可以這樣寫嗎? 不需Q格式? 這樣應該會變成下面這樣吧? D_now=(e_now-e_last)+D_last; 我假設所謂亂開指的是PWM突變量很大, 那麼可能原因有兩個: 1. 你計算飽和了? 請問有16bits有號數最大值為32767, 那麼再加1答案是多少? 2. PI控制器震盪? 你可以用簡單的EXCEL, 丟一個弦波給他算, 看會不會振盪. 真的不需Q格式嗎?
發表於: 2009/8/20 13:01
|
|||
Thanks,
Edward Lee |
||||
|
解決PWM亂開問題
|
||||
---|---|---|---|---|
初級會員
|
請教各位
之前已有提問過PWM亂開這個問題,也請教過microchip的FAE,圖為亂開之波形,以下為部份程式碼 PTCONbits.EIPU=0; PTCONbits.SYNCOEN = 1; PTCONbits.SYNCSRC = 0; PTCONbits.SEVTPS = 1; long Vo; long e_now,e_last; long D_now,D_last; long duty; long Vref=3720; /*以1.5V當做參考電壓,1.5V顯示為3720 =>(1.5/3.3)*1023*8=3720*/ void __attribute__((interrupt, no_auto_psv)) _PWM2Interrupt() { IFS5bits.PWM2IF=0; ADSTATbits.P1RDY=0; ADSTATbits.P2RDY=0; PHASE2=duty+380; Vo=ADCBUF5*8; e_now=Vref-Vo; D_now=1*(e_now-e_last)+0.0097*e_now+D_last; if(D_now>3773) { D_now=3773; duty=3773; } else if(D_now<=0) { D_now=0; duty=0; } else { duty=D_now; } e_last=e_now; D_last=D_now; // PHASE2=duty+380; } 問題如下: D_now=1*(e_now-e_last)+0.0097*e_now+D_last; /*PI Controller:Kp=1,KiTs=0.0097*/ 不會亂開的原因就在於Kp與KiTS很小,所以測試是成功的,但現在的規格必須要為: D_now=4680*(e_now-e_last)+195*e_now+D_last; /*PI Controller:Kp=4680,KiTs=195*/ 就是只要Kp與KiTs數值過大,測試結果就會亂開,如果這樣要如何解決呢? Attach file: (0.00 KB)
發表於: 2009/8/19 15:16
|
|||
|