Сборка и испытания IDA-71S1 (этап 1). Проектирование этапа 2

Обсуждаются вопросы технического дайвинга, многосмесевых и декомпрессионных погружений, погружений в надголовные среды, использование ребризеров, вопросы безопасности и любые другие технически сложные вопросы.

Модераторы: трофи, Максим Васильев, KWAK, DukeSS

Ответить
Сообщение
Автор
Листригон
Активный участник
Сообщения: 1002
Зарегистрирован: 31-08-2005 19:18
Откуда: Moscow

#581 Сообщение Добавлено: 26-10-2005 20:45 Заголовок сообщения:

Имеешь ввиду разбить на два диапазона измерения, и программно переключать АЦП?

Аватара пользователя
Lt_Flash
Активный участник
Сообщения: 1516
Зарегистрирован: 14-02-2005 13:24
Контактная информация:

#582 Сообщение Добавлено: 26-10-2005 20:55 Заголовок сообщения:

Вообще-то у ПИКа до 12ти каналов АЦП. Есно разбить вольтаж пополам и обрабатывать верхнюю и нижнюю части по 10 бит каждая. А потом тупо складывать внутрях проца :)
Или можно зарезать вольтаж в два раза допустим резистором, и потом программно умножать просто полученное значение на 2...Просто смотря какая точность нужна. Уж число от 0 до 500 миливольт влезает в диапазон 10 бит ЛЕГКО. 2 в 10й вообще-то 1024, плюс все что ниже, короче 10 бит - это вплоть до 1024...
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver

Листригон
Активный участник
Сообщения: 1002
Зарегистрирован: 31-08-2005 19:18
Откуда: Moscow

#583 Сообщение Добавлено: 26-10-2005 21:03 Заголовок сообщения:

Я это и подразумевал, хорошая идея, так что думаю 10 разрядами обойдемся каналов в атмеле 8 , хватит.

Юрко
Активный участник
Сообщения: 361
Зарегистрирован: 13-01-2005 13:10
Контактная информация:

#584 Сообщение Добавлено: 26-10-2005 21:31 Заголовок сообщения:

AndyVas писал(а):Вопрос возник по разрядности АЦП для кислородных датчиков - 10бит мало получается, 12 вроде в самый раз, 16 - вроде перебор
10 не мало. Они позволят мерить парциалку с дискретностью до 0,005. А шумы датчика, на мой взгляд, на порядок больше. Если вы не планируете применять изощренные алгоритмы подавления шумов (а зачем?), то точнее мерять смысла нет.

Аватара пользователя
Lt_Flash
Активный участник
Сообщения: 1516
Зарегистрирован: 14-02-2005 13:24
Контактная информация:

#585 Сообщение Добавлено: 26-10-2005 21:34 Заголовок сообщения:

Юрко писал(а):
AndyVas писал(а):Вопрос возник по разрядности АЦП для кислородных датчиков - 10бит мало получается, 12 вроде в самый раз, 16 - вроде перебор
10 не мало. Они позволят мерить парциалку с дискретностью до 0,005. А шумы датчика, на мой взгляд, на порядок больше. Если вы не планируете применять изощренные алгоритмы подавления шумов (а зачем?), то точнее мерять смысла нет.
Вот и я про это говорю. Тем более, что на преобразование уходит некоторое время, а за это время шум как раз самоусредняется...Хотя есть конечно ненулевая вероятность (докажем по Коши или по Гейне? ;)), что из-за "шумов" мы замеряем очень низкое в один момент, или очень высокое в другой момент напряжение. Но можно же выровнять или программно или аппаратно через усилитель операционный с большим временем реакции? Т.е. допустим 0.3-0.5 секунды уже достаточно для четкого усреднения. А там пущай прыгает на входе как хочет - на выходе все будет линейно...
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver

Юрко
Активный участник
Сообщения: 361
Зарегистрирован: 13-01-2005 13:10
Контактная информация:

#586 Сообщение Добавлено: 26-10-2005 21:35 Заголовок сообщения:

Lt_Flash писал(а): Либо у вас прокси, либо вы подключаетесь ХТТП.
Угу. Прокси. Но я уже Листригону на мыло выслал.

Юрко
Активный участник
Сообщения: 361
Зарегистрирован: 13-01-2005 13:10
Контактная информация:

#587 Сообщение Добавлено: 26-10-2005 21:43 Заголовок сообщения:

Lt_Flash писал(а):
Юрко писал(а):Если вы не планируете применять изощренные алгоритмы подавления шумов (а зачем?), то точнее мерять смысла нет.
Вот и я про это говорю. Тем более, что на преобразование уходит некоторое время, а за это время шум как раз самоусредняется...Хотя есть конечно ненулевая вероятность (докажем по Коши или по Гейне? ;)), что из-за "шумов" мы замеряем очень низкое в один момент, или очень высокое в другой момент напряжение. Но можно же выровнять или программно или аппаратно через усилитель операционный с большим временем реакции? Т.е. допустим 0.3-0.5 секунды уже достаточно для четкого усреднения. А там пущай прыгает на входе как хочет - на выходе все будет линейно...
Чур меня :D . Сглазил :shock: . Уже пытаются шумы обрабатывать. В этом случае на них не нужно обращать внимания. Сигнал гораздо больше чем шумы, дискретность гораздо меньше. Что еще нужно инженеру для счастья? :D

Листригон
Активный участник
Сообщения: 1002
Зарегистрирован: 31-08-2005 19:18
Откуда: Moscow

#588 Сообщение Добавлено: 26-10-2005 21:47 Заголовок сообщения:

Угу. Прокси. Но я уже Листригону на мыло выслал.
Все получил, Lt_Flash' у переправил тоже.

Аватара пользователя
Lt_Flash
Активный участник
Сообщения: 1516
Зарегистрирован: 14-02-2005 13:24
Контактная информация:

#589 Сообщение Добавлено: 27-10-2005 10:26 Заголовок сообщения:

Листригон писал(а): Поэтому придется оценивать каждый член отдельно:
1 условие: Pcmpsafe<=Compartment С=0 в противном проверяем условие 2;

2 условие : Pgas<Compartment то модифицируем формулу
Bm:=1/(1-(Pcmpsafe-Compartment)/(Compartment-Pgas)); ( почему попытаюсь объяснить ниже.) в противном случае прежнее выражение:
B:=1/(1-(Pcmpsafe-Compartment)/(Pgas-Compartment));
Т.е в моем видении код должен выглядеть так:

if Pgas<Pcmpsafe С:=100000 else goto 0 ; // undefine
return ;
0: if Pcmpsafe[i]<=Compartment[i] С:=0 else goto 1;
return;
1: if Pgas=Compartment[i] С:=0 else goto 2;
return;
2: Bm:=1/(1-(Pcmpsafe[i]-Compartment[i])/(Compartment[i]-Pgas));
B:=1/(1-(Pcmpsafe[i]-Compartment[i])/(Pgas-Compartment[i])) ;
if Pgas<Compartment[i] C:=ThtA[i]*LogN(2,(Bm)) else C:=ThtA[i]*LogN(2,(B));
return;

Начал делать, у тебя тут какое-то противоречие. В логическом описании условий ты пишешь что сравниваешь Pgas<Compartment[i] и что Pcmpsafe[i]<=Compartment[i], а потом сравниваешь совсем други вещи...Так как конкретно сравнивать и что с чем?
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver

Листригон
Активный участник
Сообщения: 1002
Зарегистрирован: 31-08-2005 19:18
Откуда: Moscow

#590 Сообщение Добавлено: 27-10-2005 10:39 Заголовок сообщения:

В логических условиях не все описал просто - извиняюсь.
Делаем так:
if Pgas<Pcmpsafe С:=100000 else goto 0 ; // undefine
return ;
0: if Pcmpsafe<=Compartment С:=0 else goto 1;
return;
1: if Pgas=Compartment С:=0 else goto 2;
return;
2: Bm:=1/(1-(Pcmpsafe-Compartment)/(Compartment-Pgas));
B:=1/(1-(Pcmpsafe-Compartment)/(Pgas-Compartment)) ;
if Pgas<Compartment[i] C:=ThtA[i]*LogN(2,(Bm)) else C:=ThtA[i]*LogN(2,(B));
return;

В принципе здесь логика точнее расписана,исключение при вычислении В берем модуль и if Pgas<Compartment[i] не выполняем.

Аватара пользователя
Lt_Flash
Активный участник
Сообщения: 1516
Зарегистрирован: 14-02-2005 13:24
Контактная информация:

#591 Сообщение Добавлено: 27-10-2005 11:14 Заголовок сообщения:

Эээ...Так делаем как выделено цитатой, или еще где-то модуль? И где конкретней? И такого if как ты написал я не вижу в выделенном сегменте.
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver

Листригон
Активный участник
Сообщения: 1002
Зарегистрирован: 31-08-2005 19:18
Откуда: Moscow

#592 Сообщение Добавлено: 27-10-2005 11:58 Заголовок сообщения:

Метка 2, там сначала идут вычисления В и Вm, вместо них просто В и с модулем, а
if Pgas<Compartment C:=ThtA*LogN(2,(Bm)) else C:=ThtA*LogN(2,(B));
не делаем.

Аватара пользователя
Lt_Flash
Активный участник
Сообщения: 1516
Зарегистрирован: 14-02-2005 13:24
Контактная информация:

#593 Сообщение Добавлено: 27-10-2005 12:21 Заголовок сообщения:

Фигня полная получается, первый НДЛ начинает появляться на 32х метрах. Вот код:

Код: Выделить всё

  if Pgas<Pcmpsafe[i] then C:=-1 else
   if Pcmpsafe[i]<=Compartment[i] then C:=-1 else
    if Pgas=Compartment[i] then C:=-1 else
     B:=1/(1-(Abs(Pcmpsafe[i]-Compartment[i]))/(Abs(Compartment[i]-Pgas)));
  if (C<>-1) then C:=Log2(B);
Прога на фтп. Та, которая воздушная.
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver

Аватара пользователя
AndyVas
Участник
Сообщения: 153
Зарегистрирован: 01-02-2005 16:56
Откуда: Минск Беларусь
Контактная информация:

#594 Сообщение Добавлено: 27-10-2005 13:04 Заголовок сообщения:

Сори быстро не ответил - разрешение АЦП считается вообще говоря от входного сигнала который нам нужно будет оцифровывать. 10 бит это 1024 ступеньки. Допустим имея Vref 1.024 вольта (напряжение на входе не должно превышать Vref) получим разрешение АЦП - 1 миливольт Не забываем что по даташитам почти все АЦП "прыгают" +- 1 бит в лучшем случае без учета шумов т.е. +- 1 милливольт будет скакать. Теперь берем датчик - напряжение на нем на воздухе порядка 10-30 милливольт (я беру средние характеристики по разным датчикам разных фирм - в среднем 20мВ.) Сигнал придется разогнать примерно в 5 раз (чтобы максимальное PO2 можно было считать до 2.0) усилителем-буфером до АЦП чтобы использовать всю шкалу АЦП (Vref меньше 1.024 вольта с нормальной погрешностью и температурным дрейфом я не встречал - в основном используют 2.048 вольт) Итого получим на воздухе 100мВ. В итоге если хотим считать тысячные - 10 разрядов нам не хватит - 100мВ - 0.209 - воздух, 100.5мв - 0.210 т.е. цена одной тысячной на индикаторе это 0.5 мВ. а у нас грубо без учета шумов и погрешностей 1мВ.
Если используем 12 разрядов - имеем для нашего примера 0.25 милливольта разрешение - при округлении даст нам искомое разрешение - но впритык. 16 бит - это 0.016мВ - если отбросить младшие 3 разряда и округлить - это то что доктор прописал!!! Правда это в идеале - шумы конечно не дадут такого разрешения но в запасе как минимум 3 разряда младших при 16 битах которые можно просто отбросить - т.е для нашей задачи надо 13-14 бит АЦП

В общем вроде так - уже 3 дня считаю в столбик ;)) поправте меня если где ошибся. Но получается что встроенного АЦП 10 бит будет мало. Или ограничиться сотыми долями т.е. на воздухе PO2 -0.21 и т.д. тогда 10 бит хватит. В моем случае кислородного анализатора тысячные мне нужны. (т.е. воздух - 20.9%) Оптимальный вариант вырисовывается такой - это Vref - 2.048V (есть очень классные микрухи для референс с шикарной линейностью и малым температурным дрейфом) и 16 бит внешнее 3-4 канальное АЦП с последовательным интерфейсом (I2C-SPI - есть такие и у Analog Devices и у Texas Ins.) с операционниками маштабирования Все это добро подключается к Вашему Amtel или PIC по 3-4 линиям и оцифровывает 3 датчика и например напряжение аккумулятора, а микроконтроллер это все потом "крутит" ИМХО

Листригон
Активный участник
Сообщения: 1002
Зарегистрирован: 31-08-2005 19:18
Откуда: Moscow

#595 Сообщение Добавлено: 27-10-2005 13:07 Заголовок сообщения:

По моему вот так должно быть:
if Pgas<Pcmpsafe then C:=-1 else
if Pcmpsafe<=Compartment then C:=0 else
if Pgas=Compartment then C:=0 else
B:=1/(1-(Pcmpsafe-Compartment)/(Abs(Compartment-Pgas)));
if C>-1 then if C=0 then C:=0 else C:=ThtA*Log2(B) else C:=0;

Проверь синтаксис

Аватара пользователя
Lt_Flash
Активный участник
Сообщения: 1516
Зарегистрирован: 14-02-2005 13:24
Контактная информация:

#596 Сообщение Добавлено: 27-10-2005 13:11 Заголовок сообщения:

Листригон писал(а):По моему вот так должно быть:
if Pgas<Pcmpsafe then C:=-1 else
if Pcmpsafe<=Compartment then C:=0 else
if Pgas=Compartment then C:=0 else
B:=1/(1-(Pcmpsafe-Compartment)/(Abs(Compartment-Pgas)));
if C>-1 then if C=0 then C:=0 else C:=ThtA*Log2(B) else C:=0;

Проверь синтаксис

Сделал

Код: Выделить всё

  if Pgas<Pcmpsafe[i] then C:=-1 else
   if Pcmpsafe[i]<=Compartment[i] then C:=0 else
    if Pgas=Compartment[i] then C:=0 else
     B:=1/(1-(Abs(Pcmpsafe[i]-Compartment[i]))/(Abs(Compartment[i]-Pgas)));
  if C>-1 then if C=0 then C:=0 else C:=ThtA[i]*Log2(B) else C:=0;
Теперь вообще всегда 0 :)
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver

Аватара пользователя
Lt_Flash
Активный участник
Сообщения: 1516
Зарегистрирован: 14-02-2005 13:24
Контактная информация:

#597 Сообщение Добавлено: 27-10-2005 13:14 Заголовок сообщения:

2AndyVas: А зачем нужны тысячные доли? Но если они нужны - я уже писал - растягивайте шкалу и подавайте на два входа АЦП - нижняя часть на 0й канал, верхняя (что выше определенного вольтажа и не влезает в нижнюю) - на 1й. А так как каналов до 12ти - то можно "размазать" очень даже серьезно...
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver

Аватара пользователя
Lt_Flash
Активный участник
Сообщения: 1516
Зарегистрирован: 14-02-2005 13:24
Контактная информация:

#598 Сообщение Добавлено: 27-10-2005 13:17 Заголовок сообщения:

2Листригон: Сделал ТАКОЙ код - if C<>-1 then C:=ThtA*Log2(B) else C:=0; и заработало. Выкладываю на фтп. И даже на значения моей Суунты похоже, точнее смогу только вечером проверить.

А блин, свалилась в ошибки...Где-то еще деление на 0, видимо как ты и описывал, что то еще надо...
Последний раз редактировалось Lt_Flash 27-10-2005 13:20, всего редактировалось 1 раз.
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver

Аватара пользователя
AndyVas
Участник
Сообщения: 153
Зарегистрирован: 01-02-2005 16:56
Откуда: Минск Беларусь
Контактная информация:

#599 Сообщение Добавлено: 27-10-2005 13:19 Заголовок сообщения:

для анализатора они нужны... (наверное, по крайней мере все анализаторы которые я видел показывали три знака т.е. например 32.6% хотя Вы правы - все равно по правилам округляем в большую сторону до целого числа и пользуем), а размазывать.... ну не знаю, мне проще влепить трехканальный I2C внешний АЦП и маленький PIC на 8-14 ног чем возиться с аналоговой обвязкой для "размазывания".

Аватара пользователя
Lt_Flash
Активный участник
Сообщения: 1516
Зарегистрирован: 14-02-2005 13:24
Контактная информация:

#600 Сообщение Добавлено: 27-10-2005 13:21 Заголовок сообщения:

AndyVas писал(а):для анализатора они нужны... (наверное, по крайней мере все анализаторы которые я видел показывали три знака т.е. например 32.6% хотя Вы правы - все равно по правилам округляем в большую сторону до целого числа и пользуем), а размазывать.... ну не знаю, мне проще влепить трехканальный I2C внешний АЦП и маленький PIC на 8-14 ног чем возиться с аналоговой обвязкой для "размазывания".
Ну вы же под 16й ПИК пишете? Возьмите 16С774 - у него 12 бит АЦП, тут-то вам хватит, я думаю? А с компилятором С под 16й ПИК могу помочь.
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver

Ответить