Использование высокоскоростной съемки для оценки переходных процессов

Блог им. radiolok
Дисклеймер: В данном топике описывается лайфхак, совмещающий все достоинства аналоговой техники, подкрепленной современной цифрой.

Эта статья — продолжение эпопеи про позиционный электропривод, энкодер и задатчик интенсивности. Так сложилось что сейчас я занимаюсь приводом и тестирую его всевозможные узкие места.
Мне вдруг показалось, что работающее во благо энкодера прерывание халтурит в период разгона привода. Вот как это проверить? Ответ под катом:

Сразу скажу — ничего мне не показывалось. Просто мой цифровой осциллограф не может зарегистрировать импульс в 5мкс. Отсюда, кстати, пропуски на осциллограмме.

Но обо всем по порядку. Первым делом рекомендую читателю вспомнить мою статью про диспетчер. Мне стало интересно, сколько времени требуется диспетчеру, чтобы выполнить все задачи? Я выделил отдельную ножку, включаемую в начале обработки и отключаемую в конце. В итоге получилась следующая осциллограмма:

Как можно видеть, диспетчеру в нормальном режиме требуется 180мкс на обработку данных при частоте 100Гц. т.е. мгновенная загрузка контроллера составляет 1,8%. Если запустить привод, то загрузка увеличивается до 3%, что вполне приемлемо. Если нажать на кнопку, то обработка этого события подчас требует и все 40милисекунд. Такой метод, к слову, является хорошим способом на этапе отладки определить время выполнения тех или иных задач.

Теперь к сути дела. За считывание данных с энкодера отвечает прерывание PCINT2. Для того, чтобы понять когда оно начинается а когда заканчивается, выделим контрольную ножку, которую будем включать и выключать:
ISR (PCINT2_vect){//срабатывает энкодер
 PORTJ|=(1<<PJ0);
cli();
//код обработчика прерывания, содержащий вложенные функции. 
sei();//На практике оказалось, что оттуда его могут выдернуть другие прерывания. Посему блочим их.
  PORTJ&=~(1<<PJ0);
}

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

Ну вот же! Если не обращать внимания на особенности цифровой фотосъемки совсем другое дело. Да, все отрабатывается абсолютно верно, на всех скоростях. Возникла мысль — вот бы увидеть процесс разгона. Цифровой осциллограф дает возможность записать сигнал, но он не видит и половины импульсов с прерывания! Взор падает на мой фотоаппарат, позволяющий производить видеозапись со скоростью 320кадров в секунду в вырвиглазном, 320х112пикселов качестве. Честно сказать, ради этой функции я его и купил год назад…
Включаем фотоаппарат на съемку и запускаем разгон привода от 0 до 50% скорости. а как наберет — обратно его до нуля.
Снимал без штатива, ибо у него развалился шарнир, а новый мне купить лень.

Внимательно изучаем видео — процесс разгона отображается весьма и весьма наглядно. Еще бы вот данные бы как-то передать о текущей скорости, чтобы в начале видео было понятно что и как, а так вообще красота.
Аналоговая техника в таком интересном формате — это отличный метод проверки и тестирования переходных процессов вообще и определенных узлов в частности.

Послесловие:
К слову сказать, на моем операционном столе сейчас находится аналоговый запоминающий осциллограф С8-17, на котором вот все это можно будет провернуть без лишних телодвижений. Правда у осциллографа серьезная деградация собственно блока памяти. Но, думаю это не такая большая проблема.

9 комментариев

avatar
Ютуб посчитал, что у меня видео слишком дерганное и решил его стабилизировать. Только за стабильную точку решил взять луч осциллографа. Надеюсь откат изменений произойдет прежде, чем это увидит кто-то кроме меня :)
avatar
На сколько я знаю, у AVR вложенные прерывания по умолчанию запрещены. Поэтому твой sei в прерывании, наоборот, разрешит их на время выполнения последней строчки.

А вообще, цифровой осциллограф, который не может отловить 5мкс — это полный швах. Возможно, у него есть режим оверсэплинга, усреднения или еще чего такого. Можно ими поклацать. Так как у тебя сигнал периодически, должно помочь.

Но идея с записью — крутая :)
avatar
Осциллограф нормальный, он нормально отображает 5мкс. Но на соответствующих частотах развертки. А на той частоте развертки, которая мне нужна, импульс сигнала становится размером менее точки и не фиксируется. Такие вот дела.
И никакой оверсэмплинг тут не поможет.

Меня вытаскивает не из вложенного прерывания, а из функции, которая вызывается этим прерыванием. В итоге, у меня переполняется стек и система замирает. Возможно есть более совершенные способы защиты от переполнения стека, но этот, по крайней мере, решил мою проблему.
avatar
Что-то я не пойму, как cli(); поможет от переполнения стека? Вложенные прерывания и так запрещены.
avatar
Для меня он явно запрещает прерывания. Вот не вижу я запрета на прерывание пока выполняются все вложенные функции текущего.
avatar
Дак, в обработчике прерывания прерывания запрещены, пока ты их не разрешишь.
avatar
У этого осциллографа память реализована за счет самой трубки, а она очень быстро садится. И дает такой режим не больше чем непосредственное фотографирование.
avatar
Не в обиду — какой-то онанизм.
Atten за 10000 рублей нормально бы всё запомнил.
А была бы STM-ка — можно было бы отлаживаться с привязкой к sys-tick'ам.
avatar
Дык вот вам и если бы да ка бы! Речь идет о подручных средствах.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.