|
下面是我從網(wǎng)上找的程序,修改了下,想要達(dá)到通過(guò)更改期望速度來(lái)改變實(shí)際速度的目的。但經(jīng)過(guò)測(cè)試發(fā)現(xiàn)不行,程序在下,希望大佬指出錯(cuò)誤。
#include<reg51.h>
sbit pwm=P1^0;
sbit IN2=P1^1;
unsigned int value;
unsigned int Inlpuse=0;
unsigned int countl=0;
unsigned int time=0;
unsigned int Proportion=5;//比例常數(shù) Proportional Const
unsigned int Integral=1.5;//積分常數(shù) Integral Const
unsigned int LastError=0;//Error[-1]
unsigned int PrevError=0;//Error[-2]
unsigned int Error=0;//Error[0]
int Out=0;//outcome
unsigned int expc_speed=600;
unsigned int real_speed=0;
void main()
{
TMOD = 0x21;
TH0= 0x3c;
TL0 = 0xb0; //50ms
TH1 = 0x9c;
TL1 = 0x9c;
EA=1;
ET0 = 1;
ET1 = 1;
EX0 = 1;
IT0 = 1;
TR1=1;
IT0=1;
}
int PIDControl()
{
Error=expc_speed-real_speed;//計(jì)算偏差
//進(jìn)行增量式PID計(jì)算
Out=Out+
Proportion*(Error-LastError)+
Integral*Error;
//進(jìn)行誤差更新
PrevError=LastError;
LastError=Error;
//上下限幅處理
if(Out<0)
Out=0;//驅(qū)動(dòng)電機(jī)的電壓不可能小于零,故當(dāng)輸出小于零時(shí),輸出應(yīng)該值為零
if(Out>250)
Out=100;//
value=Out;
return value;
}
void exter0() interrupt 0 //外部中斷脈沖計(jì)數(shù)
{ //M法測(cè)速度(外部中斷0和定時(shí)器0用在M法測(cè)速
Inlpuse++;
}
void timer0() interrupt 1
{
TH0 = 0x3c;
TL0 = 0xb0;
time++;
if(time>=10) //1s 鐘讀取次轉(zhuǎn)
{
EX0 = 0;
TR0 = 0;
real_speed=Inlpuse;
Inlpuse=0;
PIDControl();//100ms控制一次
Inlpuse=0;
EX0=1;
TR0=1;
}
}
void T1_time() interrupt 3
{
countl++;
if(countl>= 100)
countl = 0;
if(countl <value)
pwm = 1;
else pwm=0;
}
|
|