Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-ноя-17 20:09

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Время срабатывания прерывания
СообщениеДобавлено: 2017-сен-08 11:48 
Не в сети

Зарегистрирован: 2016-фев-26 09:54
Сообщения: 22
Здравствуйте!
Имеется задача измерять амплитуду узких (300нс) импульсов, работая в широком диапазоне температур (от минус 50 до +85 грд.Ц). Применение пикового детектора на диоде, даже в схеме с ОУ и компенсацией падения приносит много проблем, потомучто эта компенсация на практике работает плохо. Внешние АЦП или компараторы не хотелось бы применять, поэтому рассматриваю возможность запуска встроенного АЦП по фронту импульса. Для измерения времени срабатывания написал такую программу (тактовая частота 64МГц):
Открыть "Программа и фото"
Код:
uint8_t interrupt_ready = 1;  // вспомогательный флажок

void main(void)
{
While(1)
{
    // если прерывание сработало - ждем когда импульс пройдет и взводим новое
    if(interrupt_ready)
    {
        if(no_signal(MOD3))  // если нет сигнала на ножке MOD3, которая PA0/EXT_INT1
        {
          pinSetFunc(MOD3,PORT_Func_FUNC2); // присваиваем регистру FUNC значение 2 - альтернативная функция
          interrupt_ready = 0;
            // взводим прерывание
          NVIC->ICPR[0] = (1UL << EXT_INT1_IRQn);
          NVIC->ISER[0] = (1UL << EXT_INT1_IRQn);
        }
    }
}
}

void EXT_INT1_IRQHandler(void)  // прерывание
{
    toggle(LED);  // мигаем светодиодом MDR_PORT##port -> RXTX ^= (1UL << bit);

    // прерывание возникает всегда пока на ножке лог.1
    NVIC->ICER[0] = (1UL << EXT_INT1_IRQn); // выключаем внешнее прерывание

    pinSetFunc(MOD3,PORT_Func_GPIO);  // присваиваем регистру FUNC значение 0 - порт общего назначения
    interrupt_ready = 1;
    ADC_Start();
}

Вложение:
irq_delay.jpg
irq_delay.jpg [ 47.69 КБ | Просмотров: 301 ]
Закрыть
Смотрю осциллографом (см. прикрепленное фото) на вход EXT_INT1(зеленый график) и на светодиод(желтый график), который дергается в прерывании. Видно что минимальное время реакции - около 500нс. Максимальное - 3 мкс, но это может быть связано с тем что у меня в программе работают и другие прерывания. Но в оправдание скажу что их мало, случаются они сильно реже этого прерывания и у всех минимально возможный код.

Вопрос такой: кто какие рекорды ставил по времени срабатывания прерывания и как это делали?
Вопрос 2: Сколько тактов вообще минимально должно пройти от события регистрации на ножке высокого уровня до входа в процедуру прерывания?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время срабатывания прерывания
СообщениеДобавлено: 2017-сен-08 11:58 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1010
Откуда: Тула
Скажу короткое имхо:
1. Никакой строгой времянки программно на кортексах (и многих других) даже не стоит пытаться получить. Ищите сразу другие варианты, не тратьте время.
2. АЦП весьма не шустрый (500 ksps), не стоит пытаться им измерять импульсы в 300 нс, тем более указанным Вами способом (запуск измерения из прерывания). Так что ищите другой АЦП и смеха ради попробуйте запустить АЦП на циклическое преобразование и по входу в прерывание сохраните несколько значений результатов АЦП (вообще хорошо было бы использовать DMA, будет своеобразная осциллограмма, да). Кто знает, может Вас устроит (тогда можно программно искать и анализировать импульсы и их амплитуду). Результатом поделитесь тогда =)

500 ns это нормальная цифра в данном случае и такое дрожание тоже вполне нормально.

Для ускорения работы обработчика прерывания стоит размещать его код в памяти flash кратно 128 битам.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время срабатывания прерывания
СообщениеДобавлено: 2017-сен-08 12:34 
Не в сети

Зарегистрирован: 2016-фев-26 09:54
Сообщения: 22
Импульсы следуют довольно редко и вообще не периодично (период примерно от 1 до 50 мкс). Показывать амплитуду нужно вообще раз в секунду, так что sps роли не играет, надо только быстро зарядить измерительную емкость. Пустить АЦП в цикл и выбирать максимальное значение - ну да, надо попробовать ))). Только меня потом покарают за такой алгоритм, если узнают.
prostoRoman писал(а):
Для ускорения работы обработчика прерывания стоит размещать его код в памяти flash кратно 128 битам.
А вот это для меня какая-то новая магия. Где подробнее почитать? А если в ОЗУ обработчик разместить?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Время срабатывания прерывания
СообщениеДобавлено: 2017-сен-12 13:41 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1010
Откуда: Тула
По всему логическая ошибка в схеме. Разрабатывал бы я - заложил трёхкратный запас по производительности АЦП. Или применять УВХ - других выходов не вижу.
Можно в ОЗУ. Кратно 128 лишь потому, что флеш 128 разрядная с предчтением - т.е. при первом же обращении вычитается максимальное кол-во команд.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 4


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB