dsPIC33FJ128GP206的ADC配置

2020-02-09 09:34发布

/************************************************************/
/* 振荡器配置 */
/************************************************************/
#define        Frc                7970000                //内部 RC 时钟频率(Hz)
#define        Fin                9830400                //外部输入时钟频率(Hz)
#define        N1                2        //PLL 预分频
#define        M                32        //PLL 倍频
#define N2                2        //PLL 后分频
#define FOSC         FIN * (M / (N1 * N2))        //系统时钟频率
#define FCY         FOSC / 2                                //指令时钟频率
#define TOSC         1 / FOSC        //系统时钟周期
#define TCY           TOSC*2                //指令时钟周期


        AD1CON1bits.ADON         = 0;                //关闭ADC1

        AD1PCFGLbits.PCFG14 = 0;                //AN14作为模拟输入脚
       
        AD1CON2bits.VCFG         = 0b011;                  //参考电压源 外部VREF+ 外部VREF-
       
        AD1CON3bits.ADRC         = 0;                //时钟由系统时钟产生
        AD1CON3bits.ADCS        = 5;                //ADC 转换时钟选择位 TAD = TCY*(ADCS+1)       
       
        AD1CON2bits.CHPS         = 0;                //选择通道使用的位 转换CH0
       
        AD1CON1bits.AD12B         = 1;                //12位1 通道ADC 工作
        AD1CON3bits.SAMC         = 1;                //自动采样时间位 1 TAD
       
        AD1CON1bits.FORM         = 0b01;                //有符号整数(DOUT = ssss sddd dddd dddd,其中s = d<11> 取反)

        AD1CON1bits.SSRC         = 0b111;        //由内部计数器结束采样并启动转换(自动转换)
        AD1CON1bits.ASAM        = 1;                //最后一次转换结束后立即开始采样。SAMP 位自动置1。


        AD1CON1bits.ADDMABM = 1;                //DMA缓冲器以转换的顺序写入。模块将为DMA 通道提供一个与非DMA 独立缓冲器使用的地址相同的地址。
        AD1CON2bits.SMPI        = 0;        //每完成1 个采样/ 转换操作将DMA 地址递增1 或产生中断
        AD1CON4bits.DMABL         = 0b111;        //给每路模拟输入分配128 字的缓冲区

        IFS0bits.AD1IF = 0;         //清除中断标志
        IEC0bits.AD1IE = 1;         //禁止中断
        AD1CON1bits.ADON = 1;         //打开ADC1

以上是测试过程中的配置代码,我需要一个8k的采样速率,我认为应该是做如下配置,但实际仿真测试只能在上面情况下才有采样值。
        AD1CON3bits.ADRC         = 1;                //时钟由ADC内部RC时钟产生
        AD1CON3bits.ADCS        = 49;                //ADC 转换时钟选择位 TAD = TCY*(ADCS+1)        (取值范围:0-63)
        AD1CON3bits.SAMC         = 20;                //自动采样时间位 1 TAD  (取值范围:0-31)
我用的是ICD2仿真器。
请高手指教~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
n104391455
2020-02-10 08:02
本人也是刚学到这个,根据你的源程序说下自己的看法。
假如的你的外部晶振是10MHz。   根据你的设置倍频后  PLL输出应该为 10M*32/(2*2)=80MHz
Tcy=80M/2=40M
Tad=(1/40M)*6   根据你的程序  ADCS=5
ADC转换需要  12个 Tad      
采样时间为   SAMC一个Tad
总共的时间  (12+1)Tad=? 这里倒数一下就是采样频率了吧

根据上图是这样吧。你外部晶振多少没讲好像。

一周热门 更多>