請問PID程式問題
|
||||
---|---|---|---|---|
中級會員
|
以下是我寫的PID程式
void kp_set(void) { error = CCPR1L - feedback; if(error<0) { sign = 1; error_temp = -error; //command - feedback 為負 } else { sign = 0; error_temp = error; //command - feedback 為正 } kp_temp = kp*error_temp; } void ki_set(void) { error_integral = error_integral + error; if(error_integral<0) { signki = 1; error_integral_temp = -error_integral; //error_difference = error - last_error 為負 } else { signki = 0; error_integral_temp = error_integral; //error_difference = error - last_error 為正 } ki_temp = ki*error_integral_temp; if(signki==1) { ki_temp = -ki_temp; } else { ki_temp = ki_temp; } } void kd_set(void) { last_error = error; error_difference = error - last_error;//這週期的error減上週期的error if(error_difference<0) { signkd = 1; error_difference_temp = -error_difference; //error_difference = error - last_error 為負 } else { signkd = 0; error_difference_temp = error_difference; //error_difference = error - last_error 為正 } kd_temp = kd*error_difference_temp; if(signkd==1) { kd_temp = -kd_temp; } else { kd_temp = kd_temp; } } 在P的部分我用CCPR1L當作設定值 feedback當作回授值 在P的部分運算實驗過沒問題 問題在於說 D部分的last_error = error; error_difference = error - last_error;//這週期的error減上週期的error 這邊我這樣寫就變成每次怎麼減都為0了 這樣好像就沒有D運算值 可是這樣寫不是等於這次的ERROR減去上一次的ERROR 還是我有寫錯?? 另外I部分 error_integral的值是怎麼取的?? 程式部分如下 error_integral = error_integral + error; 不過error_integral似乎不知道是怎樣的值 還是我觀念有錯 謝謝大家指教
發表於: 2008/11/3 15:26
|
|||
|
Re: POWER DRIVER 與 MOSFET選擇
|
||||
---|---|---|---|---|
中級會員
|
電路圖檔 修正
謝謝 Attach file: (0.00 KB)
發表於: 2008/10/18 15:21
|
|||
|
POWER DRIVER 與 MOSFET選擇
|
||||
---|---|---|---|---|
中級會員
|
如圖所示
PIC送出PWM訊號給TC4627的POWER DRIVE 在給IRF530的MOSFET 我要問的是說 TC4627的OUT腳位的輸出 如果PIC送出的PWM訊號做DUTY的變換 是否說TC4627的OUT那邊就會從0~15V的變化?? 題外話: 將直流無刷馬達正端接於IRF530的D端 D端上面的48V是怎麼來的?? 謝謝 Attach file: Link only for registered users
發表於: 2008/10/17 15:57
|
|||
|
Re: 關於PWM周期算法
|
||||
---|---|---|---|---|
中級會員
|
對了 就是那邊設錯
謝謝版大
發表於: 2008/10/16 9:54
|
|||
|
關於PWM周期算法
|
||||
---|---|---|---|---|
中級會員
|
我使用PIC16F917
我設定內部震盪頻率4MHZ 定時器分頻值為1 PR2為FFH TMR2為0 套用資料手冊的PWM周期算法為 PWM週期 = (255+1)*4*(1/4MHZ) = 2.56*10e-4 所以pwm頻率為39khz 可是我從pwm腳位量測到的頻率卻為1Khz 這是為什麼呢?? 因為我要利用這個頻率設計 RC值 使PWM波輸出變為直流電 感謝回覆
發表於: 2008/10/15 19:35
|
|||
|
Re: PIC16F917 耐壓耐流
|
||||
---|---|---|---|---|
中級會員
|
我要控制的單相直流馬達規格為 DC12 V 1A
請問有可能設計一個驅動器 讓我的PIC的PWM輸出經由驅動器 後的電流可以不超過1A 否則驅動器又要燒毀了
發表於: 2008/10/9 20:23
|
|||
|
Re: PIC16F917 耐壓耐流
|
||||
---|---|---|---|---|
中級會員
|
不好意思 整體架構的敘述 太過於簡單
我是用PIC16F917的 AN0做一個參考電壓輸入 然後經由AN0 做AD轉換後 把值丟到PWM腳位去輸出 電壓給那台驅動器 而驅動器的電路由於是前人所設計 所以電路圖已經不在 只能確定驅動器可以提升兩倍電壓 因為我要控制DC12伏的直流馬達 PIC輸出電壓不夠 所以須放大來控制 我後來有想到為什麼會把驅動器 燒掉的原因 , 是否是因為我PWM輸出端拉到驅動器的 時候沒有將PWM再用RC低通濾波器將訊號變成直流 再給驅動器 所以導致電流過大而燒毀?? 是否直接用PWM 訊號給驅動器時造成訊號high low的情況所以導致驅動器燒掉 因為我在跑matlab 也適用這塊驅動器 來控制這個直流馬達 就沒有出現燒毀驅動器的問題,改用PIC控制就把驅動器燒毀 目前在想是否是這樣的問題。
發表於: 2008/10/9 0:58
|
|||
|
PIC16F917 耐壓耐流
|
||||
---|---|---|---|---|
中級會員
|
這顆IC的耐壓耐流 我查DATASHEET 電壓在5.5V
電流約uA等級 我拿這顆IC來做 單相直流馬達控制 目前有一個驅動器 可以將電壓放大兩倍 結果最近在做實驗 居然把驅動器燒了 我看電流大概有3A 請問可能的原因是不是 我的驅動器有問題?? PIC的電流不是不大嗎?? 另外請問有沒有什麼驅動器的電路可以搭配來使用的呢??
發表於: 2008/10/8 16:30
Edited by cheece1123 on 2008年10月08日 16:52:16
|
|||
|
Re: 利用PIC16F917 做風扇板角度控制
|
||||
---|---|---|---|---|
中級會員
|
不好意思 再請問
如果我的直流馬達轉移函數為2.6978/1+1.9437s 而我設計出來的kp ki值 各為0.5441與0.22314 請問說在程式的pi控制中 是否就是將AN0 AN1輸出的 誤差值做PI控制,代入PI控制的方程式將Kp Ki值 代入我的0.5441與0.22314後 去驅動直流馬達就行了 而不用程式在去寫相關於直流馬達轉移函數 2.6978/1+1.9437s 就可以達到 pi控制呢?? 謝謝
發表於: 2008/9/18 14:40
|
|||
|