基于STC12C5A60S2的内嵌A/D和内嵌PWM的PID参数整定

控制对象传递函数: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)

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值