/* 多通道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); } |