参阅电路图:
参阅程序流程图:
参阅程序:
/*****************************************
文件名: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;
}
参阅成果:
阶跃有波纹
阶跃无波纹
斜坡有波纹
斜坡有波纹