Board logo

标题: 微机控制/最小拍控制的C语言描述 [打印本页]

作者: yuchengze    时间: 2016-9-18 15:36     标题: 微机控制/最小拍控制的C语言描述

参考电路图:
参考程序流程图:

参考程序:
/*****************************************
文件名:ACC4-1-1.C
功能描述:最小拍有纹波实验程序。
*****************************************/
#include
#include
#include
/*****************************************
宏定义
*****************************************/
#define uchar unsigned char
#define uint unsigned int
#define ADC_7 XBYTE[0x7ff0]    //定义模数转换IO地址
#define DAC_1 XBYTE[0x7ff2]    //定义D/A第一路的IO地
/*****************************************
全局变量定义
*****************************************/
sbit str = P1^7;      //定义A/D启动信号
sbit DIN0 = P1^0;      //声明同步信号
uint data time;      //声明变量,用于定时
uchar data t0_h,t0_l;     //用于存储定时器0的初值
int   TK=100;       //声明采样周期变量,//采样周期=TK*10ms
int   TC;        //TK的变量
float KK0=0.5435;      //系数kk0
float KK1=-0.2000;      //系数kk1
float KK2=0;       //系数kk2
float KK3=0;       //系数kk3
float PP1=0.7170;      //系数pp1
float PP2=0;       //系数pp2
float PP3=0;       //系数pp3
char UK;        //当前时刻的D/A输出
char EK;        //当前时刻的偏差
char UK_1,UK_2,UK_3,EK_1,EK_2,EK_3;//前3次采样时刻的控制量和偏差
/*****************************************
主函数
*****************************************/
void main(void)
{
TMOD = 0x01;
time = 10;        //定时10ms
t0_h = (65536-500*time)/256;   //计算定时器0初值
t0_l = (65536-500*time)%256;
t0_l = t0_l+20;       //修正因初值重装而引起的定时误差
TH0 = t0_h;
TL0 = t0_l;
IT1 = 1;        //边沿触发中断
EX1 = 1;        //开外部中断1
ET0 = 1;        //开定时中断0
TR0 = 1;        //启动定时器
TC   = 1;
DAC_1= 0x80;       //D/A清零
UK=UK_1=UK_2=UK_3=0;
    EK=EK_1=EK_2=EK_3=0;
EA = 1;        //开总中断
while(1);
}
/**********************************************
函数名:INT1
功能 :1号外部中断服务程序
参数 :无*
返回值:无 *
***********************************************/
void int1() interrupt 2 using 2
{ float i,j;
DIN0 = 1;        //读取输入前,先输出高电平
if(DIN0)         //判同步信号到否
{
     UK=UK_1=UK_2=UK_3=0;
    EK=EK_1=EK_2=EK_3=0;
     DAC_1 =0x80;      //D/A输出零
   TC=1;
}
else
    {
   TC--;        //判采样周期到否
   if(TC==0)
      {
   EK = ADC_7-128;    //采样当前的偏差值,并计算偏差的变化量
   
    i=EK*KK0;      //计算i=EK*KK0+EK_1*KK1+EK_2*KK2+EK_3*KK3)
    i=i+EK_1*KK1;
    i=i+EK_2*KK2;
    i=i+EK_3*KK3;
    j=UK_1*PP1;      //计算j=UK_1*PP1+UK_2*PP2+UK_3*PP3
    j=j+UK_2*PP2;
    j=j+UK_3*PP3;
    i=i-j;       //i-j
   if(i>0)       //判控制量是否溢出,溢出赋极值
   {
        if(i>=127)
            UK=127;
        else
           UK=(char)i;
   }
         else
   {
       if(i<-128)
              UK=-128;
        else
            UK=(char)i;
   }
   DAC_1=UK+128;      //D/A输出控制量
   UK_3=UK_2;       //控制量递推
   UK_2=UK_1;
   UK_1=UK;
        EK_3=EK_2;       //偏差递退
   EK_2=EK_1;
   EK_1=EK;
    TC=TK;        //采样周期变量恢复
    }
}
}
/**********************************************
函数名:Timer0
功能 :定时器0中断服务程序
参数 :无   
返回值:无
***********************************************/
void Timer0() interrupt 1 using 1
{
str = !str;        //产生A/D启动信号
TH0 = t0_h;        //重新装入初值
TL0 = t0_l;
}
参考结果:

阶跃有波纹

阶跃无波纹

斜坡有波纹

斜坡有波纹




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0