Перейти к содержанию
    

АЦП PIC32MX

Добрый день.

Имею PIC32MX150F128B и пытаюсь на нем запустить АЦП в режиме сканирования одного (пока одного) канала с автосэмплированием.

Частота периферии 24 МГц. Tad = 83 нс (д. б. > 63 нс по даташиту). Ts = 166 нс (д. б. > 132 нс по даташиту).

Мой код

#include <xc.h>
#include <sys/attribs.h>
#include "peripheral/peripheral.h"

void main()
{
    PLIB_INT_MultiVectorSelect(INT_ID_0);
    PLIB_INT_Enable(INT_ID_0);

    // Fin = 48 MHz, Fp = 24 MHz
    PLIB_DEVCON_SystemUnlock(DEVCON_ID_0);
    PLIB_OSC_SysPLLMultiplierSelect(OSC_ID_0, 24);
    PLIB_OSC_SysPLLOutputDivisorSet(OSC_ID_0, OSC_SYSPLL_OUT_DIV_2);
    PLIB_OSC_PBClockDivisorSet(OSC_ID_0, OSC_PERIPHERAL_BUS_1, 2);
    PLIB_DEVCON_SystemLock(DEVCON_ID_0);

    // Порт на вход, аналоговый режим
    PLIB_PORTS_DirectionInputSet(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_1);
    PLIB_PORTS_PinModePerPortSelect(PORTS_ID_0, PORT_CHANNEL_B, PORTS_BIT_POS_1, PORTS_PIN_MODE_ANALOG);

    // Вкл АЦП, автоматическое по 1 сэмплу на прерывание, сканирование 1 канала
    PLIB_ADC_Enable(ADC_ID_1);
    AD1CON3bits.ADCS = 0; // Tad = Tpb * 2 = 83 ns (> 65 ns)
    AD1CON3bits.SAMC = 2; // Ts = Tad * 2 = 166 ns (> 132 ns)
    PLIB_ADC_InputScanMaskAdd(ADC_ID_1, ADC_INPUT_SCAN_AN11);
    PLIB_ADC_ConversionStopSequenceEnable(ADC_ID_1);
    PLIB_ADC_ConversionTriggerSourceSelect(ADC_ID_1, ADC_CONVERSION_TRIGGER_INTERNAL_COUNT);
    PLIB_ADC_SamplesPerInterruptSelect(ADC_ID_1, ADC_1SAMPLE_PER_INTERRUPT);
    PLIB_ADC_MuxAInputScanEnable(ADC_ID_1);

    // Прерывание приоритет 5 подприоритет 2
    PLIB_INT_VectorPrioritySet(INT_ID_0, INT_VECTOR_AD1, INT_PRIORITY_LEVEL5);
    PLIB_INT_VectorSubPrioritySet(INT_ID_0, INT_VECTOR_AD1, INT_SUBPRIORITY_LEVEL2);
    PLIB_INT_SourceEnable(INT_ID_0, INT_SOURCE_ADC_1);

    // Запуск
    PLIB_ADC_SampleAutoStartEnable(ADC_ID_1);

    while(1);
}

void __ISR(_ADC_VECTOR , IPL5SOFT) ADCInterruptServiceRoutine()
{
    // Пустое чтение
    PLIB_ADC_ResultGetByIndex(ADC_ID_1, 0);
    Nop();
    PLIB_INT_SourceFlagClear(INT_ID_0, INT_SOURCE_ADC_1);

    // Перезапуск
    PLIB_ADC_SampleAutoStartEnable(ADC_ID_1);
}

Проблема в следующем: когда код запущен в режиме отладки и я выставляю брейкпоинт на Nop(); в прерывании, а затем смотрю в регистр ADC1BUF0, то вижу значение, например, 14 (на ножке действительно есть какое-то напряжение). А когда по F5 запускаю программу от брейкпоинта до брейкпоинта, то получаю совсем другое значение 635. И обратно: стоит убрать брейкпоинт и запустить программу, а затем опять поставить, опять получаю 14.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...