/************************************************************/
/* 振荡器配置 */
/************************************************************/
#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仿真器。
请高手指教~
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
ADC说明 (原文件名:未命名.jpg)
假如的你的外部晶振是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=? 这里倒数一下就是采样频率了吧
根据上图是这样吧。你外部晶振多少没讲好像。
一周热门 更多>