0

こんばんは、

dspic33FJ128MC802 に単純な 1 チャネル ADC リーダーを実装しようとしています。これは、データのサンプリングを手動で開始し、サンプリングが完了すると自動的に変換し、データを読み取って保存します。

これは、通常の ADC が実装されていないように見えるこのマイクロコントローラーを除いて、私にとっては決して問題ではありませんでした。

ADC のデータシート セクションを何度か読み、できる限り構成しましたが、ラボの電源を入力に直接接続すると、ADC1BUF0 の値が 0 から 4096 の間で一貫性がなくなります。 ADCのピン。

私が見ているのは、ADC1BUF0 の値が入力電圧 (0 ~ 3.3 V) にほぼ対応しているように見えることです。デバッガーを一時停止すると、範囲 +-100 (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;
}

[/コード]

4

1 に答える 1

1

しばらくしてセミコロンを逃したようです(!AD1CON1bits.DONE)

セミコロンがなければ、変換が完了するのを待ちませんでした。

誰かがこの投稿でソースを使用したい場合に備えて、元の投稿でこれを修正しました

ありがとうございました、

于 2014-12-18T00:22:45.620 に答える