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

📄 闭环pi打印版.cpp

📁 FPGA闭环控制电路积分分离式PID算法子程序
💻 CPP
字号:
/*****************************/
/*         主程序            */
/*****************************/
#include <stdio.h>
#include <conio.h>
#include "ApiEx.h"
#pragma comment(lib,"ApiEx.lib")

void  suanfa(float);		/*算法函数*/
void  zhongduan();		/*中断函数*/

int 	count=0;
float 	ck=0,e=0,eka=0,fk1=0,gk1=0,fk,ek1=0;
BYTE x;

void main()
{
	printf("Press any key to begin!\n\n");
	getch();
	if(!Startup())		/*打开设备*/
	{
		printf("ERROR: Open Device Error!\n");
		return;
	}
		PortWriteByte(0x283,0x35);		/*初始化8253通道0为方式2*/
		PortWriteByte(0x280,0x00);		//定时1ms
		PortWriteByte(0x280,0x10);

		PortWriteByte(0x283,0x77);		/*初始化8253通道1为方式0*/
		PortWriteByte(0x281,0x10);		//定时10ms
		PortWriteByte(0x281,0x00);

		RegisterLocalISR(zhongduan);			/*注册中断程序*/

		EnableIntr();					/*开中断*/
		while(!kbhit()) Sleep(10);
		DisableIntr();				/*关中断*/	

	Cleanup();		/*关闭设备*/
}

/*******************************/
/*        中断定时子程序        */
/*******************************/
void  zhongduan()
{	
	PortWriteByte(0x298,0);                 /*启动A/D*/
	PortReadByte(0x298,&x);
	ck=x;	
	{
		e=5-(ck/255)*5;			//输出电压V0为5V时稳定   
		suanfa(e);	
	}	
	return;
}

/*******************************************/
/*        积分分离式PID算法子程序          */
/*******************************************/
void suanfa(float ek)
{
	#define Kp 	2		// 实际2
	#define Ki 	5	 	// 实际5
	#define Kd 	0		// 实际0
	#define T 	12		// 实际
	#define Ti 	15		// 实际4.8
	#define Td 	0		// 实际0

	float A,B,C,gk,uk;
	byte  uk2;
	if(count==0)					//此段小程序的作用在于使输出
	{						//维持15s的0V电压
		count++;
		uk2=0;
		PortWriteByte(0x290,uk2);		//DA输出u(k)
		Sleep(15000);
	}
	
		{					//PID算法实现程序 
			A=Kp*(1+T/Ti+Td/T);
			B=Kp*(1+2*Td/T);
			C=Kp*Td/T;
		
			uk=A*ek+gk1;
			uk2=uk/5*255;
			if(uk>=5)	uk2=255;		//限幅

			PortWriteByte(0x290,uk2);		//DA输出u(k)
			gk=uk-B*ek+C*ek1;			
			gk1=gk;
			ek1=ek;
		}
	return;
}




⌨️ 快捷键说明

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