• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users




« 1 (2)


Re: 請問PID程式問題
#10
中級會員
中級會員


查看用戶資訊
剛剛有打給葛先生了

與他討論完後 建議把定義都改為unsigned char格式

再做Q格式運算


請問Q格式是怎樣做?? 有沒有例子呢??

謝謝

發表於: 2008/11/5 10:38
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請問PID程式問題
#9
版主
版主


查看用戶資訊
Microchip FAE 葛育中先生,可以打電話直接找他討論的。
02-2500-6610 分機:807

發表於: 2008/11/5 9:57
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請問PID程式問題
#8
資深會員
資深會員


查看用戶資訊
呵呵~~PWM只能整數是一回事, 控制計算時, 使用浮點計算是一回事, 不要弄混了!!
定點DSP可用Q格式計算浮點部分, MCU的話就不要想太多!!

發表於: 2008/11/4 20:51
Thanks,
Edward Lee
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請問PID程式問題
#7
初級會員
初級會員


查看用戶資訊
就算大大用浮點數去算,可是輸出給PWM時仍然是整數的值啊~~~

PWM有輸出浮點數的嗎?~~~

發表於: 2008/11/4 19:06
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請問PID程式問題
#6
中級會員
中級會員


查看用戶資訊
另外有沒有人在台中附近

是否可以直接跟有經驗的一起討論

因為有點趕

如果有人也想要一起討論

請回覆

謝謝

發表於: 2008/11/4 15:06
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請問PID程式問題
#5
中級會員
中級會員


查看用戶資訊
#include <pic.h>
#include <pic16f91x.h>


// for kp
float kp;
float command;
float feedback;
float error; //command - feedback
float last_error; //上一次的誤差
bit signkp;
float error_temp;
float kp_temp;


//for kd
float error_difference;
float last_error;
bit signkd;
float error_difference_temp;
float kd_temp;
float kd;

//for ki
float error_integral;
bit signki;
float error_integral_temp;
float ki_temp;
float ki;

//for pwm
float u;



void delay5000(void)
{unsigned int t;
t=5000;
while(--t);
}



void delay(unsigned char t)
{
while(--t);
}



void init_a2d(void)
{
INTCON = 0x00;
OPTION = 0x80; //禁止PROTB上拉致能
OSCCON = 0x61; //選擇內部振盪器作時脈4MHz
LCDCON = 0x00; //把LCD模組關閉

TMR2IF = 0;
CCP2IF = 0;
TMR2IE = 0;
CCP2IE = 0;
TMR2 = 0X00;
CCP1CON = 0X00; //關閉CCP1 MODULE
T2CON = 0X00;
PR2 = 0XFF;




ANSEL = 0x03;
TRISA = 0X1F;
PORTA = 0xFF;
PORTC = 0xFF;
TRISC = 0x00;

GIE = 0;



}

void AD_Get(void) //讀ANO AN1值
{


ADCON0= 0x00; // AN0 VDD VSS 右對稱
ADCON1= 0x10; // 轉換時脈2us
ADON=1; // 打開AD
delay(20);
GODONE = 1;
while(GODONE);

CCP1CON = 0x0C;
command = ADRESH;
CCPR1L = command;
T2CON = 0X05;







}
void an1_get()
{

ADCON0= 0x00; // AN1 VDD VSS 右對稱
ADCON1= 0x10; // 轉換時脈2us
ADON=1; // 打開AD
CHS0 = 1;
CHS1 = 0;
CHS2 = 0;
delay(20);
GODONE = 1;
while(GODONE);

feedback = ADRESH;

}

void kp_set(void)
{
kp = 0.5441;
error = command - feedback;

if(error<0)
{
signkp = 1;
error_temp = -error; //command - feedback 為負

}
else
{
signkp = 0;
error_temp = error; //command - feedback 為正

}
kp_temp = kp*error_temp;



}



void kd_set(void)
{

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;

last_error = error;

}

void ki_set(void)
{
ki = 0.22314;
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;



}

void pwm_out(void)
{
//u = kp_temp+kd_temp+ki_temp;
u = kp_temp+ki_temp;
CCP1CON = 0x0C;
CCPR1L = u;
T2CON = 0x05;

}


void main(void)
{
init_a2d();

while(1)
{

AD_Get();
an1_get();
kp_set();
//kd_set();
ki_set();
pwm_out();

}

}


附上程式 感謝各位

發表於: 2008/11/4 11:50
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請問PID程式問題
#4
資深會員
資深會員


查看用戶資訊
只看到程式source code
沒看到變數宣告部份
可否麻煩把您變數的宣告一起貼出來
謝謝

發表於: 2008/11/4 11:41
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請問PID程式問題
#3
中級會員
中級會員


查看用戶資訊
請問各位 我的命令與回授訊號 做相減的時候

出來的誤差值為有小數點的數,不過我再定義的時候都是使用

unsigned char 這樣只能判別整數

我試過用float 可是以pic16f917 來做float pid控制

可以跑的起來嗎??

我有看施慶隆老師的pic16f87x裡面的pid控制

我是看他裡面的控制流程寫的程式

不過他裡面用到16位元的整數對整數的乘法

不知道有沒有人也看這本

因為我看組合語言不太懂

不過我看他書上寫的意思是使用整數做運算 而不是浮點數

不知道有沒有人有相關經驗

小弟pid程式搞很久了還沒突破

希望有人指導

謝謝

發表於: 2008/11/4 11:35
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 請問PID程式問題
#2
初級會員
初級會員


查看用戶資訊
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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


請問PID程式問題
#1
中級會員
中級會員


查看用戶資訊
以下是我寫的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
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.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------