Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: терморегулятор
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2
Lost_Viking
Цитата(domowoj @ Aug 2 2008, 15:26) *
Lost_Viking
А мож Вам лучше DS18x20 применить, никаких АЦП и никаких тебе опорных.
Дергай только ножками правильно, читай температуру в цифре и выводи на индикатор.


Нет, все эти датчики до 125 градусов. Мне же нужно до 200, в реале регулировка будет в районе 160-170.
domowoj
Цитата(_Pasha @ Jul 31 2008, 18:57) *
1. TL431 ему в опору, чтоб не баловался.
2. Noise canceler ему в мозги, иначе у младшего разряда нервный тик не пройдет.
3. Накопление методом скользящего среднего вне зависимости от того, удался ли п.2.


1.ТЛка - слабовато для опорного по точности
2.Это -сомо собой необходимо
3.Может быть применить какой-нибудь вероятностный критерий вместо скользящего среднего.

И провести темпер. диапазон изменения входного к опорному.

На каком датчике остановился?
Огурцов
Цитата(Lost_Viking @ Aug 2 2008, 15:27) *
Мне же нужно до 200, в реале регулировка будет в районе 160-170.

А что в качестве датчика, если не секрет ?
Я использовал термопару, но точность (в начале шкалы) не понравилась, видимо из-за смещения усилителя.
Lost_Viking
Цитата(domowoj @ Aug 3 2008, 10:25) *
1.ТЛка - слабовато для опорного по точности

Уже заметил. На чем посоветуешь опорное сделать?
Цитата(domowoj @ Aug 3 2008, 10:25) *
2.Это -сомо собой необходимо

Еще бы сделать небольшую паузу между переключением анодов индикатора, и в эту паузу мерить температуру с подавителем шумов.Тлько с синхронизацией замучаюсь.
Цитата(domowoj @ Aug 3 2008, 10:25) *
3.Может быть применить какой-нибудь вероятностный критерий вместо скользящего среднего.

брр, только если на голодный желудок.
Цитата(domowoj @ Aug 3 2008, 10:25) *
И провести темпер. диапазон изменения входного к опорному.

что-что?
Цитата(domowoj @ Aug 3 2008, 10:25) *
На каком датчике остановился?

Что-нибудь из этого. Пока еще не занимался конкретным выбором датчика.Как мозги доделаю, так датчик буду искать.

Кстати, такой вопрос: как правильно рассчитать значение на выходе АЦП? Судя по этой формуле:

На выходе получится максимум 1024, что никак не 10 бит, а все 11. т.е. 10000000000. Так как правильно считать?
domowoj
Хотя бы REF02.

Я бы вообще выключил все генераторы.

Чтобы диапазон измеряемой темперотуры 0...200
соотв. напряжению с датчика 0...Uref,

а 1024 - это кол-во дискрет от 0 до 1023.
Lost_Viking
Цитата(domowoj @ Aug 3 2008, 19:05) *
а 1024 - это кол-во дискрет от 0 до 1023.


А для рассчета в EXCEL ставить что? 1024 или 1023? Думаю, что 1023.
domowoj
Lost_Viking
Может лучше применить ЖК индикатор.
Lost_Viking
Цитата(domowoj @ Aug 3 2008, 19:31) *
Lost_Viking
Может лучше применить ЖК индикатор.

Не хочу тратиться на него. В принципе, у меня есть дома индикатор, но я не знаю как им управлять.
Посмотри, может ты подскажешь?
P.S. Так все-таки что мне ставить в EXCEL для рассчета значения на выходе АЦП?1024 или 1023?
domowoj
EXCEL не знаю.

А ЖК от чего?
rezident
Цитата(Lost_Viking @ Aug 3 2008, 21:46) *
P.S. Так все-таки что мне ставить в EXCEL для рассчета значения на выходе АЦП?1024 или 1023?
Вас в школе пропорцию составлять учили? Когда Vin=Vref получаем максимальное число которое можно представить 10-ю разрядами: 1023, т.е. Vref соответствует максимальному коду АЦП - 1023. Составляем пропорцию
Код
ADC     Vin
---- = -----  отсюда следует
1023    Vref


ADC=Vin/Vref*1023
domowoj
ADC=1023*Vin/Vref

так будет понятней.
Lost_Viking
Цитата(domowoj @ Aug 3 2008, 21:17) *
А ЖК от чего?


не помню.

Цитата(rezident @ Aug 3 2008, 21:34) *
Вас в школе пропорцию составлять учили? Когда Vin=Vref получаем максимальное число которое
ADC=Vin/Vref*1023


с какого перепуга в ДАТАШИТЕ пишут 1024???
rezident
Цитата(Lost_Viking @ Aug 4 2008, 01:56) *
с какого перепуга в ДАТАШИТЕ пишут 1024???

Господи, как же тяжело с недоученными школьниками! sad.gif
В микроконтроллере AVR 10-ти разрядный АЦП. С помощью 10-и двоичных разрядов можно представить 1024 числа, но максимальное значение такого 10-и разрядного числа составляет 0b1111111111=0x03FF=1023. Если мне не верите, воспользуйтесь виндовым калькулятором для перевода из одной системы счисления в другую wink.gif Также не нужно забывать о том, что нуль это тоже число! 1023+1=1024 числа. Так понятно?
Ну про прямую линию, ее графическое изображение и аналитическое представление (в виде формулы y=a*x+b ) вам надеюсь все-же объяснить не нужно?
АЦП квантует входной сигнал по линейному закону (по крайней мере разработчики АЦП к этому очень стремятся smile.gif )
_y_ = ________________ a _______________ *_x_ + __b__
ADC=(ADC(max)-ADC(min))/(Uref(max)-Uref(min))*Uin+ADC(min)

поскольку значения ADC(min)=0 и Uref(min)=0V, а ADC(max)=1023, то формула приводится к виду
ADC=1023/Uref(max)*Uin=1023*Uin/Uref(max)
Lost_Viking
вопрос остается открытым: почему в Даташите в этой формуле стоит 1024? Я-то прекрасно понимаю, что нуль - это тоже число, но мне непонятно почему в ДАТАШИТЕ для рассчета значения АЦП используют 1024. Ведь при этом совсем другое значение. Не веришь - сам посмотри, только там есть небольшая поправка к этому.
domowoj
Если в даташите написано - верь,
но тогда диапазон входных будет от 0 до (Uref-Uref/1024)
Dopler
Цитата
where VIN is the voltage on the selected input pin and VREF the selected voltage reference (see
Table 22-2 on page 255 and Table 22-3 on page 256). 0x000 represents analog ground, and
0x3FF represents the selected reference voltage minus one LSB.


Вот что написано в документации, а переводится это так - значение 0 говорит о том, что входное напряжение равно земле, значение 0x3FF говорит о том, что входное напряжение равно опорному минус напряжение одного младшего разряда (а не опорному!), т.е. верна формула из документации и в эксель надо писать 1024.
Lost_Viking
Цитата(Dopler @ Aug 4 2008, 12:13) *
Вот что написано в документации, а переводится это так - значение 0 говорит о том, что входное напряжение равно земле, значение 0x3FF говорит о том, что входное напряжение равно опорному минус напряжение одного младшего разряда (а не опорному!), т.е. верна формула из документации и в эксель надо писать 1024.


Короче, почти понятно.

Нашел в инете понятный учебник по цифорвым фильтрам, в отличие от того, который мне тут предлагали.
Вот ссылка. Там найдете "Уолт Кестер - Цифровые Фильтры". Кроме этого там много чего есть!

Попробовал сделать осреднение результата АЦП. Примерно так:
  • АЦП в режиме постоянного преобразования (free run)
  • По совпадению таймера с OCR0 вызывается прерывание, при помощи которого реализована дин.индикация
  • В этом же обработчике прерывания:
Код
1 for (i=1;i<=9;i++)
2     {current_temp=ADCL;
3     current_temp+=((int)ADCH << 8);
4     summ+=current_temp;}
5 current_temp=summ/9;
6 summ=0;
/*дальше идет разбиение числа по десятичным разрядам*/


Т.е. просто суммирую девять преобразований, и делю на их число. Т.е. нахожу среднее значение.
В итоге младший разряд на индикаторе по-меньше стал дрыгаться. Noice Reduction (с прерыванием) не особо помог. Сдается мне, что у меня что-то работает как антена smile.gif. Сделал отдельный провод со входа АЦП, что бы вольтметром мерить напряжение на нем, и при касании этого провода рукой - циферки начинают бегать вплоть до второго разряда.

Или все-таки в "коленной" разводке? Все сделано на макетке, спаяно медным лакированным проводом 0.2мм. Земля приходит почти везде в одну точку. Вот только аналоговая часть ненмого крива разведена. Вобщем, буду травить плату, посмотрю что получится.

Как я понял рекомендации такие: разявязать аналоговую часть от цифровой конденсаторами, все землянные выводы в одну точку, конденсаторы по-ближе к микросхеме, на вход АЦП RC ФНЧ с частотой среза 10..50Гц. Так?

Завтра попробую создать промежутки между включением анодов, что бы в эти промежутки впихнуть измерение сигнала.
rezident
Цитата(Lost_Viking @ Aug 4 2008, 04:34) *
вопрос остается открытым: почему в Даташите в этой формуле стоит 1024? Я-то прекрасно понимаю, что нуль - это тоже число, но мне непонятно почему в ДАТАШИТЕ для рассчета значения АЦП используют 1024. Ведь при этом совсем другое значение. Не веришь - сам посмотри, только там есть небольшая поправка к этому.
Ну раз в даташите написано, то спорить не буду. laughing.gif Тем более, что там в самом начале раздела описания ADC указано
Цитата
The ADC converts an analog input voltage to a 10-bit digital value through successive approxi-
mation. The minimum value represents GND and the maximum value represents the voltage on
the AREF pin minus 1 LSB.

Т.е. входной диапазон напряжений для ADC: Uin(min)=0V, Uin(max)=Uref-Uref/1024 и на вход АЦП напряжение равное AREF подавать нельзя. Точнее конечно можно, но не имеет смысла.
Тогда вполне логично получается. Подставляем в вышеуказанноую мной формулу
ADC=(ADC(max)-ADC(min))/(Uref(max)-Uref(min))*Uin+ADC(min)
значения ADC(max)=1023, ADC(min)=0, Uref(min)=0V, Uref(max)=Uref-Uref/1024=(1023*Uref)/1024 и получаем
ADC=(1023-0)/((1023*Uref)/1024)-0V)*Uin+0, а после преобразований
ADC=1024/Uref*Uin.
Выходит формула в даташите верная. Просто таковы особенности этого АЦП в AVR, о которых я не знал.
Lost_Viking
Цитата(xemul @ Aug 1 2008, 01:29) *
Попробуйте смоделировать (хоть в ёкселе) реакцию фильтра на единичный скачок (x=0 при i<0, x=1 при i>=0), поиграйтесь с A, и все станет просто и понятно.

07.gif a14.gif и уважуха!
Все, теперь я знаю "Простое скользящее среднее", "Взвешенное скользящее среднее" и "Экспоненциальное скользящее среднее".

Возникло сразу несколько вопросов:

(WMA) - как правильно рассчитать коэффициенты? Я пока беру 4 отсчета, соответственно ставлю 1/4.
(EMA) - было бы интересно привязать коэфф. "А" к помехам, т.е. если вдруг начинается частое мельтишение младших разрядов, то уменьшить А.
Огурцов
Цитата(Lost_Viking @ Aug 4 2008, 18:56) *
Все, теперь я знаю "Простое скользящее среднее", "Взвешенное скользящее среднее" и "Экспоненциальное скользящее среднее".

Бугагага:
// SMA - Simple Moving Average
// EMA - Exponential Moving Average
// WMA - Weighted Moving Average
// DEMA - Double Exponential Moving Average
// TEMA - Triple Exponential Moving Average
// TRIMA - Triangular Moving Average
// KAMA - Kaufman Adaptive Moving Average
// MAMA - MESA Adaptive Moving Average
// T3 - Triple Exponential Moving Average
Lost_Viking
Цитата(Огурцов @ Aug 5 2008, 00:57) *
Бугагага:
// SMA - Simple Moving Average
// EMA - Exponential Moving Average
// WMA - Weighted Moving Average
// DEMA - Double Exponential Moving Average
// TEMA - Triple Exponential Moving Average
// TRIMA - Triangular Moving Average
// KAMA - Kaufman Adaptive Moving Average
// MAMA - MESA Adaptive Moving Average
// T3 - Triple Exponential Moving Average


пилять! 07.gif
Вопрос такой: при использовании EMA метода, коэфф-т A должен быть вещественным. Т.е. в итоге функция получается вещественной. Но у меня дальше идет оператор "остаток от деления". Как мне согласовать вщественный тип с получением остатка от деления? Простое приведение типов не катит - нет округления. Т.е. мне нужно вещественное число округлить, а потом это число привести в целый тип. Как это реализовать на Си?
Lost_Viking
Так, все сделал. Сглаживает здорово!
Огурцов, можешь дать ссылки на формулы для DEMA...MAMA?
xemul
Цитата(Lost_Viking @ Aug 5 2008, 11:05) *
Вопрос такой: при использовании EMA метода, коэфф-т A должен быть вещественным. Т.е. в итоге функция получается вещественной. Но у меня дальше идет оператор "остаток от деления". Как мне согласовать вщественный тип с получением остатка от деления? Простое приведение типов не катит - нет округления. Т.е. мне нужно вещественное число округлить, а потом это число привести в целый тип. Как это реализовать на Си?

Помните, что такое подмножество рациональных чисел? Правильно, это подмножество чисел, которые могут быть представлены в виде отношения (ratio = дробь, отношение) двух целых чисел. И примерно в то же время Вам должны были сообщить, что любое вещественное число может быть с любой точностью приближено рациональным (хотя нет - года на 3-4 позже). Дальше сами догадаетесь?
Это в качестве посказки:
Цитата(xemul @ Jul 31 2008, 21:17) *
Простейший НЧ фильтр 1-го порядка: Yi = a * Yi-1 + b * Xi, a+b = 1
Т.е.
Код
Y = a * Y + b * X;

Для целочисленной арифметики удобно делать a=c/2^N, b=(2^N-c)/2^N.
Чтобы не набегала погрешность при обработке, разрядность Y должна быть не менее (разрядность X) + N.

Y = a * Y + b * X; // это фильтр на С; X - новое входное значение, Y - справа предыдущее выходное значение, слева - новое.
Цитата(xemul @ Jul 31 2008, 22:10) *
Код
u16_t Yavg;

for(;;)
{
   Yavg -= Yavg/256;
   Yavg += ADCH;
}

А это целочисленная реализация приведенного выше фильтра с коэффиентами a=255/256, b=1/256.
Ну и уж совсем на всякий случай: деление целого числа на 2^N компилятор заменит на N сдвигов вправо. 256 = 2^8.

ЗЫЖ я к своему детенышу (которому, думаю, примерно столько же годочков, сколько и Вам) за серьезной беседой обращаюсь на "Вы".
ЗЗЫЖ радует, что в Ваших постах не так уж много проблем с русским языком.
Огурцов
Цитата(Lost_Viking @ Aug 5 2008, 08:16) *
Огурцов, можешь дать ссылки на формулы для DEMA...MAMA?

Держи http://ta-lib.org/hdr_dw.html Надеюсь, дальше сам найдешь.
Lost_Viking
Цитата(xemul @ Aug 5 2008, 13:04) *
ЗЫЖ я к своему детенышу (которому, думаю, примерно столько же годочков, сколько и Вам) за серьезной беседой обращаюсь на "Вы".
ЗЗЫЖ радует, что в Ваших постах не так уж много проблем с русским языком.


Ну, извинните, я думал, что тут люди простые. Лично я не люблю когда меня на "Вы". Мне проще на "Ты". Сразо как-то "по-свойски". Если чем-то задел, то прошу прощения.

Кстати, я себе EMA сделал. смотрю на девайс и радуюсь =) Позже поэксперементирую с другими фильтрами.

Ко всем: EMA - это КИХ или БИХ?
rezident
Цитата(Lost_Viking @ Aug 5 2008, 20:50) *
Ко всем: EMA - это КИХ или БИХ?
БИХ. Вам же вроде давали эту ссылку => http://www.may.nnov.ru/mak/DSP/wisIIR.shtml
Кстати, EMA эквивалентно установке RC-цепи на входе измерителя.
Tanya
Цитата(Огурцов @ Aug 5 2008, 00:57) *
Бугагага:
// SMA - Simple Moving Average
// EMA - Exponential Moving Average
// WMA - Weighted Moving Average
// DEMA - Double Exponential Moving Average
// TEMA - Triple Exponential Moving Average
// TRIMA - Triangular Moving Average
// KAMA - Kaufman Adaptive Moving Average
// MAMA - MESA Adaptive Moving Average
// T3 - Triple Exponential Moving Average

А вообще говоря, имея в виду обобщенное среднее, можно этих средних придумать бесконечно много...
A=Sum(a(i)*b(i)/Sum(b(i)) Или интеграл вместо суммы...
domowoj
Усреднение не всегда есть хорошо.
Если есть время( а оно у автора есть) лучше применить вероятностный метод
(не знаю как он называтся по научному)

мз массива оцифрованных значенний выбрать наиболее часто встречающееся.
rezident
Цитата(domowoj @ Aug 5 2008, 22:41) *
мз массива оцифрованных значенний выбрать наиболее часто встречающееся.
Медианная фильтрация?
Lost_Viking
Цитата(rezident @ Aug 5 2008, 19:00) *
Кстати, EMA эквивалентно установке RC-цепи на входе измерителя.


Я уже заметил =).
domowoj
Да нет, похоже не медианная.
rezident
Цитата(domowoj @ Aug 5 2008, 23:25) *
Да нет, похоже не медианная.
Почему не похоже? Если вашу фразу продолжить
Цитата
мз массива оцифрованных значенний выбрать наиболее часто встречающееся
значения в окне фильтрации, то вполне медианная фильтрация получается.
xemul
Цитата(domowoj @ Aug 5 2008, 20:41) *
Усреднение не всегда есть хорошо.
Если есть время( а оно у автора есть) лучше применить вероятностный метод
(не знаю как он называтся по научному)

мз массива оцифрованных значенний выбрать наиболее часто встречающееся.

Вы предлагаете построить гистограмму выборки? Могу предположить, что закон распределения для выборки, не очень искаженной какими-либо неприличными факторами, будет близок к нормальному, и, соответственно, максимум распределения совпадет со средним значением выборки. Если же закон распределения будет даже несимметричен, то имеет смысл сначала проверить смехотехнику и программу, а потом уж пускаться во всякие тяжкие.
Если выборка содержит выбросы (ну, н-р, АЦП не вовремя прочитали), то их, как уже отметил ув. rezident, можно попробовать отрезать медианным фильтром.
Но:
1) нужны ли такие навороты в придумываемой коробочке?
2) готов ли автор (которого пугают греческие буквыsmile.gif) лезть в теорию измерений? Там этих буковок...
_Pasha
Цитата(Lost_Viking @ Aug 4 2008, 17:39) *
Попробовал сделать осреднение результата АЦП. Примерно так:[list]
[*]АЦП в режиме постоянного преобразования (free run)
[*]По совпадению таймера с OCR0 вызывается прерывание, при помощи которого реализована дин.индикация
[*]В этом же обработчике прерывания:

Блин, всю свадьбу пропустил... Вот мне одно непонятно: как можно так мощно дрыгать ногами в динамич. индикации и не отбрасывать значения АЦП, полученные за период, в котором было переключение ног ?
Я так понимаю, что у нас должно быть прерывание во free run, и прерывание по OCR0, если угодно.
В gcc-шной нотации где-то так:
Код
volatile uint8_t bad_adc; // used as flag
volatile uint8_t ad_cnt;   //counter
volatile uint32_t ad_sum;
volatile uint16_t ad_result;
ISR(SIG_ADC)
{
if(!bad_adc)
{
    ad_sum+=(uint32_t) ADC;
    if(ad_cnt++ == 0)
     {
       ad_result = (ad_sum >>8) & 1023;
            ad_sum = 0;
     }
}
else
{
   bad_adc = 0;
}
}

ISR(SIG_OUTPUT_COMPARE0)
{
/* здесь динамическая индикация*/
/* и обязательно пометка о плохих измерениях */
bad_adc = 1;
}
domowoj
Цитата(xemul @ Aug 6 2008, 04:55) *
Вы предлагаете построить гистограмму выборки? Могу предположить, что закон распределения для выборки, не очень искаженной какими-либо неприличными факторами, будет близок к нормальному, и, соответственно, максимум распределения совпадет со средним значением выборки. Если же закон распределения будет даже несимметричен, то имеет смысл сначала проверить смехотехнику и программу, а потом уж пускаться во всякие тяжкие.
Если выборка содержит выбросы (ну, н-р, АЦП не вовремя прочитали), то их, как уже отметил ув. rezident, можно попробовать отрезать медианным фильтром.
Но:
1) нужны ли такие навороты в придумываемой коробочке?
2) готов ли автор (которого пугают греческие буквыsmile.gif) лезть в теорию измерений? Там этих буковок...

Автору же точность нужна и пусть тренируется.
xemul
Цитата(_Pasha @ Aug 6 2008, 03:40) *
Блин, всю свадьбу пропустил... Вот мне одно непонятно: как можно так мощно дрыгать ногами в динамич. индикации и не отбрасывать значения АЦП, полученные за период, в котором было переключение ног ?
Я так понимаю, что у нас должно быть прерывание во free run, и прерывание по OCR0, если угодно.

А зачем freerun? Пусть хочется вывести 4 десятичных разряда для индикации с частотой обновления 100 Гц (2.5 мс на разряд). Пусть АЦП стоит в single shot с частотой 100 кГц (135 мкс на преобразование). Вывели все разряды, погасили индикаторы, запустили АЦП (хоть с noise canceller'ом), проснулись и поехали дальше индицировать.

Цитата(domowoj @ Aug 6 2008, 04:54) *
Автору же точность нужна и пусть тренируется.

bb-offtopic.gif Автору сначала нужно понять, что такое точность. От того, что он выведет на индикатор 10 бит, зафильтрованные по дальше некуда, точность не увеличится.
Да и пытаться одним камнем и измерять на пределе точности АЦП, и светодиодами мыргать - не совсем разумный подход.
Lost_Viking
Сейчас с макетки на плату переведу, и займусь повышением точности АЦП.
Кстати, я решил вынести с платы все транзисторы, кнопки... Все это будет на другой плате, куда будет впаян индикатор. Точность в пределе градуса обеспечивается. Все же зависит от типа датчика и опорного напряжения + шумы. :|
domowoj
Цитата(xemul @ Aug 6 2008, 14:54) *
А зачем freerun? Пусть хочется вывести 4 десятичных разряда для индикации с частотой обновления 100 Гц (2.5 мс на разряд). Пусть АЦП стоит в single shot с частотой 100 кГц (135 мкс на преобразование). Вывели все разряды, погасили индикаторы, запустили АЦП (хоть с noise canceller'ом), проснулись и поехали дальше индицировать.
bb-offtopic.gif Автору сначала нужно понять, что такое точность. От того, что он выведет на индикатор 10 бит, зафильтрованные по дальше некуда, точность не увеличится.
Да и пытаться одним камнем и измерять на пределе точности АЦП, и светодиодами мыргать - не совсем разумный подход.

Согласен
Lost_Viking-у стоило сперва сделать АЦП без динамической индикации, а потом усовершенствовать индикацию.
Я думаю 3 индикатора с 514ИДх - подошло бы.
loskun
Lost_Viking как устройство, получилось?
Вот _http://www.kosmodrom.com.ua/data/kty.php_ вроде неплохие датчики для вашего устройства, а вот это устройство сделано на этих датчиках _http://www.radiokot.ru/lab/controller/21/ .
Может вам будет интересно. Данный термометр я сейчас изготавливаю, жду когда приедут датчики. Прошу прощения может чего-то недосмотрел где можно посмотреть схему вашего устройства.
Twin_by
Всем привет. Не стал создавать новую тему. У меня собственно тоже терморегулятор только на ATtiny88. И проблема с АЦП. Как видно на скриншоте не соответствуют значения. Это идет самое первое измерение после включения. Второе уже показывает правильно. Вопрос почему значение BuffADC после присвоения не равно значению ADC?



Dog Pawlowa
Скорее всего отладчик неправильно отображает локальные переменные, сделайте static.
Ну и другие варианты возможны.
Aldec
Цитата(Lost_Viking @ Jul 30 2008, 12:01) *
Готова динамическая индикация


Какая острая необходимость вешать атмегу динамической индикацией

http://www.chipdip.ru/product/ldm-208ra/
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.