У меня дилемма.
Мне нужно прочитать значения АЦП с 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();
}
Проблема в следующем:
Как исправить эти проблемы? Кроме того, правильная ли конфигурация моего АЦП (учитывая, что АЦП требует тактового сигнала для преобразования АЦП) с моими внутренними тактовыми генераторами? Правильно ли установить тактовый сигнал на 32 МГц.
Я программирую с помощью PicKit2 (с черной кнопкой).
Вы не устанавливаете тактовый сигнал АЦП на 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, мкс > 0,7 мкс.
Fosc
(в данном случае 32 МГц)? У меня тоже есть ConvertADC()
, это опечатка. Извини.
ПетПаульсен
Бухаке Синди
WDT
наOFF
иLVP
наOFF
. Мои включает18f4520.h
, а такжеadc.h
.