项目场景:
XH5016A,配置ADC
问题描述
按下面代码初始化和获取ADC值,发现串口输出的值不变,恒为511
void adc_hardware_init(void)
{
// ADCON = AST(0) | ADIE(0) | HTME(7) | ADCALE(1) | VSEL(ADC_REF_INNER); //设置ADC参考电压为内部1.5V
ADCON = AST(0) | ADIE(0) | HTME(7) | VSEL(ADC_REF_VDD); //设置ADC参考电压为VDD
ADCFGL =ACKD(7) |ADCHS(0); //设置ADC时钟分频通道,通道关闭
P10F = P10_ADC0_SETTING; //设置P10为ADC引脚功能
}
static unsigned short Get_AdcValue(unsigned char channel)
{
unsigned short AD_Value;
ADCFGL = ADCHS(channel); //选择ADC通道
ADCON |= AST(1); //启动ADC转换
while(!(ADCON & ADIF)); //等待ADC转换完成
ADCON |= ADIF; //清除ADC中断标志
AD_Value = ADCDH*256 + ADCDL; //读取AD值
AD_Value >>= 6;
//读取AD值:考虑到ADC本身存在误差,因此每次采样仅取高10位
return AD_Value;
}
解决方案:
初始化的时候选好通道而不是关闭,在Get_AdcValue()
里不再选择ADC通道,改完之后如下
void adc_hardware_init(void)
{
ADCON = AST(0) | ADIE(0) | HTME(7) | VSEL(ADC_REF_VDD); //设置ADC参考电压为VDD
ADCFGL =ACKD(7) |ADCHS(ADC_CH0); //设置ADC时钟分频通道,选择通道
P10F = P10_ADC0_SETTING; //设置P10为ADC引脚功能
}
static unsigned short Get_AdcValue(void)
{
unsigned short AD_Value;
ADCON |= AST(1); //启动ADC转换
while(!(ADCON & ADIF)); //等待ADC转换完成
ADCON |= ADIF; //清除ADC中断标志
AD_Value = ADCDH*256 + ADCDL; //读取AD值
AD_Value >>= 6;
//读取AD值:考虑到ADC本身存在误差,因此每次采样仅取高10位
return AD_Value;
}
ADC值正常。
代码是从其他芯片移植过来的,ADC配置部分可能有所差异,猜想原芯片可能支持多路ADC而该芯片不支持。