微机控制/最小拍控制的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;
}
参考结果:
阶跃有波纹
阶跃无波纹
斜坡有波纹
斜坡有波纹