/**************************************************************/
/* 文件名: AD0809.c */
/* 功能描述: AD采樣實(shí)驗(yàn),結(jié)果通過串口送PC顯示(脫機(jī)運(yùn)行) */
/* 結(jié)果送內(nèi)部數(shù)據(jù)區(qū)30H,共16個(SoftIce調(diào)試) */
/**************************************************************/
#include <reg51.h>
//#include "SST89x5x4.h"
#include "Absacc.h"
#define T_value (unsigned char)0xFE // T周期值
#define T1_value (unsigned char)0x20 // T周期中高電平周期T1值
#define TH0_value (unsigned char)0xFE // 定時器T0計(jì)數(shù)值(高)10
#define TL0_value (unsigned char)0x9B // 定時器T0計(jì)數(shù)值(低)
unsigned char V_Set;
float Kp=0;
float Ki=0;
float Sum= 0 ;
#define STARTAD XBYTE[0x7F00]
#define ADRESULT XBYTE[0x7F08]
sbit ADBUSY = P3^3;
void Delay()
{
unsigned char i;
for(i=0; i<100; i++);
}
unsigned char AD0809(void)
{
unsigned char result;
STARTAD = 0; //啟動AD
while(ADBUSY == 1); //等待轉(zhuǎn)換結(jié)束
Delay();
result = ADRESULT;
return result; //返回轉(zhuǎn)換結(jié)果
}
sbit DRV = P1^7;
unsigned char T_Count; // 延時次數(shù)
//unsigned char ADV; //變量
//unsigned char Tx;
void init_tim0() // 定時器0初始化,定時基數(shù)
{
TMOD = 0x01;
TH0 = TH0_value;
TL0 = TL0_value;
TR0 = 1;
ET0 = 1;
EA = 1;
}
void init_tim1() // 定時器1初始化,定時基數(shù)
{
TMOD |= 0x50;
TH1 = 0;
TL1 = 0;
TR1 = 1;
// ET0 = 1;
}
void int_tim0() interrupt 1
{
TH0 = TH0_value;
TL0 = TL0_value;
T_Count++;
}
float PID_Control (float get) //PID控制算法
{
float err ;
err = V_Set - get;
Sum += err;
return (Kp*err + Ki * Sum ) ;
}
void main(void)
{
short V_get,OUT;
Kp =1;
Ki =1;
DRV = 1;
V_Set=0;
init_tim0();
init_tim1();
T_Count = 0;
// Tx = ADV;
while(1)
{
//
// Delay();
V_get = TH1<<8|TL1;
V_Set = AD0809();
OUT= PID_Control(V_get);
if(T_Count<V_Set)
{
DRV =0;
// Tx = T_value - Tx;
// T_Count = Tx;
}
else { DRV =1;}
if(T_Count==0xFE)
{T_Count=0x00;}
}
}
|