关于ADC度数波动的问题,如何解决?

问题遇到的现象和发生背景

我用辉芒微的示例代码写了一个通过电压调节灯亮灭的代码,但出来的效果却是不管我调多小的电压,但判定的还是只有两个

用代码块功能插入代码,请勿粘贴截图

//ADC初始化
void ADC_INITIAL (void)
{
ADCON1 = 0B01100000;
//Bit7: 0 = Sysclk
//Bit[6:4]: 110 = Sysclk/64

//DIVS=0,时钟选FOSC
//ADCS[2:0]=110,分频FOSC/64

ADCON0 = 0B11010101;
//Bit7:        ADFM=1,结果右对齐                     
//Bit[6:5]: VCFG参考电压
//            00-参考电压VDD
//            01-参考电压内部2V
//            10-参考电压内部3V
//            11-参考电压Vref
//Bit[4:2]:    CHS=101-选择AN5通道
//Bit1:        GO,AD转换状态位
//Bit0:        ADON=1,ADC使能
ANSEL = 0B00100000;               //使能AN5为模拟输入    

}

  • 函数名: GET_ADC_DATA
  • 功能: 读取通道ADC值
  • 输入: AN_CN 通道序号
  • 输出: INT类型AD值(单次采样无滤波)

unint GET_ADC_DATA (unchar AN_CH)
{
unchar i;
unchar ADCON0Buff;
unint tBuffer = 0;
unint ADC_DATA=0;

ADCON0Buff = ADCON0 & 0B11100011;//清空通道值

AN_CH <<=2;              
ADCON0Buff |=  AN_CH;           //Bit[4:2]:CHS=101,选择AN5通道      

ADCON0 = ADCON0Buff;             //重新加载通道值
DelayUs(20); 
GO_DONE = 1;                     //启动ADC 
while( GO_DONE==1 );            //等待ADC转换完成

ADC_DATA =  ADRESH;
ADC_DATA <<=8;
ADC_DATA |= ADRESL;              //10Bit ADC值整合
tBuffer =  ADC_DATA;
return  tBuffer;

}

VB1_value=get_mean_1(); //通道5 AD值
VB1_V=((float)VB1_value/1023.0)*3.0;
VB1_V=VB1_V/(0.4); //分压电路

下面的是根据ADC获取并转换的值对灯的控制,但效果只有前面三个
LED_state()是灯亮灭的函数,测试过没有问题

if(VB1_V>4.16)//6
{
LED_state(6);
}

if(VB1_V<=4.16 && VB1_V>3.82)//6
{
LED_state(6);
}

if(VB1_V<=3.82 && VB1_V>3.63)//7
{
LED_state(7);
}

if(VB1_V<=3.63 && VB1_V>3.53)//8
{
LED_state(8);
}

if(VB1_V<=3.53 && VB1_V>3.43)//9
{
LED_state(9);
}

if(VB1_V<=3.43 && VB1_V>3.18)//低压提醒 10
{
LED_state(10);
}

我的解答思路和尝试过的方法

测了几次应该是ADC获取的数值波动很大的问题,但我不知道要怎么解决

ADC的话,和硬件相关的,你的电路是怎么设计的?

这个和硬件本身相关,因为当你使用ADC通道时,其本身就会有值(由于供电所产生的电压不稳定所造成的还有系统本身所造成的),这个你只能在一定的波动范围内求取平均值,这是我的建议