记录一下10

项目场景:

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而该芯片不支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值