📄 agc.c
字号:
//=======================================================================================
//本程序为AGC模块应用程序,IOA口分配为:IOA0--TLV5618的DIN,DA_DIN;IOA1--DA_SCLK;IOA2--DA_CS;
//IOA3--AD_DCLK;IOA4--AD_CS;IOA5--AD_DIN;IOA6--AD_DOUT;
//=======================================================================================
#include "SPCE061V004.H"
#define Set_IOA_Bit(x) (*P_IOA_Data = *P_IOA_Buffer | x)
#define Clear_IOA_Bit(x) (*P_IOA_Data = *P_IOA_Buffer & ~x)
#define DA_DIN 0x0001 //串行数据输入
#define DA_SCLK 0x0002 //串行时钟
#define DA_CS 0x0004 //使能信号
#define AD_DCLK 0x0008
#define AD_CS 0x0010
#define AD_DIN 0x0020
#define CH0 0x0010 //AD四个通道的选择
#define CH1 0x0050
#define CH2 0x0020
#define CH3 0x0060
extern unsigned int data_val; //5618的控制字
extern unsigned int AD_Data0,AD_Data1,AD_Data2,AD_Data3; //CHX的AD转换得到的数据
extern unsigned long int AMP;
//=======================================================================================
//函数名称:CtrlTLV5618()
//功能:向12位串行DA TLV5618置数
//参数:12位数据
//=======================================================================================
void CtrlTLV5618(unsigned int dat)
{
unsigned int order,value,mask,i;
mask = 0x8000;
order = 0x8000; //OUTA,OUTB,SLOW
value = order | dat;
Set_IOA_Bit(DA_CS);
Clear_IOA_Bit(DA_CS);
for(i=0;i<16;i++)
{
*P_Watchdog_Clear= 0x0001;
Set_IOA_Bit(DA_SCLK);
if(mask & value)
Set_IOA_Bit(DA_DIN);
else
Clear_IOA_Bit(DA_DIN);
Clear_IOA_Bit(DA_SCLK);
mask = mask>>1;
}
Set_IOA_Bit(DA_SCLK);
Set_IOA_Bit(DA_CS);
}
//=======================================================================================
//延时函数
//=======================================================================================
void delay()
{
unsigned int i;
for(i=0;i<100;i++)
{
*P_Watchdog_Clear = 1;
}
}
//=======================================================================================
//函数名称:CtrlAndRead7841()
//功能:控制ADS7841并读取AD转换的数据
//参数:四个通道的选择
//=======================================================================================
unsigned int CtrlAndRead7841(unsigned int CHX)
{
unsigned int mask,i,Order,Reader,temp,AD_Data;
*P_Watchdog_Clear = 1;
Order = 0x0087 | CHX;
mask = 0x0080;
Reader = 0x0040; //IOA6为DOUT,即AD转换的数据由此输入单片机
AD_Data = 0;
Clear_IOA_Bit(AD_DCLK);
Set_IOA_Bit(AD_CS);
Clear_IOA_Bit(AD_CS);
for(i=0;i<8;i++)
{
if(mask & Order)
Set_IOA_Bit(AD_DIN);
else
Clear_IOA_Bit(AD_DIN);
Set_IOA_Bit(AD_DCLK);
Clear_IOA_Bit(AD_DCLK);
mask = mask>>1;
}
delay();
for(i=0;i<16;i++)
{
Set_IOA_Bit(AD_DCLK);
Clear_IOA_Bit(AD_DCLK);
if(*P_IOA_Data & Reader)
temp = 1;
else
temp = 0;
AD_Data = AD_Data<<1; //先读最高位
AD_Data = AD_Data | temp;
}
AD_Data = AD_Data>>4; //得到最后的转换结果
return AD_Data;
}
//=======================================================================================
//函数名称:AGC()
//函数功能:对系统进行自动增益控制
//参数:无
//=======================================================================================
void AGC()
{
unsigned int ad_dat,sum,j;
*P_Watchdog_Clear=1;
sum = 0;
for(j=0;j<8;j++)
{
ad_dat = CtrlAndRead7841(CH0); //读取AD采样值
sum = sum + ad_dat;
}
AD_Data0 = sum >> 3; //取平均值,相当于软件滤波
AMP = AD_Data0 *6;
if(AD_Data0<1641) //幅度小于1V
{
if(data_val<4095)
{
data_val+=1;
CtrlTLV5618(data_val);
}
else
{
data_val=4095;
CtrlTLV5618(data_val);
}
}
else if(AD_Data0>1645 && AD_Data0<3000) //幅度大于1V
{
if(data_val>0)
{
data_val-=1;
CtrlTLV5618(data_val);
}
else
{
data_val=0;
CtrlTLV5618(data_val);
}
}
else if(AD_Data0>=3000)
{
data_val=10;
CtrlTLV5618(data_val);
}
else
CtrlTLV5618(data_val);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -