我现在使用 3路 AD,一路 AD 按键,
一路测温度,
一路测湿度 ,
在同时开启3路轮询转换的情况下 每一路得到的AD会不对,只开一路AD 值就正常.能帮忙分析下原因么? 不知道是不是软件问题,硬件上电压都正常 ,困扰我很久了,相关代码如下:
////////////////////////////////////////////////// AD初始化配置等
uint ADC_Convert(void)
{
unsigned int Tad=0,MinAd=0x0fff,MaxAd=0x0000,TempAdd=0;
unsigned char t=0;
// ADCCON |= Channel;
for(t=0;t<10;t++)
{
ADCCON |= 0X40; //开始 ADC 转换
while(!(ADCCON&0x20)); //等待 ADC 转换完成
ADCCON&=~(0X20); //清中断标志位
Tad = ((unsigned int)ADCVH<<4)+(ADCVL>>4); //取得一次转换值
if (Tad>MaxAd)
{
MaxAd=Tad ;//获得当前的最大值
}
if (Tad<MinAd)
{
MinAd=Tad; //获得当前的最小值
}
TempAdd+=Tad; //转换值累加
}
TempAdd-=MinAd; //去掉最小值
TempAdd-=MaxAd; //去掉最大值
TempAdd>>=3; //求平均值
return(TempAdd);
}
/*****************************************************
*函数名称:void ADC_channel(unsigned char channel)
*函数功能:ADC通道选择
*入口参数:void
*出口参数:Channel
*****************************************************/
void ADC_Channel(unsigned char Channel)
{
ADCCON |= Channel; //ADC 输入选择为 ADCchannel 口
if(Channel<8)
{
ADCCFG0 = 1<<Channel; //设置Channel作为采样口
}
else
{
ADCCFG1 = 1<<(Channel-8); //设置Channel作为采样口
}
}
////////////////////////////////////////////////
void ADC_Multichannel(void)
{
ADCCFG0 = 0; // 设置为 ADC 口,并自动将上拉电阻移除。
ADCCFG1 = 0; //设置 AIN12-15设置为 ADC 口,并自动将上拉电阻移除。
ADCCFG2 = 0x06; //fsys/6, 36个采样周期 //大约19us一次转换
ADCCON |= 0X80; //开启 ADC 模块电源
EADC = 0;
ADCCON&=~(0X20); //清中断标志位
// TEMPR_Value = ADC_Convert(14); //启动 ADC 转换,获得转换值
//
// HUMR_Value = ADC_Convert(15); //启动 ADC 转换,获得转换值
// LDR_Value = ADC_Convert(12); //启动 ADC 转换,获得转换值
// KEY_Value = ADC_Convert(13); //启动 ADC 转换,获得转换值
}
//////////////////////////////////////////////////////////////////主函数调用
ADC_Multichannel();
RAM_Init();
while(1)
{
if(Flag & UPDATA_F){//10ms定时
Flag &= ~UPDATA_F;
Key_Function(); ///按键
PWM_FAN(KEY_Anion);
ALM_Function();
calc_display();
BT_RESET();
}
if(Flag & SEC5_F)//5s定时
{
Flag &= ~SEC5_F;
THTEMP_Function(); //测温湿度
}
}
/////////////////////////////////////////////////////按键子函数 10ms调用一次
uchar Get_Key(void)
{
uint value;
uchar keyvalue;
ADC_Channel(KEY_AN);
value = ADC_Convert(); //
if((KEY_YEAR_VALUE < value) && (value <= KEY_MAX_VALUE))
keyvalue = KEY_NULL;
else if ((KEY_SET_VALUE < value) && (value < KEY_YEAR_VALUE))
keyvalue = KEY1;
else if ((KEY_UP_VALUE < value) && (value < KEY_SET_VALUE))
keyvalue = KEY2;
else if ((KEY_DOWN_VALUE <= value) && (value < KEY_UP_VALUE))
keyvalue = KEY3;
else if ((KEY_MIN_VALUE <= value) && (value < KEY_DOWN_VALUE))
keyvalue = KEY4;
else return 0;
return keyvalue;
}
///////////////////////////////////////////////////////////////////////测湿度子函数
void THTEMP_Function(void)//测量温湿度值
{
uchar loc,gbl;
uint i,j,temp;
ADC_Channel(TEMPR_AN);
temp = ADC_Convert();
for(gbl = 1;gbl < 60;) //温度范围-10-55度,0表示-10度,60表示50度
{
if(temp > TabTEMP[gbl])break;
gbl++;
}
i = TabTEMP[gbl-1] -TabTEMP[gbl];
TEMP_L = (uchar)(i/(temp - TabTEMP[gbl]));
gbl--;
gbl+=1;
TEMPR_Value = gbl; //温度值
//
ADC_Channel(HUMR_AN);
temp = ADC_Convert(); //
gbl /= 5;
for(loc = 1;loc < 15;)
{
i = TabTH[gbl][loc];
if(temp > i)loc++;
else break;
j = i;
}
loc--;
temp = temp-j;
j = i-j;
j /= 5;
gbl = 20 + loc * 5; //湿度值
gbl += (uchar)(temp / j);
HUMR_Value = gbl;
}
//////////////////////////////////////////////////////
|