cybersonner 1 4 июня, 2022 Опубликовано 4 июня, 2022 · Жалоба Контроллер PIC32MX795F512L, дописываю проект. Пытаюсь запустить АЦП на прерываниях, 16 каналов (auto sampling), прерывания на каждый 16 результат (когда готовы результаты всех каналов). Частота CPU 80 МГЦ, PCLK делитель на 8 (10 МГц). Хочу получать частоту дискретизации 500 Гц для каждого канала (8 кГц для всего ацп). В обработчике прерывания ацп сбрасываю флаг прерывания, дергаю ногой вверх и вниз, которую смотрю осциллографом. По итогу получаю частоту прерываний 734 кГц, что выглядит странно. Пытался менять ADCS и SAMC регистры- частоты эта не меняется. Текущие настройки (в отладчике проверял- так и есть): AD1CON1 = 0xe4; AD1CON2 = 0x243c; AD1CON3 = 0xc18; Пробовал накидать проект (вся программа: в обработчике прерывания ацп ногой дергаю) на Harmony3 (тут версия xc32 другая, пробовал даже на другом экземпляре контроллера)- та же проблема. В какую сторону смотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
my504 2 4 июня, 2022 Опубликовано 4 июня, 2022 · Жалоба 1 hour ago, cybersonner said: В какую сторону смотреть? Вы запускаете преобразование в режиме автосемплирования, то есть по завершении предыдущего. Этот способ для фиксированной и точно выбранной частоты никуда не годится. В этом контроллере для такой цели заточен TMR3. Ну или внешним источником частоты дискретизации через INT0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cybersonner 1 4 июня, 2022 Опубликовано 4 июня, 2022 · Жалоба Таймеры заняты в проекте. Проблема не в том, что частоты неточная, а в том, что она даже близко не та, которая задумана. Даже в теории 734 кГц получиться никак не должно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
my504 2 4 июня, 2022 Опубликовано 4 июня, 2022 · Жалоба 3 hours ago, cybersonner said: Даже в теории 734 кГц получиться никак не должно. По моим расчетам должно получится примерно 2,778 кГц. Tad у вас в 50 раз больше системного периода - 80/50=1,6 МГц. Преобразование с учетом окна захвата - 36*Tad (12 - преобразование и 24 - захват). Ну и 16 преобразований на одно прерывание. Из чего следует, что скорее всего, флаг вы не сбрасываете. Включите дебаг и поставьте брекпойнт в обработчике. ЗЫ. Я полагаю вы в курсе, что есть ЧЕТЫРЕ регистра флагов одного домена: IFS1, IFS1CLR, IFS1SET и IFS1INV. То есть для сброса нужно писать ЕДИНИЦУ в соответствующий бит регистра IFS1CLR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cybersonner 1 5 июня, 2022 Опубликовано 5 июня, 2022 · Жалоба Спасибо, очень похоже на то, что флаг не сбрасывается. Весь обработчик прерывания (уж проще сложно придумать): TEST_Set(); IFS1CLR = _IFS1_AD1IF_MASK; TEST_Clear(); Завтра в железе проверю отладчиком, сбрасывается ли флаг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
cybersonner 1 6 июня, 2022 Опубликовано 6 июня, 2022 · Жалоба Цитата 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); } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться