реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> АЦП PIC32MX, некорректное преобразование
theBMV
сообщение Sep 29 2015, 08:29
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 14-10-08
Из: г. Королев
Пользователь №: 40 940



Добрый день.
Имею 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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 13:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01354 секунд с 7
ELECTRONIX ©2004-2016