我用辉芒微的示例代码写了一个通过电压调节灯亮灭的代码,但出来的效果却是不管我调多小的电压,但判定的还是只有两个
//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为模拟输入
}
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通道时,其本身就会有值(由于供电所产生的电压不稳定所造成的还有系统本身所造成的),这个你只能在一定的波动范围内求取平均值,这是我的建议