Преобразование АЦП PIC18F4520 в MC18

У меня дилемма.

Мне нужно прочитать значения АЦП с PIC18F4520 . Моя конфигурация и код выглядят следующим образом:

#define OSC INTIO67
int adc_result = 0;

void main(void)
{
    OSSCON = 0x70; //Set it as 8Mhz.
    OSCTUNEbits.PLLEN = 1; //Enable PLL 4x multiplier, thus we have 32 Mhz internal clock.

    //Set PORTA direction ports as input
    TRISA = 0xFF;

    OpenADC( ADC_FOSC_32      &
         ADC_RIGHT_JUST   &
         ADC_4_TAD,
         ADC_CH0          &
         ADC_REF_VDD_VSS  &
         ADC_INT_OFF, ADC_5ANA);

    while (1) {
        SetChanADC(ADC_CH0);
        ConvertADC();
        while (BusyADC());
        adc_result = ReadADC();
    }
    CloseADC();
}

Проблема в следующем:

  1. Когда я запускаю его в MPLAB v8.x, мое чтение немного сбивается, и моя отладка прекращается.
  2. Я не могу снова отлаживать PIC, так как получаю сообщения об ошибках типа «Не удается войти в режим отладки».

Как исправить эти проблемы? Кроме того, правильная ли конфигурация моего АЦП (учитывая, что АЦП требует тактового сигнала для преобразования АЦП) с моими внутренними тактовыми генераторами? Правильно ли установить тактовый сигнал на 32 МГц.

Я программирую с помощью PicKit2 (с черной кнопкой).

Просто чтобы уточнить: вы отлаживаете реальное устройство или имитируете его? Включаете ли вы правильный заголовок для устройства (в вашем коде нет включений)?
Я отлаживаю реальное устройство. Я установил только WDTна OFFи LVPна OFF. Мои включает 18f4520.h, а также adc.h.

Ответы (1)

Вы не устанавливаете тактовый сигнал АЦП на 32 МГц. Параметр ADC_FOSC_32делит часы на 32 (см. стр. 225 даташита ) . Это гарантирует, вместе с битами выбора времени сбора данных ( ADC_4_TADв вашем случае), минимальное (/ максимальное) время сбора данных A/D (см. стр. 359). Когда вы нарушаете эти требования, вы не получите действительных/точных результатов.

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

Некоторые другие моменты:

  • В вашем коде вы никогда не запускаете преобразование АЦП, вызывая ConvertADC.
  • Вы настраиваете порт aкак выходной параметр TRISA = 0x0;, но хотите, чтобы он был настроен как входной (как говорится в вашем комментарии). TRISA = 0xFF;настроил бы все контакты на порту a как вход.


Чтобы немного расширить время приобретения ( Т А Д ): Это время необходимо для возможной зарядки внутренней схемы. Когда это время слишком короткое, вы не получите никаких/плохих результатов.

Для 32 МГц (без делителя) Т А Д будет 31 нс. Это слишком быстро. Вероятно, для работы АЦП требуется не менее 0,7 мкс. Таким образом, вы выбираете правильный делитель, чтобы получить Т А Д выше 0,7 мкс. Здесь подойдет делитель 32, Т А Д "=" 1 мкс > 0,7 мкс.

Спасибо, а как мне установить тактовый сигнал АЦП Fosc(в данном случае 32 МГц)? У меня тоже есть ConvertADC(), это опечатка. Извини.
Опять же: вы должны убедиться, что время получения ( Т А Д ) встречается. На странице 359 вы увидите минимальную Т А Д составляет 0,7 мкс. Таким образом, для более высокой частоты генератора вы должны выбрать больший делитель. Таблица 19-1 даст вам общее представление. Я бы порекомендовал вам прочитать техническое описание , хотя бы раздел 19, АЦП.