控制对象传递函数:Gp=20/(s(0.1s+1)(0.2s+1)
第一个实验主要是出现等幅震荡的波形(纯比例控制):
#include <STC12C5A60S2.H>
#include <absacc.h>
typedef unsigned char u8; //无符号字符型变量新表示方法定义
typedef unsigned int u16; //无符号整型变量新表示方法定义
//#define AD0 XBYTE [0xF0FF] //给定量外部AD通道0的端口地址
//#define AD1 XBYTE [0xF1FF] //反馈量外部AD通道1的端口地址
//#define DA XBYTE [0xEFFF] //外部DA转换数据输入端口地址
#define D_port XBYTE [0x7FFF] //数码管段码锁存器端口地址
#define B_port XBYTE [0xBFFF] //数码管位码锁存器端口地址
#define A0_r -9.27 //实验五的4通道数据
#define Am_r 10.24 //实验五的4通道数据
#define N0_r 0x20 //实验五的4通道数据
#define Nm_r 0xe0 //实验五的4通道数据
#define A0_m -9.32 //实验五的5通道数据
#define Am_m 9.91 //实验五的5通道数据
#define N0_m 0x20 //实验五的5通道数据
#define Nm_m 0xe0 //实验五的5通道数据
#define Any -8.5 //实验三数据
#define Apy 7.86 //实验三数据
#define Nny 0x20 //你的实验板的实验三数据
#define Npy 0xe0 //你的实验板的实验三数据
sbit SW8 = P1^7; //ON为PID控制,OFF为不做控制,误差标度反变换后直接送DA
bit new_cycle_flag=0; //有新采样数据的位变量定义并初始化(1表示有新采样数据)
u8 r_kT,r_kT_L,m_kT,m_kT_L;//内嵌10位AD4通道结果高8位、低2位及显示计算用中间变量、内嵌10位AD5通道结果高8位、低2位及显示计算用中间变量定义定义
u8 status; //存放内嵌ADC状态信息变量定义(1是转换结束)
u16 temp; //平均滤波计算用中间变量定义
char Ax; //显示用中间变量定义
char buf[8]; //显示缓冲区字符型数组定义
float Ax_r,a1_r,b1_r; //给定电压及其标度变换的斜率和截距等浮点型变量定义
float Ax_m,a1_m,b1_m; //反馈电压及其标度变换的斜率和截距等浮点型变量定义
float e_kT,e_kT_T; //当前电压误差、上次电压误差浮点型变量定义(伏特)
float p_P_kT,p_I_kT,p_D_kT,p_I_kT_T,p_kT;//当前各分量,上次积分分量及总控制量浮点变量定义
float Kp,Ki,Kd; //PID参数等浮点型变量定义
float a2,n0; //标度反变换的斜率和截距等浮点型变量定义
u8 M=0,No_ch=0,n; //扫描显示位计数和AD通道变量定义并初始化
u8 code Stab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴段码表
u8 code Btab[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //共阴位码表
float code Kptab[8]={0.6,0.61,0.62,0.63,0.64,0.67,0.70,0.75};//0.61时会出现衰减,0.62时正好等幅振荡
//float code Kptab[8]={0.60,0.61,0.63,0.65,0.66,0.67,0.68,0.69};//换数做,应介于0.61-0.63之间
//float code Kptab[8]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8};//换数做,应在0.6-0.7之间
/********标度变换初始化********/
void Scale_init(void)
{ Ax_r=Nm_r,Ax_m=Am_r;
Ax_r-=N0_r,Ax_m-=A0_r;
a1_r=Ax_m/Ax_r; //式(3-6-1)
b1_r=-a1_r;
b1_r*=N0_r;
b1_r+=A0_r; //式(3-6-2)