#include <math.h>
#include <vcl.h>
#pragma hdrstop
#include "PID.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
float SP=8.0,PV=0.0;
int pvtrend[480];
int sptrend[480];
int mvtrend[480];
int t1;
float HS=10.0,LS=0.0,HL=7.5,LL=2.5,DH=0.2;
float PID_DB=2,P=20,I=10,D=5,KD=5;
float Un=0.0,DeltaUn=0.0,Un1=0.0,En=0.0,En1=0.0,En2=0.0;
float q0,q1,q2;
float TS=2.0;
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
unsigned long ad_data;
unsigned short int da;
AC6611_AD(hDevice, 0, &ad_data);
PV=LS+ad_data*(HS-LS)/4095.0;
En=SP-PV;
DeltaUn=q0*En+q1*En1+q2*En2;
Un=Un1+DeltaUn;
Un1=Un;
En2=En1;
En1=En;
if( Un>100.0) Un=100.0;
if(Un<0) Un=0;
da=(unsigned short int)(Un*4095.0/100.0);
//da=(unsigned short int)(2048+Un*1024.0/100.0);
AC6611_DA(hDevice,da);
//PV=120+50*sin(t1*5*3.1415/360);
t1++;
for(int i=0;i<479;i++)
{
pvtrend[i]=pvtrend[i+1];
pvtrend[479]=300*PV/(HS-LS);
sptrend[i]=sptrend[i+1];
sptrend[479]=300*SP/(HS-LS);
mvtrend[i]=mvtrend[i+1];
mvtrend[479]=300*Un/100.0;
}
Image2->Picture->LoadFromFile("bangtu.bmp");
Image2-> Canvas->Pen->Color = clRed;
Image2-> Canvas->Pen->Width = 3;
Image2->Canvas->MoveTo(20,181);
Image2->Canvas->LineTo(20,181-SP*177/(HS-LS));
Image2-> Canvas->Pen->Color = clBlue;
Image2->Canvas->MoveTo(26,181);
Image2->Canvas->LineTo(26,181-PV*177/(HS-LS));
Image2-> Canvas->Pen->Color = clGreen;
Image2->Canvas->MoveTo(46,181);
Image2->Canvas->LineTo(46,181-Un*177/100.0);
//绘制趋势曲线
Image1->Picture->LoadFromFile("qushi.bmp");
Image1-> Canvas->Pen->Width = 1;
Image1-> Canvas->Pen->Color = clRed;
Image1->Canvas->MoveTo(0,300);
for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-sptrend[i]);
Image1-> Canvas->Pen->Color = clBlue;
Image1->Canvas->MoveTo(0,300);
for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-pvtrend[i]);
Image1-> Canvas->Pen->Color = clGreen;
Image1->Canvas->MoveTo(0,300);
for(int i=0;i<480;i++) Image1->Canvas->LineTo(i,300-mvtrend[i]);
//Edit1->Text=FloatToStrF(SP,0,4,4);
Edit2->Text=FloatToStrF(PV,0,4,4);
Edit3->Text=FloatToStrF(Un,0,4,4);
Form1->Caption="《计算机测控系统》PID算法编程范例 " + DateTimeToStr(Now());
}
void __fastcall TForm1::Button5Click(TObject *Sender)
{
if (Edit15->Text=="123456")
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
q0=(100.0/P)*(1+TS/I+D/TS);
q1=-(100.0/P)*(1+2*D/TS);
q2=(100.0/P)*D/TS;
//------------
hDLL=LoadLibrary("ac6611.dll");
if(hDLL!=NULL)Label29->Caption = "AC6611.dll load ok!";
(FARPROC &)AC6611_CreateDevice=GetProcAddress(hDLL,"AC6611_CreateDevice"); //创建驱动句柄
(FARPROC &)AC6611_CloseDevice=GetProcAddress(hDLL,"AC6611_CloseDevice"); //关闭驱动句柄
(FARPROC &)AC6611_DI=GetProcAddress(hDLL,"AC6611_DI"); //数字量输入,port=0-1两个通道,8位数据由DiData返回
(FARPROC &)AC6611_DO=GetProcAddress(hDLL,"AC6611_DO"); //数字量输出,port=0-1两个通道,8位数据由DoData输出
(FARPROC &)AC6611_DiBit=GetProcAddress(hDLL,"AC6611_DiBit"); //数字量输入,port=0-1两个通道,指定位输入
(FARPROC &)AC6611_DoBit=GetProcAddress(hDLL,"AC6611_DoBit"); //数字量输出,port=0-1两个通道,指定位输出
(FARPROC &)AC6611_DA=GetProcAddress(hDLL,"AC6611_DA"); //DA输出,0-4095
(FARPROC &)AC6611_VoltageToDA=GetProcAddress(hDLL,"AC6611_VoltageToDA");
(FARPROC &)AC6611_AD=GetProcAddress(hDLL,"AC6611_AD"); //通用AD采样
(FARPROC &)AC6611_AD_CHN=GetProcAddress(hDLL,"AC6611_AD_CHN"); //设置AD通道0-15
(FARPROC &)AC6611_ADS=GetProcAddress(hDLL,"AC6611_ADS"); //直接AD采样,为单通道AD采样设计
(FARPROC &)AC6611_ADToVoltage=GetProcAddress(hDLL,"AC6611_ADToVoltage");
hDevice=AC6611_CreateDevice(0, &ErrorOf6611); //创建驱动,选择第0块卡
if(hDevice != -1){
Label30->Caption = "AC6611 Card Is Exist!";
}else{
Label30->Caption = "AC6611 Card Is not Exist!";
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HS=StrToFloat(Edit5->Text);
LS=StrToFloat(Edit6->Text);
HL=StrToFloat(Edit7->Text);
LL=StrToFloat(Edit8->Text);
DH=StrToFloat(Edit9->Text);
PID_DB=StrToFloat(Edit10->Text);
P=StrToFloat(Edit11->Text);
I=StrToFloat(Edit12->Text);
D=StrToFloat(Edit13->Text);
KD=StrToFloat(Edit14->Text);
q0=(100.0/P)*(1+TS/I+D/TS);
q1=-(100.0/P)*(1+2*D/TS);
q2=(100.0/P)*D/TS;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label13Click(TObject *Sender)
{
SP=StrToFloat(Edit1->Text);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Label15Click(TObject *Sender)
{
unsigned short int dav;
dav=(unsigned short int)(4095*StrToFloat(Edit3->Text)/100.0);
if( dav>4095) dav=4095;
AC6611_DA(hDevice,dav);
}
//---------------------------------------------------------------------------
AC6611_PID.rar_atmega88 PID A_pid 温度_pid 温度控制
版权申诉
35 浏览量
2022-07-15
02:58:31
上传
评论
收藏 37KB RAR 举报
御道御小黑
- 粉丝: 61
- 资源: 1万+
最新资源
- Pytorch-pytorch深度学习教程之前馈神经网络.zip
- Pytorch-pytorch深度学习教程之线性回归.zip
- Pytorch-pytorch深度学习教程之基本操作.zip
- 基于QT的地图可视化桌面系统后台数据库为MySQL5.7源码.zip
- 基于simulink的PLL锁相环系统仿真【包括模型,文档,参考文献,操作步骤】
- 基于EM-GMM模型的目标跟踪和异常行为检测matlab仿真【包括程序,注释,参考文献,操作步骤,说明文档】
- 2109010044_胡晨燕_选课管理数据库设计与实现.prj
- 帕鲁介绍的PPT备份没什么好下的
- demo1-202405
- 两种方式修改Intel网卡MAC地址
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈