更多dsPIC技术资料,可到http://www.714e.com/论坛的Microchip栏目查找。
AD设置成12位模式,采样时间计算是MCU跑80MHz的内部RC,详细的注释
//-------------------------- A/D 初始化------------------------------------------------------------------
void InitADC(void)
{
// AD1PCFGL = 0xfff7; //AN3 模拟模式,采样引脚电压
AD1PCFGL = 0xfff2; //AN0/AN2/AN3 模拟模式,采样引脚电压
// AD1CON1 = 0x04e0;
AD1CON1bits.ADON = 0; //关闭ADC模块
AD1CON1bits.ADSIDL = 0; //在空闲模式下模块继续工作
AD1CON1bits.FORM = 0; //整数输出
AD1CON1bits.AD12B = 1; //12位1 通道ADC 工作
// PORTBbits.RB12 = AD1CON1bits.AD12B; //AD12B位测试输出
AD1CON1bits.SSRC = 7; //由内部计数器结束采样并启动转换(自动转换)
AD1CON1bits.SIMSAM = 1; //AD12B = 1 未用
AD1CON1bits.ASAM = 0; //最后一次转换结束后立即开始采样。SAMP 位自动置1。
AD1CON1bits.SAMP = 0; //ADC采样/ 保持放大器保持采样结果 ASAM = 0,由软件写入1 开始采样。
// AD1CON1bits.DONE = 0; //ADC转换尚未开始
// AD1CON2 = 0x2000;
// AD1CON2bits.VCFG = 1; //ADREF+ = 外部VREF+ ADREF- = AVSS
AD1CON2bits.VCFG = 3; //ADREF+ = 外部VREF+ ADREF- = 外部VREF-
AD1CON2bits.CSCNA = 0; //不扫描使用采样多路开关A 时扫描CH0+ 输入
// AD1CON2bits.CHPS = 0; //AD12B = 1 未用
AD1CON2bits.BUFS = 0; //BUFM = 0 无效,ADC当前在填充缓冲器的前半部分,用户应用程序应访问后半部分中的数据
AD1CON2bits.SMPI = 0; //每完成1 个采样/ 转换序列时产生中断
// AD1CON2bits.SMPI = 0x0a;//每完成10 个采样/ 转换序列时产生中断
AD1CON2bits.BUFM = 0; //总是从前半部分开始填充缓冲器
AD1CON2bits.ALTS = 0; //总是使用采样多路开关A 选择的输入通道
// AD1CON3 = 0x050f; //采样5Tad,Tad=16*25=400nS
AD1CON3bits.ADCS =15; //ADC 转换时钟 Tcy·(ADCS<7:0>+1)=Tad 400nS
// AD1CON3bits.ADCS =63;
AD1CON3bits.SAMC =5; //采样时间5Tad
AD1CON3bits.ADRC = 0; //时钟由系统时钟产生
// AD1CSSL = 0x000F;
AD1CSSLbits.CSS3 = 1; //输入扫描AN3
AD1CSSLbits.CSS2 = 0;
AD1CSSLbits.CSS1 = 0;
AD1CSSLbits.CSS0 = 0;
// AD1CHS123 = 0x0000; //当AD12B = 1 未用
AD1CHS123bits.CH123NB = 3;
AD1CHS123bits.CH123SB = 1;
AD1CHS123bits.CH123NA = 3;
AD1CHS123bits.CH123SA = 1;
// AD1CHS0 = 0x0303;
// AD1CHS0bits.CH0NB = 0; //采样多路开关B 的通道0 的反相输入为VREF- ALTS = 0 总是使用采样多路开关A 选择的输入通道
// AD1CHS0bits.CH0SB = 3; //采样多路开关B 的通道0 的同相输入为AN3 ALTS = 0 总是使用采样多路开关A 选择的输入通道
// AD1CHS0bits.CH0NA = 0; //采样多路开关A 的通道0 的反相输入为VREF- ALTS = 0 总是使用采样多路开关A 选择的输入通道
// AD1CHS0bits.CH0SA = 3; //采样多路开关A 的通道0 的同相输入为AN3 ALTS = 0 总是使用采样多路开关A 选择的输入通道
AD1CON1bits.ADON = 1; //启动ADC模块
IEC0bits.AD1IE = 1; //AD中断启动
AD1CHS0bits.CH0SA = 3; //0~3分别表示选中4个通道之一
AD1CON1bits.SAMP = 1; //开始采样,采样结束后自动开始转换
}
中断读取示例
//-------------------------- A/D 中断读取示例------------------------------------------------------------------
void _ISR _ADC1Interrupt(void)
{
IFS0bits.AD1IF = 0;
Vad = ADCBUF0;
}
文章评论(0条评论)
登录后参与讨论