⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pid.cpp

📁 一个简单的PID自动控制程序,对这方面有兴趣但是又无从下手的人可以看一下
💻 CPP
字号:
// pid.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "malloc.h"
#include <iostream>
#include "Usb7kC.h"
#include <math.h>
using namespace std;

#define PRECISION 0.001

typedef struct node
{
	double e0;   //理想信号值
	double t;    //采样周期
	double k, ti, t_on_off, td;  //比例系数, 积分系数,积分方法开关, 微分系数
	double u0;   //控制信号初值
}pid_set, *pid_node;

void pid_ctrl(pid_node, struct ZT_USBBOARD *, struct ZT_USBBOARD *);//用一个struct传递多个参数
void setDA(double, struct ZT_USBBOARD *);    //自动数模转换, 内部的计算实现用模拟值
double getDA(struct ZT_USBBOARD *);

//double test_value=6000;

int main(int argc, _TCHAR* argv[])
{
	
	int trial_times=3;  //实验次数
	struct ZT_USBBOARD a;
	a.lIndex=0;
	cout<<OpenUSB7kC(&a);
	a.lCode =0;
	a.nCh =1;
	a.lData =2048;
	//USB7333DA(&a);

	double in=0, out=0;
	


	pid_node ptr=(pid_node)malloc(sizeof(pid_set));
	
	ptr->e0=0;
	ptr->k=0.1;
	ptr->t=1;
	ptr->t_on_off=1;
	ptr->td=0;
	ptr->ti=5;
	ptr->u0 =0;

	for (int i=0;i<trial_times;i++)
	{
		cout<<"Input some input_Value: ";
		cin>>in;
		setDA(in, &a);
		Sleep(3000);
		out=getDA(&a);
		cout<<endl<<"The out_put_Value is "<<out;
		
	}
	
	//pid_ctrl(ptr, &a ,&a);

	//cout<<endl<<"Now value:  "<<test_value;
	return 0;
}

void pid_ctrl(pid_node x, struct ZT_USBBOARD *in, struct ZT_USBBOARD *out)
{
	//环境设置
	double e0=x->e0;
	double t=x->t;
	double k=x->k , ti=x->ti ,t_on_off=x->t_on_off, td=x->td ;
	//设置增量系数
	double d0,d1,d2;
	double e1=0,e2=0,e3=0; //ei-2, ei-1, ei
	double e_current=0;
	double u_diff=0, u0=x->u0;
	
	double u_diff_diff=0;  //增量式控制算式的主要结果
	double temp=PRECISION*e0;
	d0=k* (1 + (t * t_on_off) /ti + td/t);
	d1=-1* k *(1+ 2* td /t);
	d2= k* td /t;
	
	
	while(abs(e_current=getDA(in)-e0) >temp)
	{
		
		e3= e0-e_current;  //与理想值差值

		u_diff_diff=d0 *e3 + d1* e2 +d2* e1;//通过PID控制得出差量控制信号---是差量的差量,而不只是差量..
		
		
		u_diff=u_diff+ u_diff_diff;
		u0=u0+ u_diff;
		setDA(u0, out);

		e1=e2;//为下一次采样做准备
		e2=e3;
		Sleep(1000);
		cout<<u0<<endl;
		
		//------过一段时间
		
	}

	
	
}
void setDA(double x, struct ZT_USBBOARD *out)
{
	out->lData=x;
	USB7333DA(out);
	
}
double getDA(struct ZT_USBBOARD *in)
{
	//根据量程-5——5v,进行原码-模拟量转换
	return in->lData;
	//return USB7333AI(in);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -