/*
多通道AD转换,通道i转换的值保存在对应的变量i里面,保存变量i的值,
用于与下一次转换的值进行比较,转换值发生变化,置位变换标志位flag,
判断变化后的值为何值,从而进行相应的操作,没有变化保持上次状态。
检查下一通道,重复此过程。
*/
其中AtoD 函数与DelaySub函数不存在问题,我感觉好像是for循环出现了问题,或者是一次操作里面的数组出现了问题。
请各位帮忙看看。
void main()
{
int j=0,i=0,flag; //j=循环条件flag=AD转换是否变化的标志位
unsigned long s=0; //s=累加和
unsigned long a[3]={0,0,0}; //AD转换中间变量
int channel[2]={3,4}; //AD通道选择变量
unsigned long ad[2]={0,0}; //AD转换结果
ADCLK=0x44; //初始化A/D转换为4分频,外部总线 Right justifide mode
DDRB_DDRB2=0; //PTB2输入 通道3
PTB_PTB2=0;
DDRB_DDRB1=0; //PTB1输入 通道2
PTB_PTB1=0;
DDRF=0xff; //PTF输出
PTF=0xff;
while(1)
{
for(i=0;i<2;i++)
{
while(j<3)
{
AtoD(channel); //通道i
a[j]=ADBUF;
s=s+a[j]; //取3次转换平均值
++j;
}
ad=s/3;
s=0;
if(labs(temp-ad)<10) //消除小范围的电压波动
flag=0; //变化标志位
else
{
flag=1; //有变化,置位flag
temp=ad;
}
if(flag==1)
{
if(i==0) //通道3
channel1(temp); //调用相应的执行程序
else
if(i==1) //通道2
channel2(temp);
} //if
} //for
}//while
} //main
void channel1(unsigned long ad_tmp1)
{
if(ad_tmp1>738) //3.6 判断电压应该是一个范围
PTF_PTF6=0; //此处替换相应的操作,下面的相同
else
if(ad_tmp1>512) //2.5V
PTF_PTF5=0;
else
if(ad_tmp1>492) //2.4V
PTF_PTF4=0;
else
if(ad_tmp1>472) //2.3V
PTF_PTF3=0;
else
if(ad_tmp1>10) //0.05V
PTF_PTF2=0;
DelaySub(2);
}
void channel2(unsigned long ad_tmp2)
{
if(ad_tmp2>10) //3.6 判断电压应该是一个范围
PTF_PTF1=0; //此处替换相应的操作,下面的相同
else
PTF_PTF7=0;
DelaySub(2);
}
[此贴子已经被strongchen于2006-2-28 10:33:27编辑过]
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |