欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
單片機(jī)+電機(jī)PID控制之參數(shù)確定問題
[打印本頁]
作者:
diaobaole
時(shí)間:
2019-7-24 16:00
標(biāo)題:
單片機(jī)+電機(jī)PID控制之參數(shù)確定問題
這個(gè)是在論壇里找到的一個(gè)比較簡(jiǎn)單且經(jīng)典的pid控制算法,但是我很想知道三個(gè)參數(shù)是什么確定的,我認(rèn)為這才是問題的關(guān)鍵所在啊。
求大神教一下選定參數(shù)的方法,就如果給你們做,代碼已經(jīng)寫好,現(xiàn)在就是要確定pid的三個(gè)參數(shù),你們通過什么方法找到一個(gè)比較好的參數(shù)?
單片機(jī)源程序如下:
#include<reg51.h>
#include "intrins.h"
#include <lcd.H>
#define uchar unsigned char
#define uint unsigned int
#define GPIO_KEY P2
sbit PWM=P1^4;
sbit P10=P1^0;
sbit P12=P1^2;
uchar speed1[4]={"0000"};//設(shè)定轉(zhuǎn)速
uchar speed2[3]={"000"};//占空比
uchar speed[]={"0000"};//當(dāng)前轉(zhuǎn)速
uchar KeyValue=0;
uint AA,count=0,flag;
float pid_p=0.003,pid_i=0.003,pid_d=0.002; //PID三個(gè)參數(shù) 初值
uint SpeedSet=3000,CurrentSpeed;//設(shè)定轉(zhuǎn)速 當(dāng)前轉(zhuǎn)速
unsigned char pid_val_mid;//pid_val_mid脈沖寬度
unsigned int lastError=0;
long int sumError=0;//sum偏差和
void delay1(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=0;j<333;j++)
{;}
}
/********************* 鍵盤掃描*************/
void KeyDown(void)
{
GPIO_KEY=0x0f;
delay1(10);
if(GPIO_KEY!=0x0f)
{
delay1(10);
if(GPIO_KEY!=0x0f)
{
//測(cè)試列
GPIO_KEY=0X0F;
delay1(10);
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//測(cè)試行
GPIO_KEY=0XF0;
delay1(10);
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
}
}
}
void timer()
{
TMOD=0x11;//定時(shí)器0工作方式1.16位,定時(shí)器1工作方式1,16位定時(shí);
TH0=0x4b;//50ms初值
TL0=0xfe;
TH1=0xfc;//1msPWM控制
TL1=0x66;
TR1=1; //啟動(dòng)定時(shí)器1
ET1=1; //定時(shí)器1中斷使能
IT0=1;//外部中斷下降沿觸發(fā)
TR0=1; //定時(shí)器啟動(dòng)標(biāo)志
ET0=1; //定時(shí)器中斷使能
EX0=1; //外部中斷使能
EA=1; //全局中斷
}
/***********************lcd顯示*************/
void display()
{
speed[0]=CurrentSpeed/1000+0x30; //當(dāng)前轉(zhuǎn)速
speed[1]=CurrentSpeed/100%10+0x30;
speed[2]=CurrentSpeed/10%10+0x30;
speed[3]=CurrentSpeed%10+0x30;
speed1[0]=SpeedSet/1000+0x30;//設(shè)定轉(zhuǎn)速
speed1[1]=SpeedSet/100%10+0x30;
speed1[2]=SpeedSet/10%10+0x30;
speed1[3]=SpeedSet%10+0x30;
speed2[0]=pid_val_mid/100+0x30;
speed2[1]=pid_val_mid/10%10+0x30;//占空比
speed2[2]=pid_val_mid%10+0x30;
DispHanzi(0,0,5,"當(dāng)前轉(zhuǎn)速:");
DispZimu(0,5,4,speed);
DispHanzi(1,0,5,"設(shè)定轉(zhuǎn)速:");
DispZimu(1,5,4,speed1);
DispHanzi(3,0,4,"占空比:");//占空比
DispZimu(3,4,3,speed2);
DispHanzi(3,6,1,"%");//占空比
}
/************************電機(jī)控制*************/
void keyKZ()
{
if(KeyValue==4)//正轉(zhuǎn)
{
P10=1;
P12=0;
}
if(KeyValue==5)//反轉(zhuǎn)
{
P10=0;
P12=1;
}
if(KeyValue==6)//停車
{
P10=0;
P12=0;
}
if(KeyValue==12)//設(shè)定速度加50
SpeedSet+=50;
if(KeyValue==13)//設(shè)定速度減50
SpeedSet-=50;
if(KeyValue==14)//設(shè)定速度加1
SpeedSet+=1;
if(KeyValue==15)//設(shè)定速度減1
SpeedSet-=1;
KeyValue=0;
}
/************************PID控制算法*************/
unsigned int PID()
{
int dError=0,Error=0,B;
Error=SpeedSet-CurrentSpeed;//當(dāng)前誤差
sumError=Error+sumError;//誤差和
dError=Error-lastError;//誤差偏差
lastError=Error;
B=pid_p*Error+pid_i*sumError+pid_d*dError;
if(B>100) pid_val_mid=100;
if(B<0) pid_val_mid=0;
if(B>=0&&B<=100)
pid_val_mid=B;
return(0);
}
void Timer0_isr() interrupt 1 //定時(shí)器0中斷
{
AA++;
TH0=0x4b;
TL0=0xfe;
if(AA==20)
{
CurrentSpeed=count*3;//一分鐘的轉(zhuǎn)速
count=0;
AA=0;
PID();
}
}
void key_int() interrupt 0 //外部中斷P32口
{
count++;
}
void Timer1() interrupt 3
{
static int c=0;
TH1=0xfc;
TL1=0x66;
c++; //每次定時(shí)器溢出加1
if(c<=pid_val_mid) PWM=1;
if(c>pid_val_mid) PWM=0;
if(c>=100) c=0;
}
void main()
{
timer();//定時(shí)器初始化
InitLCD();//LCD初始化
while(1)
{
KeyDown(); //鍵盤掃描
keyKZ();//鍵盤控制
display();//顯示LCD
}
}
復(fù)制代碼
所有資料51hei提供下載:
PID控制電機(jī).zip
(41.03 KB, 下載次數(shù): 25)
2019-7-24 15:54 上傳
點(diǎn)擊文件名下載附件
作者:
瘋子本人
時(shí)間:
2019-7-24 18:23
matlab仿真一下吧,上位機(jī)看波形也ok,或者先把ID定為0,然后調(diào)整P,等調(diào)到差不多的時(shí)候,在去調(diào)整I(D為0),最后調(diào)D,PID有很多方法調(diào)整,看你喜歡哪種咯
作者:
amo73
時(shí)間:
2019-7-24 22:00
如果沒學(xué)過自控原理,可以搜一下“PID口訣”……
作者:
cjm82
時(shí)間:
2019-7-24 22:41
PID的公式你別看它又有積分又有微分,真正的難點(diǎn)還是三個(gè)項(xiàng)前面的系數(shù),這3個(gè)系數(shù)取值需要根據(jù)你實(shí)際的系統(tǒng),電機(jī)我不太懂,我就拿簡(jiǎn)單的可控硅延時(shí)導(dǎo)通來控制加熱來舉例子,這三個(gè)系數(shù)跟你的加熱棒功率,加熱棒與被加熱物體直接的接觸,被加熱物體質(zhì)量,材料等溫度傳感器安裝的位置都有關(guān),需要反復(fù)調(diào)試,觀察其響應(yīng)曲線,才能找出三個(gè)系數(shù)最佳的取值.
作者:
yzwzfyz
時(shí)間:
2019-7-25 12:02
你問的問題,與單片機(jī)及程序無關(guān),與控制理論相關(guān),你需要補(bǔ)自動(dòng)化控制理論方面的課。
否則你只能用實(shí)驗(yàn)方式去試出一組或N組不太保險(xiǎn)的經(jīng)驗(yàn)值。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1