📄 开环.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,ek2=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;
suanfa(e);
}
return;
}
/*******************************************/
/* 积分分离式PID算法子程序 */
/*******************************************/
void suanfa(float ek)
{
#define Kp 20 // 实际20
#define Ki 3 // 实际
#define Kd 1 // 实际
#define T 12 // 实际
#define Ti 80 // 实际80
#define Td 0.6 // 实际0.6
float A,B,C,gk,uk;
byte uk2;
if(count==0)
{
count++;
uk2=0;
PortWriteByte(0x290,uk2); //DA输出u(k)
Sleep(15000);
}
{
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=200; //限幅
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 + -