Чтение АЦП постоянно прыгает на dspic33FJ128MC802, не может получить стабильное чтение, компилятор mplab8.92, xc16

Добрый вечер,

Я пытаюсь реализовать простой 1-канальный считыватель АЦП на dspic33FJ128MC802, который вручную запускает выборку данных, автоматически преобразует ее после завершения выборки, а также считывает и сохраняет данные.

Для меня это никогда не было проблемой, за исключением этого микроконтроллера, в котором, похоже, не реализован нормальный АЦП.

Я несколько раз прочитал раздел таблицы данных по АЦП и настроил его наилучшим образом, однако значение ADC1BUF0 продолжает непоследовательно прыгать между 0 и 4096, когда у меня есть лабораторный источник питания, подключенный непосредственно к входу. выводы АЦП.

Что я вижу, так это то, что значение ADC1BUF0 примерно соответствует входному напряжению (0-3,3 В), когда я приостанавливаю отладчик, он дает пару (2-4) показаний, которые находятся в диапазоне +-100 (из 4096). неплохо). Затем, если я продолжаю работать и останавливаться при неизменном напряжении, значения, хранящиеся в буфере, внезапно начинают прыгать +- 500, иногда даже показывая 4095 (все 1) и 0.

Затем, когда я меняю лабораторный блок питания на другое напряжение, он, похоже, повторяет процесс показа мне нескольких правильных значений, а затем снова начинает прыгать.

По сути, он покажет мне правильное значение примерно в 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;
}

[/код]


person Mich    schedule 17.12.2014    source источник


Ответы (1)


Кажется, я пропустил точку с запятой через некоторое время (!AD1CON1bits.DONE)

Без точки с запятой он не ждал завершения преобразования.

Я исправил это в исходном сообщении, на случай, если кто-то захочет использовать источник в этом сообщении.

Спасибо,

person Mich    schedule 18.12.2014