#define ADC_Verf (2.0f)
void ADC_Init(void)
{
/* RC0 配置为 模拟输入 */
SET_BIT(TRISA, 0);
SET_BIT(ANSEL0, 0);
/*********** ADCON0 ****************************
Bit7~Bit6 ADCS<1:0>: AD转换时钟选择位。
00= FSYS/8
01= FSYS/16
10= FSYS/32
11= F RC (内部振荡器32KHz的时钟)
Bit5~Bit2 CHS<3:0>: 模拟通道选择位。与ADCON1寄存器CHS4组合CHS<3:0>
00000= AN0
00001= AN1
00010= AN2
00011= AN3
…… ……
01101= AN13
01110= OPA0/OPA1输出
01111= 0.6V固定参考电压
10000= AN16
10001= AN17
10010= AN18
10011= AN19
其他= 保留
Bit1 GO/DONE: AD转换状态位。
1= AD转换正在进行。将该位置1启动AD转换。当AD转换完成以后,该位由硬件自动清零。
当GO/DONE位从1变0或ADIF从0变1时,需至少等待两个TAD时间,才能再次启动AD转换。
0= AD转换完成/或不在进行中。
Bit0 ADON: ADC使能位。
1= 使能ADC;
0= 禁止ADC,不消耗工作电流。
*********************************************/
// ADCON0 = 0X00; // A0,AD采样时间选为FSYS/8
/*********** ADCON1 ****************************
Bit7 ADFM: AD转换结果格式选择位;
1= 右对齐;
0= 左对齐。
Bit6 CHS4 与ADCON0的CHS3~0组合使能
Bit5~Bit3 未用
Bit2 LDO_EN: 内部参考电压使能位。
1= 使能ADC内部LDO参考电压;
当选择内部LDO作参考电压时,ADC最大有效精度为8位。
0= VDD作为ADC参考电压。
Bit1~Bit0 LDO_SEL<1:0>: 参考电压选择位
00= 禁用(注:选择内部LDO作为参考电压时,禁止为00)
01= 2.0V
10= 2.4V
11= 3.0V
*********************************************/
ADCON1 = 0x05;
}
float GetGasValue(void)
{
float gas = 0.0f;
uint32_t timeout = 1000;
ADCON0 = 0X03; /* 打开通道A0 使能ADC并开启转换 */
while (GET_ADC_CONVER_DONE_FLAG() && timeout--) {
__delay_us(1);
}
if (timeout == 0)
return -1;
gas = (((uint16_t)ADRESH << 4) | (ADRESL >> 4)) * ADC_Verf / 4095;
CLEAR_BIT(ADCON0, 0); /* 关闭ADC */
return gas;
}
离线