參考電路圖:
參考程序流程圖:
參考程序:
/*****************************************
文件名:ACC4-1-1.C
功能描述:最小拍有紋波實驗程序。
*****************************************/
#include
#include
#include
/*****************************************
宏定義
*****************************************/
#define uchar unsigned char
#define uint unsigned int
#define ADC_7 XBYTE[0x7ff0] //定義模數(shù)轉(zhuǎn)換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; //系數(shù)kk0
float KK1=-0.2000; //系數(shù)kk1
float KK2=0; //系數(shù)kk2
float KK3=0; //系數(shù)kk3
float PP1=0.7170; //系數(shù)pp1
float PP2=0; //系數(shù)pp2
float PP3=0; //系數(shù)pp3
char UK; //當前時刻的D/A輸出
char EK; //當前時刻的偏差
char UK_1,UK_2,UK_3,EK_1,EK_2,EK_3;//前3次采樣時刻的控制量和偏差
/*****************************************
主函數(shù)
*****************************************/
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; //邊沿觸發(fā)中斷
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);
}
/**********************************************
函數(shù)名:INT1
功能 :1號外部中斷服務(wù)程序
參數(shù) :無*
返回值:無 *
***********************************************/
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; //采樣周期變量恢復(fù)
}
}
}
/**********************************************
函數(shù)名:Timer0
功能 :定時器0中斷服務(wù)程序
參數(shù) :無
返回值:無
***********************************************/
void Timer0() interrupt 1 using 1
{
str = !str; //產(chǎn)生A/D啟動信號
TH0 = t0_h; //重新裝入初值
TL0 = t0_l;
}
參考結(jié)果:
階躍有波紋
階躍無波紋
斜坡有波紋
斜坡有波紋