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

PIC32 прерывания АЦП

Контроллер PIC32MX795F512L, дописываю проект. Пытаюсь запустить АЦП на прерываниях, 16 каналов (auto sampling), прерывания на каждый 16 результат (когда готовы результаты всех каналов). Частота CPU 80 МГЦ, PCLK делитель на 8 (10 МГц). Хочу получать частоту дискретизации 500 Гц для каждого канала (8 кГц для всего ацп).
В обработчике прерывания ацп сбрасываю флаг прерывания, дергаю ногой вверх и вниз, которую смотрю осциллографом. По итогу получаю частоту прерываний 734 кГц, что выглядит странно. Пытался менять ADCS и SAMC регистры- частоты эта не меняется. Текущие настройки (в отладчике проверял- так и есть):
    AD1CON1 = 0xe4;
    AD1CON2 = 0x243c;
    AD1CON3 = 0xc18;    
Пробовал накидать проект (вся программа: в обработчике прерывания ацп ногой дергаю) на Harmony3 (тут версия xc32 другая, пробовал даже на другом экземпляре контроллера)- та же проблема.
В какую сторону смотреть?

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


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

1 hour ago, cybersonner said:

В какую сторону смотреть?

Вы запускаете преобразование в режиме автосемплирования, то есть по завершении предыдущего. Этот способ для фиксированной и точно выбранной частоты никуда не годится. В этом контроллере для такой цели заточен TMR3. Ну или внешним источником частоты дискретизации через INT0.

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


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

Таймеры заняты в проекте.  Проблема не в том, что частоты неточная, а в том, что она даже близко не та, которая задумана.  Даже в теории 734 кГц получиться никак не должно.

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


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

3 hours ago, cybersonner said:

Даже в теории 734 кГц получиться никак не должно.

По моим расчетам должно получится примерно 2,778 кГц.

Tad у вас в 50 раз больше системного периода - 80/50=1,6 МГц.

Преобразование с учетом окна захвата - 36*Tad (12 - преобразование и 24 - захват). Ну и 16 преобразований на одно прерывание.

Из чего следует, что скорее всего, флаг вы не сбрасываете. Включите дебаг и поставьте брекпойнт в обработчике.

ЗЫ. Я полагаю вы в курсе, что есть ЧЕТЫРЕ регистра флагов одного домена:  IFS1, IFS1CLR, IFS1SET и IFS1INV.

То есть для сброса нужно писать ЕДИНИЦУ в соответствующий бит регистра IFS1CLR.

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


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

Спасибо, очень похоже на то, что флаг не сбрасывается.  Весь обработчик прерывания (уж проще сложно придумать):

    TEST_Set();
    IFS1CLR = _IFS1_AD1IF_MASK;
    TEST_Clear();

Завтра в железе проверю отладчиком, сбрасывается ли флаг.

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


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

Цитата

Note: Some PIC32 devices feature persistent interrupts. On such devices, clearing the AD1IF flag bit will not have any effect unless ADC1BUFx register is read. Refer to the specific device data sheet and Section 8. "Interrupts" (DS61108) for more information

В общем пока результаты не прочитаю- флаг не сбросится.

Итого:

void ADC_InterruptHandler(void)
{
    static uint16_t temp[16];
    uint8_t i;
    
    for(i=0; i<16; i++)
        temp[16]=ADC_ResultGet(i);
    
    TEST_Set();
    IFS1CLR = _IFS1_AD1IF_MASK;
    TEST_Clear();
    
    if (ADC_CallbackObj.callback_fn != NULL)
    {
        ADC_CallbackObj.callback_fn(ADC_CallbackObj.context);
    }
}

 

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


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

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

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

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

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

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

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

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

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

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