一、芯片框图
二、配置
/*
配置和使用ADC时,请执行以下操作
必须考虑以下职能:
* 端口配置
ANSELA = 0x00; // 全部数字
WPUA = 0b00000000; // RA3弱上拉OFF
* 频道选择
CHS<4:0>:模拟通道选择位
11111=FVR(固定电压基准)缓冲器1输出(3)
11110=DAC(数模转换器)(2)
1101=温度指示器(1)
00011=AN3;//00010=AN2;//00001=AN1//00000=AN0
ADCON0bits.CHS = 0;
* ADC参考电压选择
ADPREF<1:0>:ADC正电压参考配置位
11=VRPOS连接到内部固定电压基准(FVR)
10=VRPOS连接到外部VREF+引脚(1)
01=保留
00=VRPOS已连接到VDD
ADCON1bits.ADPREF = 0;
* ADC转换时钟源
ADC<2:0>:ADC转换时钟选择位111=FRC(由内部RC振荡器提供的时钟)110=FOSC/64;101=FOSC/16;100=FOSC/4;011=FRC(由内部RC振荡器提供的时钟)
010=FOSC/32;001=FOSC/8;000=FOSC/2
ADCON1bits.ADCS = 6 ;
* 中断控制
TRIGSEL<3:0>:自动转换触发器选择位(1) //0000=未选择自动转换触发器 //其它见数据手册
ADCON2bits.TRIGSEL = 0;
* 结果格式
ADFM:ADC结果格式选择位/1=右对齐。ADRESH的六个最高有效位设置为“0”加载。/0=左对齐,ADRESL的六个最低有效位设置为“0”加载。
ADCON1bits.ADFM = 1 ;
* 启用位
ADON:ADC启用位
1=ADC已启用
0=ADC被禁用且不消耗工作电流
ADCON0bits.ADON = 0; //不启用.
*/
三、示例代码
//ADC初始化
void ADC_init(void)
{
ADCON1bits.ADPREF = 0; //ADC参考电压选择VDD
ADCON1bits.ADCS = 6 ; //ADC转换时钟源 选择110=FOSC/64;
ADCON2bits.TRIGSEL = 0; //触发方式:0000=未选择自动转换触发器
ADCON1bits.ADFM = 1 ; //结果格式:1=右对齐。ADRESH的六个最高有效位设置为“0”加载。
}
//读取通道
unsigned short int Get_ADCVal(unsigned char ch)
{
unsigned short int val ;
ADCON0bits.ADON = 1; //启用AD
if(ch>0b11111) ch = 0b11111;
ADCON0bits.CHS = ch; //选择通道
for(val = 300;val!=0;val--) NOP(); //延时
// __delay_ms(2);
GO = 1;//开始转换
while(GO); //等待转换结束
val = ADRES; //获取转换值
ADCON0bits.ADON = 0; //停用AD
return val; //返回转换值
}
以上代码经过实测。