
/*---------------------------------------------
张力测试和控制器使用pid调节算法算法定义
x--本次张力测试值
x1--上次张力测试值
s--张力设定值
e--误差累加值
c1-张力调整值
c--输出量,制动器电流DA值
KP--比例常数
KI--积分常数
KD--微分常数
-----------------------------------------*/
#include"reg52.h"
#include"absacc.h"
#defineucharunsignedchar
#defineunitunsignedint
#definesintsiginedint
#defineTure1
#defineFALSE0
#defineKP1.0//比例常数精度
#defineKI0.0//0.02//5//6-150.0//0.1//积分常数//0.1惯性震荡平移
#defineKD0.3//0.26--18//6-150.10.5//积分常数//0。1仅反映速度
#defineAlpha0.3//Alpha=采样周期/滤波时间常数0.2-0.5
#defineDaVar200//启动之前DA预先置入量
#defineK0.8//从调整量崔算制动器电流系数//0。2
#defineTH11M0X4C
#defineTL11M0X00//11.0592定时50MS
#defineTH12M0X3C
#defineTL12M0XB0//12M定时50MS
sfrWDT_RST=0XE1;//STC89C52RCUSESFC是位于80H-FFH的片内
直接寻址
bitsampleflag;//采集标志
bitenterworkstatus;//进入工作状态
bdataucharadword0,adword,ad8data,da8data;//bdata可位寻址片内数据存储区
sbitad0bit=ad8data^0;
sbitadw7bit=adword^7;
sbitdab7it=da8data^7;//设置ad8data第0位是ad0bit
bdatauchara,b,nddata;
sbita_0=a^0;sbita_7=a^7;
sbitb_0=a^0;sbitb_7=a^7;
sbitndbit_0=nddata^0;//时钟
sbitadck=p1^0;sbitaddi=p1^1;sbitaddo=p1^2;sbitadcs=p1^3;//tlc2643u
///cs为高时处高祖态为低时访引脚
sbitdacs=p3^5;sbitdack=p3^6;sbitdain=p3^7;//max504u
sbitr=p2^0;sbitsrclk=p2^1;sbit=p2^2;//74ls595u
sbitAutoStatus=p3^3;//0---自动1--手动
sbitStartUpSignal=p3^4;//1---收到启动信号
unitad16data,autot,tensiontest,testu,mant,testmax,testmine;//0--65535
unitTestvalue,Setvalue,Prevalue;uint;pulst,num=0;//脉冲
sintda16data,da16new,DownDa;//-32768-32767
uchari,j,IntCount,SmapleCount,StopCount;//smapcount样品
ucharDisplayCount;//显示
ucharcounterc
ucharidatadisbuf[8]={0,0,0,0,0,0,0,0};//间接寻址片内数据存储区
floatx;//本次张力测量值
floatx1;//上次张力测量值
floatx11;//备份x11
floats;//张力设定值
floate;//误差累加值
floatc1;//张力调整值
floatc;//输出量,制动器电流DA值
floatKI=0.0;//积分
ucharcodedisptab[23]={0x88,0xeb,0x4c,0x49,0x2b,0x19,0x18,0xcb,0x08,0x0b,
0x7f,0x0e,0xff,0x80,0xe3,0x44,0x41,0x23,0x11,0x10,
0xc3,0x00,0x03}
//88h-'0',ebh-'1',4ch-'2',49h-'3',2bh-'4',19h-'5',18h-'6',cbh-'7',08h-'8'
//0bh-'9',7fh-'-',oeh-'p',ffh-"",0x80--0x03=="0.~9."
//gfabdpcde
voiddisplay1(uinty);/*changuchardatatodisplaydata*/
voiddisplay2(uintz);/*changeuchardatatodisplaydata*/
voiddisplay3(uintw);
voidndchar(void);
voidad0(void);
voidad2(void);
voidad3(void);
voidtlc2543(void);
voidda(void);
voidinitCpu(void);
//---------------------------------------------------------
//100ms采样一次
//---------------------------------------------------------
voidtimer()interrupt1using1//采用外部中断0
{
TH0=0X4C;//TH11M;
TL0=0X00;//TL11M;
if(intCount>=3)//100ms到50ms2300ms
{IntCount=0;
SampleFlag=TURE;//采样标志
}
}
voidmain(void)
{floatk;//控制器电流采集//0.2
sp=0x70;WDT_RST=0x3a;
InitCpu();//cpu初始化
while(TURE)
{WDT_RST=0x3a;
if(sampleFlag=TURE)//采样周期到
{EA=0;//关中断
TR0=0;//停止计数
SmapleFlag=FALSE;//采集开始
ad0();//读张力测量值
if(Autostatus==0)//自动状态
{ad3();//读自动张力设定值
if(StartupSignal)//shou收到启动信号A=0/B=0
{
x=(float)(tensiontest*5.0/2047.0);//本次AD采样/x本次测量值
s=(float)(autot*5.0/2047.0);//设定值张力设定值
if((++samplecount)<=10)
{k=0.50;s=(s-x11)*sampleCount/10.0+x11;}//前20次为斜坡信
号
el{SampleCount=11;K=0.5;}//0.4//6_150.5
c1=KP*(s-x)+KI*(E+S-X)+KD(X1-X);//张力调整量
c=c+K*c1;//输出量
if(sampleCount<=10){if(c<=x11)c=x11;}
if(c<0.0)c=0.0;
if(c>5.0)c=5.0;//限幅
da16data=(sint)(c*1023.0/5.0);//计算出DA值
da();//输出DA以控制制动器电流
x1=x;
e=e+s-x;
EnterWorkstatus=TURE;
}
el//没有收到连动信号B=0A=1时
{if(Enterworkstatus)//如果正常工作突然停止
{if((++stopcount)<=14)//2.4s保持高输出
{if(stopcount==1)
{da16data=2*da16data;///2005_8_142->1
if(da16data>1023)da16data=1023;
DownDa=da16data;
}
elda16data=DownDa;
}
el
{if(stopCount<=28)//2s降到初始DA
{da16data=DownDa/(StopCount-14);
if(da16data<=DaVar)da16data=DaVar;
}
el
{EnterWorkStatus=FALSE;
StopCount=0;
SmapleCount=0;
e=0;//误差累加值
c=0;//输出量,
x1=x11;
x1=0;
}
}
}
el
da16data=DaVar;
da();
}
display1(tValue);
}
el//手动状态
{ad2();//读手动张力设定值
display3(mant);
SmapleCount=11;
if(!StartUpSignal)//手动状态没有连动信号
{EnterWorkstatus=FALSE;
Stopcount=0;
Samplecount=0;
e=0;//误差累加值
c=0;//输出量
x1=x11;
}
}
TestValue=(uint)((1-Alpha)*preValue+Alpha*TestValue);
preValue=TestValue;
display2(TestValue);//侧张力
if(++DisplayCount>=3)
{ndchar();
DisplayCount=0;
}
TR0=1;//启动定时器
EA=1;//开中断
}
}
}
VoidInitCpu(void)
{uchardelay;
EA=0;//关中断
IP=0x02;//设定中断优先级pt0高优先级
TMOD=0X01;//INTIALUSETIME0
TH0=0x4c;//TH11M;
TL0=0x00;//TL011M;//11.0592timer50ms
SCON=0x00;//串口工作在方式0
ET0=1//EnableTimer0
x1=0;//上次张力设定值
e=0;
c=0;
SampleFlag=FALSE;
EnterWorkStatus=FALSE;
SampleCount=0;//采样次数为0
StopCount=0;
da16data=DaVar;//预先给定DA值
da();
for(delay=0;delay<50;delay++);
ad0();
ad0();
x11=x1=(float)(tsnsiontest*5.0/2047.0);//本次AD采样//备份
preValue=TestValue;
DisplayValue=0;
DisplayCount=0;
EA=1;
TR0=1
}
Program
Voidndchar(void)
{
uchardipbit,disptime;
rclk=0;
for(dispbit=0;dispbit<8;dispbit++)
{nddata=disptab[disbuf[dispbit]];//移位寄存器//Rclk=STcp=移位时钟
脉冲//SRclk=SHcp锁存时钟脉冲
for(disptime=0;disptime<8;disptime++)//送数码
{srclk=0;
r=ndbit_0;
srclk=1;
ndata=ndata>>1;//数据移位
}
}
rclk=1;
}
Voiddisplay1(uintY)
{disbuf[0]=(uchar)(y/1000);y=y-(disbuf[0]*1000);
disbuf[1]=(uchar)(y/100);y=y-(disbuf[1]*100);
disbuf[2]=(uchar)(y/10);y=y-(disbuf[2]*10);
disbuf[2]=disbuf[2]+13;/*add.*/
disbuf[3]=(uchar)(y);
if(disbuf[0]==0)disbuf[0]=12;/*highbit0don'tdisplay*/
}
voiddisplay2(uintz)
//--------------------------
{disbuf[4]=(uchar)(z/1000);z=z-(disbuf[4]*1000);
disbuf[5]=(uchar)(z/100);z=z-(disbuf[5]*100);
disbuf[6]=(uchar)(z/10);z=z-(disbuf[5]*10);//显示数
据
disbuf[6]=disbuf[6]+13;/*add.*/
disbuf[7]=(uchar)(z);
if(disbuf[4]==0)disbuf[4]=12;/*highbit0don'tdisplay*/
//----------------------------------
}
voiddisplay3(uintw)
{w=(uint)(w/3.5);
disbuf[0]=(uchar)(w/1000);w=w-(disbuf[0]*1000);
disbuf[1]=(uchar)(w/100);w=w-(disbuf[1]*100);
disbuf[2]=(uchar)(w/10);w=w-(disbuf[2]*10);
disbuf[2]=disbuf[2]+13;/*add.*/
disbuf[3]=(uchar)(w);
if(disbuf[0]==0)disbuf[0]=12;/*highbit0don'tdisplay*/
}
/*thisprogrameisforget#0channeltensiontestvalue--tensiontest*/
voidad0(void)
{testmin=4096;testmax=0;
adword0=0x00;
adck=0;/*cktolow*/
adcs=1;/*cstohigh*/
tlc2543();
adword0=0x00;
tlc2543();
if(testmin>ad16data)testmain=ad16data;
if(testmax
tensiontest=ad16data;
adword0=0x00;/*12bitcontrolworld*/
tlc2543();
if(testmin>ad16datd)testmin=ad16data;
if(testmax
tensiontest=tensiontest+ad16data;
adword0=0x00;/*12bitcontrolword*/
tlc2543();
if(testmin>ad16data)testmin=ad16data;
if(testmax
tensiontest=tensiontest+ad16data;
adword0=0x00;/*12bitcontrolword*/
tlc2543();
if(testmin>ad16data)testmin=ad16data;
if(testmax
tensiontest=tensiontest+ad16data;
adword0=0x00;/*12bitcontrolworld*/
tlc2543();
if(testmin>ad16data)testmin=ad16data;
if(testmax
Program
tesiontest=tesiontest+ad16data;
tensiontest=(tensiontest-testmin-testmax)/6;
//tensiontest=tensiontest>>1;
//tensiontest=(tensiontest-testmin-testmax)>>1;
TestValue=(uint)(tensiontest*10.0/19.3+0.5);/*manttvalue*/
}
/*thisprogrameisforget#channlautotvalue--autot*/
voidad3(void)
{adword0=0x30;
adck=0;/*cktolow*/
adcs=1;/*csto1*/
tlc2543();
autot=ad16datd;
autot=ad16data>>1;//delete
SetValue=(uint)(autot*10.0/19.3+0.5);
}
/*thisprogramisforgetanalogvalue*/
voidtlc2543(void)
{adword=adwird0;//送通道号地址//
adcs=0;/*cs*/
for(j=0;j<7;j++)
ad0bit=addo;//输入数据//addo=数据输出
//ad0bit=ad8data^0//adw7bit=adword^7
ad8data=ad8data<<7;
addi=adw7bit;//输出的是地址
adck=1;/*ckhigh*/
adck=0;/*cklow*/
ad16data=(uint)ad8data;
ad16data=ad16data<<4;//*采集高8位数据//
adword=0x00;
ad8data=0x00;/*clear0*/
for(j=0;j<3;j++)
{ad0bit=addo;//输入数据//
ad8data=ad8data<<1;
addi=adw7bit;//输出的是地址///*di*/
adword=adword<<1;
adck=1;
adck=0;
}
add0bit=add0;//输入数据//
addi=adw7bit;
adck=1;
adck=0;
adcs=1;/*cstohigh*/
ad16data=ad16data|(uint)ad8data;/*get12bit*/
/*needdelay10usforA/Dconversion,*/
for(delays=0;delay<2;delays++)
{;}/*delay10us*/
}
voidda(void)//D/A转换//
{dack=0;/*tSCLKlow*?
da16new=da16data;
da16mew=da16new<<2//左移2位//
da8data=(uchar)(da16new>>8);
dacs=0;/*cstolow*/
for(i=0;i<8;i++)
{dain=da7bit;/*din*///da7bit=da8data^7
_nop_();/*NOP*/
dack=1;/*SETSCLKHIGH*/
_nop_();
-nop_();
dack=0;/*tsclklow*/
da8data=da8data<<1;
}
da8data=(uchar)(da16new&0x00ff);
for(i=0;i<8;i+)
{dain=da7bit;
_nop_();
dack=0;
_nop_();
_nop_();
dack=0;/*tSCLKLOW*/
da8data=da8data<
}
dacs=1;/*cshigh*/
}
//------------------------------------------------------------
//KP影响控制精度
//KI力学惯性,使震荡平缓
//KD控制提前量,力学家速度//
本文发布于:2023-03-09 11:30:37,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/zhishi/a/167833263720299.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:tlc2543.doc
本文 PDF 下载地址:tlc2543.pdf
| 留言与评论(共有 0 条评论) |