原创 dsPIC33FJ12MC201的AD转换程序

2009-3-22 21:57 2065 8 7 分类: MCU/ 嵌入式

更多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条评论)

登录后参与讨论
我要评论
0
8
关闭 站长推荐上一条 /2 下一条