ADC读数一直在dspic33FJ128MC802上跳转,无法获得稳定的读数,mplab8.92,xc16编译器

时间:2014-12-17 23:22:41

标签: microchip mplab adc xc16

晚上好,

我正在尝试在dspic33FJ128MC802上实现一个简单的1通道ADC读取器,它手动开始采样数据,在采样完成后自动转换,并读取和存储数据。

这对我来说从来都不是问题,除了这个微控制器似乎没有实现正常的ADC,

我已多次阅读ADC上的数据表部分,并且我已将其配置为我的最佳能力,但是当我直接连接实验室电源时,ADC1BUF0值在0到4096之间不断跳跃。到ADC的输入引脚。

我看到的是ADC1BUF0值似乎大致对应于输入电压(0-3.3V),当我暂停调试器时,它给出了几个(2-4)读数,范围在+ -100范围内(out 4096也不错)。 然后,如果我继续运行并暂停,电压保持不变,缓冲区中存储的值突然开始跳跃+ - 500,有时甚至显示4095(全1)和0。

然后,当我将实验室PSU更改为不同的电压时,它似乎重复向我显示一些正确值的过程,然后再开始跳转。

基本上,它会在我暂停调试器的大约1/2次时显示正确的值。

我不知道造成这种情况的原因,我知道我需要在更改电压后运行调试器以便清除缓冲区,但是这个微控制器似乎肯定是错误的。

请让我知道可以采取哪些措施来解决这个问题,

编译器是XC16,IDE是Mplab 8.92

谢谢,

以下是我的配置:

[代码]

void InitADC() {
    TRISAbits.TRISA0=1; 

    AD1CON1bits.FORM = 0; // Data Output Format: integer//Signed Fraction (Q15 format)
    AD1CON1bits.SSRC = 7; // Interan Counter (SAMC) ends sampling and starts convertion
    AD1CON1bits.ASAM = 0; // ADC Sample Control: Sampling begins immediately after conversion
    AD1CON1bits.AD12B = 1; // 12-bit ADC operation
    AD1CON1bits.SIMSAM =1; // 10-bit ADC operation
    AD1CON2bits.CHPS = 0; // Converts CH0
    AD1CON2bits.CSCNA = 0; // Do not scan inputs
    AD1CON2bits.VCFG = 0; // Use voltage reference Vss/Vdd
    AD1CON2bits.ALTS = 0; // Always use input select for channel A
    AD1CON2bits.BUFM = 0; // Always start filling at buffer 0
    AD1CON3bits.ADRC = 0; // ADC Clock is derived from Systems Clock
    AD1CON3bits.SAMC = 0; // Auto Sample Time = 0*Tad
    AD1CON3bits.ADCS = 2; // ADC Conversion Clock Tad=Tcy*(ADCS+1)= (1/40M)*3 = 75ns (13.3Mhz)

    // ADC Conversion Time for 10-bit Tc=12*Tab = 900ns (1.1MHz)
    AD1CON1bits.ADDMABM = 1; // DMA buffers are built in conversion order mode
    AD1CON2bits.SMPI = 0; // SMPI must be 0

    AD1CON4bits.DMABL = 0; // Only 1 DMA buffer for each analog input

    //AD1CHS0/AD1CHS123: A/D Input Select Register
    AD1CHS0bits.CH0SA = 0; // MUXA +ve input selection (AIN0) for CH0
    AD1CHS0bits.CH0NA = 0; // MUXA -ve input selection (Vref-) for CH0
    AD1CHS123bits.CH123SA = 0; // MUXA +ve input selection (AIN0) for CH1
    AD1CHS123bits.CH123NA = 0; // MUXA -ve input selection (Vref-) for CH1
    IFS0bits.AD1IF = 0; // Clear the A/D interrupt flag bit
    IEC0bits.AD1IE = 0; // Do Not Enable A/D interrupt

    AD1CSSL = 1; //Scan from AN0 only
    AD1PCFGL = 0b111111110; //Only AN0 in analog input mode

    AD1CON1bits.ADON = 1; // Turn on the A/D converter
}

int main() {
    ADPCFG = 0xFFFE; //make ADC pins all digital except AN0 (RA0)
    while(1)
    {
       AD1CON1bits.SAMP = 1; 
       while(!AD1CON1bits.DONE);
       myVoltage = ADC1BUF0;
    }
    return 0;
}

[/代码]

1 个答案:

答案 0 :(得分:1)

看起来像我错过了分号(!AD1CON1bits.DONE)

没有分号,它不会等待转换完成。

我在原帖中对此进行了更正,以防有人想在此帖中使用来源

谢谢,