Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR и фазовращатель
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
kanzler
Уважаемы, господа! Прошу вашей помощи. Есть меандр с частотным диапазоном 1-2 кГц. Нужно фращать фазу от 0 до 180 или 360 градусов с шагом 1-5 градусов. Поделитесь опытом или подскажите где есть исходники для AVR, если кто делал такую штуку. Я реализовал такую шутку но только на ПЛИС которая работает только с одной частотой.
andrvisht
Цитата(kanzler @ Mar 31 2006, 11:11) *
Уважаемы, господа! Прошу вашей помощи. Есть меандр с частотным диапазоном 1-2 кГц. Нужно фращать фазу от 0 до 180 или 360 градусов с шагом 1-5 градусов. Поделитесь опытом или подскажите где есть исходники для AVR, если кто делал такую штуку. Я реализовал такую шутку но только на ПЛИС которая работает только с одной частотой.

Делал для эмуляции SIN/COS вращающегося трансформатора. Код написан был еще в Algorithm Builder но он очень прост, так что разберетесь.
algrom.net это программа Algorithm Builder
Валентиныч
Цитата(kanzler @ Mar 31 2006, 14:11) *
Есть меандр с частотным диапазоном 1-2 кГц. Нужно фращать фазу от 0 до 180 или 360 градусов с шагом 1-5 градусов.

Не понятна постановка вопроса...
"Вращать фазу" можно только относительно чего-либо (какой-то реперной фазы). Если у вас просто генератор меандра, то скорее нужно говорить о временнОй задержке фронтов, а не о фазе, как таковой. Тем более, что речь идет о дискретном изменении этого параметра.
Так же стоило бы указать параметры фазо-модулирующего сигнала (или - закона, по которому "гняется" фаза).
В любом случае, задача довольно тривиальна (ИМХО), и должна легко решаться программно.
kanzler
Цитата(Валентиныч @ Apr 1 2006, 16:09) *
Не понятна постановка вопроса...
"Вращать фазу" можно только относительно чего-либо (какой-то реперной фазы).

Относительно самого же меандра. То есть на входе меандр на выходе тот же меандр но только со сдвигом фазы.
Цитата(Валентиныч @ Apr 1 2006, 16:09) *
Если у вас просто генератор меандра, то скорее нужно говорить о временнОй задержке фронтов, а не о фазе, как таковой. Тем более, что речь идет о дискретном изменении этого параметра.
Так же стоило бы указать параметры фазо-модулирующего сигнала (или - закона, по которому "гняется" фаза).
В любом случае, задача довольно тривиальна (ИМХО), и должна легко решаться программно.

Согласен, просто ... на ПЛИС это всё работает, правда только для фиксированной частоты. Но вот на AVR пока не удалось реализовать такую штуку.
Валентиныч
Все таки, поставьте задачу конкретнее - начиная со способа формирования (программно или аппаратно?) и частотного диапазона исходного меандра с дискретность изменения частоты, и определитесь с законом модуляции. Многое будет зависить от закона, по которому изменяется фаза. Если это просто отдельные скачки фазы на какой-то (или строго определенный?) угол - это одно, если эти скачки во времени имеют какую-то закономерность - другое. Нужно ли крутить фазу в обе стороны, или достаточно простой фазовой задержки? Кстати - сама задача реалтаймовская, или...?
Кроме того, необходимо знать: нужен единственный выход с ФМ, или вам требуется два независимых канала - реперный, и канал с ФМ.

Повторюсь: если отвлечься от закона изменения фазы, то сам процесс изменения легко свести к обычной задержке фронтов меандра на t(задержка)=Т(период)/360*К(угол сдвига фазы) простым повтором команды "nop", или ее циклом.
При реальных тактовых частотах процессора (8-12 МГц) вполне можно добиться точности "поворота" фазы сигнала частотой 1-2 кГц не хуже 0,01%, или ~ 0,04 град.
kanzler
Меандр формируется аппаратно-программным способом (Таймер AVR), частотный диапазон 1-2кГц с шагом 1Гц, который возбуждает катушку индуктивности металлодектора. С катушки снимается ток который формирует меандр который может менять фазу относительно сигнала с генератора, являющийся синхросигналом для синхронного детектора. Но не суть важно, важно то что это меандр нужно крутить по фазе в обоих направлениях с шагом 1-5 градусов (задача не жёсткая, но необходимая для поиска квадратуры и синфазной составляющей). Поворот фазы нужно производить программным способом в начальный момент настройки работы прибора, но возможно придётся и в реалтайме крутить фазу(пока не известно).
andrvisht
to kanzler
Судя по постам проблема еще не решена ?
Обнаружил дома более свежий вариант, с кнопочками smile.gif
Что-то редактирование поста не работает, так что прилагаю обновленный снова.
Если проблема с AlgBuilder то скажите на какой кристалл и к каким ногам кнопки прицепить тогда hex приложу и asm listing.
kanzler
Цитата(&-rey @ Apr 4 2006, 12:44) *
to kanzler
Судя по постам проблема еще не решена ?
Обнаружил дома более свежий вариант, с кнопочками smile.gif
Что-то редактирование поста не работает, так что прилагаю обновленный снова.
Если проблема с AlgBuilder то скажите на какой кристалл и к каким ногам кнопки прицепить тогда hex приложу и asm listing.

К Сожалению нет, нерешена ...
Ну а кнопки зачем?
andrvisht
Цитата(kanzler @ Apr 4 2006, 10:36) *
К Сожалению нет, нерешена ...
Ну а кнопки зачем?

Так это фазу крутить. Кнопка на увеличение фазы, и кнопка на уменьшение фазы, в пределах 360 грд конечно.
Или это не то что Вам нужно ?
kanzler
Цитата(&-rey @ Apr 4 2006, 13:41) *
Так это фазу крутить. Кнопка на увеличение фазы, и кнопка на уменьшение фазы, в пределах 360 грд конечно.
Или это не то что Вам нужно ?

Вы не правильно поняли, как управлять не стоит вопрос, вопрос в том что есть на входе меандр, а на выходе должен быть тот же меандр но сдвинутый по фазе, к тому же частота меандра может быть различна от 1 до 2 кГц. Ваш же пример - генератор двух меандров одной частоты но сдвинутых по фазе.
andrvisht
Цитата(kanzler @ Apr 4 2006, 12:12) *
Цитата(&-rey @ Apr 4 2006, 13:41) *

Так это фазу крутить. Кнопка на увеличение фазы, и кнопка на уменьшение фазы, в пределах 360 грд конечно.
Или это не то что Вам нужно ?

Вы не правильно поняли, как управлять не стоит вопрос, вопрос в том что есть на входе меандр, а на выходе должен быть тот же меандр но сдвинутый по фазе, к тому же частота меандра может быть различна от 1 до 2 кГц. Ваш же пример - генератор двух меандров одной частоты но сдвинутых по фазе.

все, теперь понял. Нужно будет подумать .
bzx
Цитата(kanzler @ Mar 31 2006, 12:11) *
Уважаемы, господа! Прошу вашей помощи. Есть меандр с частотным диапазоном 1-2 кГц. Нужно фращать фазу от 0 до 180 или 360 градусов с шагом 1-5 градусов. Поделитесь опытом или подскажите где есть исходники для AVR, если кто делал такую штуку. Я реализовал такую шутку но только на ПЛИС которая работает только с одной частотой.

Задача разбивается на 2
1. Определение частоты входного сигнала
2. Формирование задержки.
kanzler
Цитата(bzx @ Apr 4 2006, 17:50) *
Задача разбивается на 2
1. Определение частоты входного сигнала
2. Формирование задержки.

Огромное спасибо всем кто отвечает. Есть но ...
1. Я уже писал частота изменяется в диапазоне от 1 до 2 кГц с шагом 1 Гц. Тут проблем нет, так как эти частоты генерирует сам процессор.
2. вот тут и возникает вопрос как реализовать задержку в таком диапазоне частот чтобы не пропадали полупериоды меандра.
Для одно фиксированной частоты это реализовать не сложно (уже есть такое решение и прекрасно работает) на основе счётчика который и определяет задержку. Всё упирается в пункт 2.
bzx
Цитата(kanzler @ Apr 5 2006, 09:35) *
1. Я уже писал частота изменяется в диапазоне от 1 до 2 кГц с шагом 1 Гц. Тут проблем нет, так как эти частоты генерирует сам процессор.

Вот чудак-человек! А сразу нельзя было сказать, что твоя частота формируется самим контроллером. Я же в пункте 1. предполагал, что частота подаётся извне. Это всё значительно упрощает.

Цитата
2. вот тут и возникает вопрос как реализовать задержку в таком диапазоне частот чтобы не пропадали полупериоды меандра.
Для одно фиксированной частоты это реализовать не сложно (уже есть такое решение и прекрасно работает) на основе счётчика который и определяет задержку. Всё упирается в пункт 2.

Насколько я понимаю, то что предложил &-rey тебе должно подойти. Если же ты говоришь, что это тебе не подходит, то значит, что то ты чего то не договариваешь в задаче. Я подозреваю, что есть желание, что бы задержка (сдвиг фаз, в прочем это одно и тоже) была не фиксированная, а изменялась во времени. Тогда требуется ещё и скорость изменения фазы и направление изменения. Поясни.
andrvisht
cranky.gif а мне показалось, что имеллось ввиду что частоты малы и их легко можно контролировать ....
А вариант когда приходит частота а мы потом из неё делаем такую-же (с какой-то задержкой) и еще одну которая уже будет крутиться относительно этой опорной подойдет ?
Если да, тогда мене нужно будет вспомнить чего я там рисовал, и попытаться делать измерение входной частоты и выдачу корректированного параметра. Но следует оговорить скорость изменения входной частоты (фаза за период) что вообщем уже было сказано.
Валентиныч
Цитата(&-rey @ Apr 5 2006, 12:43) *
... и еще одну которая уже будет крутиться относительно этой опорной подойдет ?

А мне показалось, что фаза должна изменяться дискретно, с шагом 1-5 град. О каком "вращении" может идти речь?!
Я с самого начала обратил внимание на отсутствие закона изменения фазы. blink.gif
kanzler
Цитата(bzx @ Apr 5 2006, 12:12) *
Вот чудак-человек! А сразу нельзя было сказать, что твоя частота формируется самим контроллером. Я же в пункте 1. предполагал, что частота подаётся извне. Это всё значительно упрощает.
Насколько я понимаю, то что предложил &-rey тебе должно подойти. Если же ты говоришь, что это тебе не подходит, то значит, что то ты чего то не договариваешь в задаче. Я подозреваю, что есть желание, что бы задержка (сдвиг фаз, в прочем это одно и тоже) была не фиксированная, а изменялась во времени. Тогда требуется ещё и скорость изменения фазы и направление изменения. Поясни.

Народ, не ужели задача так и не понята вами. Есть меандр, частота его выбирается в момент настройки прибора и дальше в работе остаётся неизменной, этот меандр генерит микроконтроллер. Частота выбирается из диапазона 1-2кГц. Далее эта частота возбуждает катушку индуктивности. С катушки снимается ток и снятый сигнал является так же меандром, он приходит на микроконтроллер. Вот этот самый меандр что приходит с катушки нужно сдвигать по фазе в обоих направлениях от 0 до 180 градусов. Шаг сдвига от 1 до 5 градусов(если смущает диапазон шага тогда пусть будет шаг 1 градус) меняем значение сдвига не во времени, например поменяли угол и смотрим что происходит. Сдвинутый по фазе меандр уже идёт на синхронный детектор который так же находиться в микроконтроллере. Не знаю ещё как объяснить. Может тогда структурную схему выложить?

Цитата(Валентиныч @ Apr 5 2006, 15:21) *
А мне показалось, что фаза должна изменяться дискретно, с шагом 1-5 град. О каком "вращении" может идти речь?!
Я с самого начала обратил внимание на отсутствие закона изменения фазы. blink.gif

Хорошо, может где то я и ошибся назвав это фазовращением. Сдвиг фазы будет правильно. Но устройство которое сдвигает фазу как называется - сдвигатель фазы?
Валентиныч
Цитата(kanzler @ Apr 5 2006, 15:27) *
Хорошо, может где то я и ошибся назвав это фазовращением. Сдвиг фазы будет правильно. Но устройство которое сдвигает фазу как называется - сдвигатель фазы?

Принципиальной ошибки разумеется нет. Скорее - терминологическая, которая и не позволила сразу понять вашу задачу.
Под "фазовращением" обычно подразумевают процесс непрерывного изменения фазы во времени, обычно по какому-то определенному закону.
В данном случае речь идет именно о фазовых (или временнЫх) задержках (именно сдвигах!), что сильно упрощает задачу.
А устройство скорее будет называться - линия задержки. smile.gif Но, к сожалению, это не позволит менять фазу в обе стороны от реперной. Только в минус... Но - на любое значение, хоть на 3600 град (10 периодов).
Формулу, по которой вычисляется фазовая задержка, я написал выше. Надеюсь, что переложить ее на программный код труда не составит?

Встречные вопросы: интересно, а как вы собираетесь реализовать генерацию меандра с заданной точностью (1 Гц) в этом диапазоне? И какая, все таки, дискретность изменения фазы вам нужна - 1 или 5 град.?
andrvisht
Цитата(kanzler @ Apr 5 2006, 12:27) *
Сдвинутый по фазе меандр уже идёт на синхронный детектор который так же находиться в микроконтроллере.

ну вот, опять я запутался. А зачем сдвигать фазу для того чтобы подать её на детектор в том же контроллере ? а может просто к результату детектора добавить данную фазу ?
Если все таки нужно один из сигналов сдвинуть по фазе, или, что тоже самое, ввести задержку то можно наверное так:
Этот сигнал заводим на внешнее INT0 и настраиваем прерывание по изменению.
в обработчике INT0 перезапускаем таймер1 а фазу записывем в OCR1A регистр.
когда прерывание по OCR1A произойдет меняем состояние выходного сигнала ноги на обратный. (а еще лучьше сразу аппаратно настроить режим перключения спец. ноги OCRA)

проблема состоит только в синхронизации входной частоты но это тоже можно сделать либо при старте процессора, либо в его софте когда вы подаете частоту на катушку.

PS: Это все только идеи которые нужно проверять ...
kanzler
Цитата(Валентиныч @ Apr 6 2006, 09:41) *
Принципиальной ошибки разумеется нет. Скорее - терминологическая, которая и не позволила сразу понять вашу задачу.
Под "фазовращением" обычно подразумевают процесс непрерывного изменения фазы во времени, обычно по какому-то определенному закону.
В данном случае речь идет именно о фазовых (или временнЫх) задержках (именно сдвигах!), что сильно упрощает задачу.
А устройство скорее будет называться - линия задержки. smile.gif Но, к сожалению, это не позволит менять фазу в обе стороны от реперной. Только в минус... Но - на любое значение, хоть на 3600 град (10 периодов).
Формулу, по которой вычисляется фазовая задержка, я написал выше. Надеюсь, что переложить ее на программный код труда не составит?

Встречные вопросы: интересно, а как вы собираетесь реализовать генерацию меандра с заданной точностью (1 Гц) в этом диапазоне? И какая, все таки, дискретность изменения фазы вам нужна - 1 или 5 град.?

Я не собираюсь ... я уже реализовал такую генерацию. Всё просто - таймер микроконтроллера это умеет делать без всяких проблем. Дискретность нужна точная, то есть 1 градус, но я понимаю что возможно такой точности не добиться и поэтому задача упрощается до точности 5 градусов

Цитата(&-rey @ Apr 6 2006, 12:10) *
ну вот, опять я запутался. А зачем сдвигать фазу для того чтобы подать её на детектор в том же контроллере ? а может просто к результату детектора добавить данную фазу ?
Если все таки нужно один из сигналов сдвинуть по фазе, или, что тоже самое, ввести задержку то можно наверное так:
Этот сигнал заводим на внешнее INT0 и настраиваем прерывание по изменению.
в обработчике INT0 перезапускаем таймер1 а фазу записывем в OCR1A регистр.
когда прерывание по OCR1A произойдет меняем состояние выходного сигнала ноги на обратный. (а еще лучьше сразу аппаратно настроить режим перключения спец. ноги OCRA)

проблема состоит только в синхронизации входной частоты но это тоже можно сделать либо при старте процессора, либо в его софте когда вы подаете частоту на катушку.

PS: Это все только идеи которые нужно проверять ...

Сдвиг фазы нужен для того чтобы было возможно обнаружить металлический предмет из определённого металла. Это связано стеорией ... и думаю вы меня поймёте. На данный момент так и реализованна работа синхронного детектора, по прерыванию INT2 микроконтроллера и работает синхронный детектор. Теперь осталось реализовать сдвиг фазы меандра.
Мысль, изложенная вами, очень даже привлекательна. Вы правы её надо проверить.
kanzler
Огромное спасибо всем кто старался помочь в данном вопросе. Может кто знает какую микросхему линии задержки с программируеммым временем задержки до 500 uS?
andrvisht
В симуляторе прошелся, вроде работает.
для примера взял 2-й таймер, т.к. первый наверняка занят под генерацию меандра.
фаза утанавливается в OCR2. Длительность периода таймера 2 должна быть больше чем длительность периода формируемого сигнала на катушку. вы писали что он устанавливается при старте, значит посчитать не проблема.
HalfPeriod - длительность в тактах 2-го таймера полупериода выдаваемого сигнала соответственно не должна превышать мах число таймера 2 деленное на 2.

Точность данного решения не велика, по отношению к выдаваемому сигналу поэтому для этого нужен 16 разрядный таймер, но главное чтоб это было то что необходимо.
Тогда возможно сделаем все на одном 16 разрядном и 2-х регистрах сравнения. Например OCR1A делает выходной меандр, на ICR приходит прерывание от входного сигнала (тот который будем сдвигать) а по результату захвата будем писать OCR1B чтобы формировать уже сдвинутый сигнал.

Теперь к вопросу о теории. Что понимаем под синхронным детектором. В чем смысел ?
Вопрос в том, что если например Вы сдвигаете фазу назад чтобы сигналы наложились и тогда эта фаза и есть результат то тогда можно предложить измерять разность фаз непосредственно.
Если проблема в том что нельзя определить знак фазы, то это тоже решаемо.

Внесите ясность если эта теория не является закрытой информацией sad.gif
Тогда возможно предложат больше вариантов решения.
PS: В архивчике также дока на линии задержки, ссылок не помню, попробуй Googl-ом по ключевым словам smile.gif
kanzler
Цитата(&-rey @ Apr 7 2006, 12:06) *
В симуляторе прошелся, вроде работает.
для примера взял 2-й таймер, т.к. первый наверняка занят под генерацию меандра.

так оно и есть. Один таймер у меня генерирует меандр (timer 1), другой запускает внешнее АЦП (timer 3).

Цитата(&-rey @ Apr 7 2006, 12:06) *
Тогда возможно сделаем все на одном 16 разрядном и 2-х регистрах сравнения. Например OCR1A делает выходной меандр, на ICR приходит прерывание от входного сигнала (тот который будем сдвигать) а по результату захвата будем писать OCR1B чтобы формировать уже сдвинутый сигнал.

Вот тут пожайлуста поподробнее.

Цитата(&-rey @ Apr 7 2006, 12:06) *
Теперь к вопросу о теории. Что понимаем под синхронным детектором. В чем смысел ?

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

Цитата(&-rey @ Apr 7 2006, 12:06) *
PS: В архивчике также дока на линии задержки, ссылок не помню, попробуй Googl-ом по ключевым словам smile.gif

Спасибо!
andrvisht
Цитата(kanzler @ Apr 7 2006, 10:00) *
Вот тут пожайлуста поподробнее.

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


вот и я об этом, зачем сдвигать полученную частоту, если можно просто измерять сдвиг фаз ? А настраивать соответственно коридором изменения фазы. Тут как раз и не понятно, зачем полученную частоту еще двилать, почему не измерять сдвиг сразу ?
Валентиныч
Для задержки сигнала, который УЖЕ имеется в камне (генерится внутри или заводится извне) не требуется внешней линии задержки - все можно организовать программно.
Если же требуется "крутнуть" фазу внешнего сигнала (условно - аналогового, т.к. принятый сигнал от датчика металлоискателя с натяжкой можно назвать цифровым), то отлично подойдет отечественная мс 528БР1 - сдвоенная аналоговая ЛЗ на 128 бит (ПЗС). Есть еще 528БР3, длиной 1К, если память не изменяет. Для управления первой требуется двухфазный тактовый сигнал (прямой и инверсный выход любого триггера), для второй достаточно одной фазы (меандр). Тактовые частоты - примерно до 500 кГц, задержку можете посчитать сами.
kanzler
Цитата(Валентиныч @ Apr 7 2006, 18:55) *
Для задержки сигнала, который УЖЕ имеется в камне (генерится внутри или заводится извне) не требуется внешней линии задержки - все можно организовать программно.
Если же требуется "крутнуть" фазу внешнего сигнала (условно - аналогового, т.к. принятый сигнал от датчика металлоискателя с натяжкой можно назвать цифровым), то отлично подойдет отечественная мс 528БР1 - сдвоенная аналоговая ЛЗ на 128 бит (ПЗС). Есть еще 528БР3, длиной 1К, если память не изменяет. Для управления первой требуется двухфазный тактовый сигнал (прямой и инверсный выход любого триггера), для второй достаточно одной фазы (меандр). Тактовые частоты - примерно до 500 кГц, задержку можете посчитать сами.

Спасибо за предложение, проверю подходит она мне или нет.
andrvisht
Насколько понимаю кристалл у нас mega128, что не может не радовать smile.gif
Тогда, раз такой вариант устраивает, делаем следущее:
Берем Timer 1 в режиме CTC (ограничение максимума по OCR1A)
где число в OCR1A - период выдаваемого меандра.
для CK/64 и 8 MHz это как раз 2 кГц и OCR1A=$FFFF
Генерацию выходного меандра делаем по OCR1B так:
изначально
Код
OCR1B=0;

настраиваем его выход на переключение по сравнению, а в самом обработчике
прерывания по сравнению делаем такую штуку
Код
OCR1B += (OCR1A/2)+1; //+1 нужен для коррекции, чтобы (OCR1A/2)+(OCR1A/2) было = OCR1A+1
if (OCR1B > OCR1A) OCR1B=0;

Настраиваем обработчик прерывания по захвату данных Timer 1 в регистр ICR1
Собственно на вход ICR и будет поступать сигнал от катушки.
Когда прерывание сработает в ICR уже будет лежать значение фазового сдвига.
НО, мы на этом не останавливаемся, хотя мне до сих пор не ясно почему ...
Для формирования сигнала сдвинутого по фазе от входного будем использовать OCR1С.
изначально
Код
OCR1С=alpha; // фаза на которую сдвигаем входной сигнал

настраиваем его выход на переключение по сравнению, а в самом обработчике
прерывания по сравнению делаем так:
Код
long Comp = (long)OCR1С + (long)(OCR1A/2)+1L;
while (Comp > (long)OCR1A) Comp -= (long)OCR1A;
OCR1С = (int)Comp;

а обработчик прерывания по захвату (ICR) делаем так:
Код
long Comp = (long)alpha + (long)TCNT1;
while (Comp > (long)OCR1A) Comp -= (long)OCR1A;
OCR1С = (int)Comp;

В последних обработчиках необходима промежуточная переменная Comp для того чтобы не потерять результат при переполнении. В принципе работа аналогично тому, что я приводил ранее с timer 2, только в этом случае мы отталкиваемся не от нуля, а от значения в TCNT1.
PS: Ухожу из обсуждения в отпуск, Удачи.
kanzler
Цитата(&-rey @ Apr 10 2006, 16:27) *
Ухожу из обсуждения в отпуск, Удачи.

Cпасибо за помощь. Попробую реализовать вашу затею.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.