Re: 請問PID程式問題
|
||||
---|---|---|---|---|
中級會員
|
剛剛有打給葛先生了
與他討論完後 建議把定義都改為unsigned char格式 再做Q格式運算 請問Q格式是怎樣做?? 有沒有例子呢?? 謝謝
發表於: 2008/11/5 10:38
|
|||
|
Re: 請問PID程式問題
|
||||
---|---|---|---|---|
版主
|
Microchip FAE 葛育中先生,可以打電話直接找他討論的。
02-2500-6610 分機:807
發表於: 2008/11/5 9:57
|
|||
|
Re: 請問PID程式問題
|
||||
---|---|---|---|---|
資深會員
|
呵呵~~PWM只能整數是一回事, 控制計算時, 使用浮點計算是一回事, 不要弄混了!!
定點DSP可用Q格式計算浮點部分, MCU的話就不要想太多!!
發表於: 2008/11/4 20:51
|
|||
Thanks,
Edward Lee |
||||
|
Re: 請問PID程式問題
|
||||
---|---|---|---|---|
初級會員
|
就算大大用浮點數去算,可是輸出給PWM時仍然是整數的值啊~~~
PWM有輸出浮點數的嗎?~~~
發表於: 2008/11/4 19:06
|
|||
|
Re: 請問PID程式問題
|
||||
---|---|---|---|---|
中級會員
|
另外有沒有人在台中附近
是否可以直接跟有經驗的一起討論 因為有點趕 如果有人也想要一起討論 請回覆 謝謝
發表於: 2008/11/4 15:06
|
|||
|
Re: 請問PID程式問題
|
||||
---|---|---|---|---|
資深會員
|
只看到程式source code
沒看到變數宣告部份 可否麻煩把您變數的宣告一起貼出來 謝謝
發表於: 2008/11/4 11:41
|
|||
|
Re: 請問PID程式問題
|
||||
---|---|---|---|---|
中級會員
|
請問各位 我的命令與回授訊號 做相減的時候
出來的誤差值為有小數點的數,不過我再定義的時候都是使用 unsigned char 這樣只能判別整數 我試過用float 可是以pic16f917 來做float pid控制 可以跑的起來嗎?? 我有看施慶隆老師的pic16f87x裡面的pid控制 我是看他裡面的控制流程寫的程式 不過他裡面用到16位元的整數對整數的乘法 不知道有沒有人也看這本 因為我看組合語言不太懂 不過我看他書上寫的意思是使用整數做運算 而不是浮點數 不知道有沒有人有相關經驗 小弟pid程式搞很久了還沒突破 希望有人指導 謝謝
發表於: 2008/11/4 11:35
|
|||
|
Re: 請問PID程式問題
|
||||
---|---|---|---|---|
初級會員
|
last_error = error;
error_difference = error - last_error;//這週期的error減上週期的error 可愛的大大,你這裡有點問題,你一進來就把ERROR存起來,那下一行的ERROR_DEFFERENCE不是0那才奇怪吧... 正常應該是要把last_error = error; 放在void kd_set(void){}的最後一行才對。 如果你問那一開始的last_error不知道是多少,可愛的大大,可以設0沒關係。 I部份則是累積的值,也就是從開始做控制的時間點開始算,到你現在的誤差。 希望以上對您有幫助。
發表於: 2008/11/3 15:47
|
|||
|
請問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
|
|||
|