Сборка и испытания IDA-71S1 (этап 1). Проектирование этапа 2
Модераторы: трофи, Максим Васильев, KWAK, DukeSS
Имеешь ввиду разбить на два диапазона измерения, и программно переключать АЦП?
Вообще-то у ПИКа до 12ти каналов АЦП. Есно разбить вольтаж пополам и обрабатывать верхнюю и нижнюю части по 10 бит каждая. А потом тупо складывать внутрях проца 
Или можно зарезать вольтаж в два раза допустим резистором, и потом программно умножать просто полученное значение на 2...Просто смотря какая точность нужна. Уж число от 0 до 500 миливольт влезает в диапазон 10 бит ЛЕГКО. 2 в 10й вообще-то 1024, плюс все что ниже, короче 10 бит - это вплоть до 1024...

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

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



Все получил, Lt_Flash' у переправил тоже.Угу. Прокси. Но я уже Листригону на мыло выслал.
Листригон писал(а): Поэтому придется оценивать каждый член отдельно:
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
IANTD EANx Nitrox Diver
В логических условиях не все описал просто - извиняюсь.
Делаем так:
В принципе здесь логика точнее расписана,исключение при вычислении В берем модуль и if Pgas<Compartment[i] не выполняем.
Делаем так:
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] не выполняем.
Эээ...Так делаем как выделено цитатой, или еще где-то модуль? И где конкретней? И такого if как ты написал я не вижу в выделенном сегменте.
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver
IANTD EANx Nitrox Diver
Метка 2, там сначала идут вычисления В и Вm, вместо них просто В и с модулем, а
не делаем.if Pgas<Compartment C:=ThtA*LogN(2,(Bm)) else C:=ThtA*LogN(2,(B));
Фигня полная получается, первый НДЛ начинает появляться на 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
IANTD EANx Nitrox Diver
- AndyVas
- Участник
- Сообщения: 153
- Зарегистрирован: 01-02-2005 16:56
- Откуда: Минск Беларусь
- Контактная информация:
Сори быстро не ответил - разрешение АЦП считается вообще говоря от входного сигнала который нам нужно будет оцифровывать. 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 датчика и например напряжение аккумулятора, а микроконтроллер это все потом "крутит" ИМХО
Если используем 12 разрядов - имеем для нашего примера 0.25 милливольта разрешение - при округлении даст нам искомое разрешение - но впритык. 16 бит - это 0.016мВ - если отбросить младшие 3 разряда и округлить - это то что доктор прописал!!! Правда это в идеале - шумы конечно не дадут такого разрешения но в запасе как минимум 3 разряда младших при 16 битах которые можно просто отбросить - т.е для нашей задачи надо 13-14 бит АЦП
В общем вроде так - уже 3 дня считаю в столбик

По моему вот так должно быть:
Проверь синтаксис
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 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;

PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver
IANTD EANx Nitrox Diver
2AndyVas: А зачем нужны тысячные доли? Но если они нужны - я уже писал - растягивайте шкалу и подавайте на два входа АЦП - нижняя часть на 0й канал, верхняя (что выше определенного вольтажа и не влезает в нижнюю) - на 1й. А так как каналов до 12ти - то можно "размазать" очень даже серьезно...
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver
IANTD EANx Nitrox Diver
2Листригон: Сделал ТАКОЙ код - if C<>-1 then C:=ThtA*Log2(B) else C:=0; и заработало. Выкладываю на фтп. И даже на значения моей Суунты похоже, точнее смогу только вечером проверить.
А блин, свалилась в ошибки...Где-то еще деление на 0, видимо как ты и описывал, что то еще надо...
А блин, свалилась в ошибки...Где-то еще деление на 0, видимо как ты и описывал, что то еще надо...
Последний раз редактировалось Lt_Flash 27-10-2005 13:20, всего редактировалось 1 раз.
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver
IANTD EANx Nitrox Diver
- AndyVas
- Участник
- Сообщения: 153
- Зарегистрирован: 01-02-2005 16:56
- Откуда: Минск Беларусь
- Контактная информация:
для анализатора они нужны... (наверное, по крайней мере все анализаторы которые я видел показывали три знака т.е. например 32.6% хотя Вы правы - все равно по правилам округляем в большую сторону до целого числа и пользуем), а размазывать.... ну не знаю, мне проще влепить трехканальный I2C внешний АЦП и маленький PIC на 8-14 ног чем возиться с аналоговой обвязкой для "размазывания".
Ну вы же под 16й ПИК пишете? Возьмите 16С774 - у него 12 бит АЦП, тут-то вам хватит, я думаю? А с компилятором С под 16й ПИК могу помочь.AndyVas писал(а):для анализатора они нужны... (наверное, по крайней мере все анализаторы которые я видел показывали три знака т.е. например 32.6% хотя Вы правы - все равно по правилам округляем в большую сторону до целого числа и пользуем), а размазывать.... ну не знаю, мне проще влепить трехканальный I2C внешний АЦП и маленький PIC на 8-14 ног чем возиться с аналоговой обвязкой для "размазывания".
PADI Advanced Open Water Diver
IANTD EANx Nitrox Diver
IANTD EANx Nitrox Diver