HC89S105K8芯片 AD读取波动太大
本帖最后由 芯圣电子官方QQ 于 2023-7-24 15:59 编辑第一次使用芯圣芯片,现在在读取AD值的时候遇到了问题,使用内部参考电压3V,芯片VDD供电4V,使用ADCR寄存器读取出来的AD值根本没法看,跳动非常大,总几百到几万的跳动;使用ADCRH和ADCRL寄存器读取的AD值就只有个位跳动,但是读取出的AD值偏大了好多。不清楚是什么原因?我将我这边的程序贴出来,大家帮我分析一下:
void adc_init(void)
{
P0M0 = P0M0&0xF0|0x03; //P00设置为模拟输入 CH4
P0M0 = P0M0&0x0F|0x30; //P01设置为模拟输入 T
P0M2 = P0M2&0x0F|0x30; //P05设置为模拟输入 VOL
//////
ADCC0 |= 0x80; //打开ADC转换电源
delay_2us(10); //延时20us,确保ADC系统稳定
//ADCC1 = AD_SEL_CH4; //选择ADC通道16
// ADCC1 = AD_SEL_VOL; //选择ADC通道21
ADCC1 = (ADCC1&(~0x1F))|AD_SEL_VOL;
//ADCC2 = 0x13; //转换结果12位数据,高8位置于ADCRH寄存器,ADC时钟8分频
ADCC2 = 0x0B; //转换结果12位数据,高8位置于ADCRH寄存器,ADC时钟8分频
ADCC0 &=0xFB; //选择内部Vref
ADCC0 |=0x02; //ADC参考电压:内部3V
ADCC0 &=~ 0x20; //清除ADC中断标志位
ADCC0 |= 0x40; //启动ADC转换
}
主程序中读取AD值,如下:
ADCC0 |= 0x40; //启动ADC转换
while(!(ADCC0&0x20)); //等待ADC转换结束
ADCC0 &=~ 0x20; //清除标志位
//adcResult2=ADCR;
adcResult2=ADCRH;
adcResult2=adcResult2<<4;
adcResult2+=(ADCRL&0x0F);
// adcSum=adcSum+adcResult;
// adcResult=get_adc_value();
// adcResult=(300.0*adcResult)/4096; // 放大100倍.
// //vddVoltage = (uint16_t)(adcResult+adcResult);
// vddVoltage = (uint16_t)adcResult;
LedBuf=adcResult2/1000;
LedBuf=adcResult2%1000/10;
LedBuf=adcResult2%100/10;
LedBuf=adcResult2%10; 几万的跳动?你这个太不正常了。 改改ADCC2中ADCTS的值看看 是多路数据转换吗? AD读取波动太大跟参考电压有关系。 推荐使用数字滤波 信号之间有干扰的。 这个波动有规律吗? 你这个波动也太大了吧,哪里没对。 用的什么基准啊 数字滤波就是软件滤波吧 降低采样频率 被采样信号是什么样的呢 采样率够不够啊 实际信号波动大吗 读取AD值的,需要注意硬件 先查看硬件是不是故障 AD读取波动有很多问题。 使用数字滤波吧 这个是参考电压的问题吗
页:
[1]
2