Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ультразвуковой термометр
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Метрология, датчики, измерительная техника
Страницы: 1, 2
Rst7
Цитата
Судя по асм листингу прерывание существенно сократилось.


Вам бы еще компилятор сменить на вменяемый, например, IAR.

Цитата
Так что, либо 4 датчика, либо усилять.


Предлагаю 4 датчика и воспользоваться тем, что еще один датчик можно зацепить на порт D - на непосредственный вход компаратора - именно тот, который сидит на мультиплексоре. Второй - оставить на земле.

А по чем датчики брали?
Altair
Вот так выглядит при оптимизированном обработчике прерывания (масштаб такой же как на предидущем видео):

Видео с осциллографа

Невооруженным глазом видно, что фронт стал меньше колебаться.

Думаю что не бывает плохих компиляторов, быват плохие программисты. :-)) В крайнем случае напишу #asm... и, эх раззудись плечо, размахнись рука... :-)) Хотя и отвык от АСМа капитально.

Цитата
Предлагаю 4 датчика и воспользоваться тем, что еще один датчик можно зацепить на порт D - на непосредственный вход компаратора - именно тот, который сидит на мультиплексоре. Второй - оставить на земле.


Тогда можно вобще все датчики одним концом на мультиплексор, вторым на другой порт. Никакой разницы.


С датчиками оказалось сложно. Сначала хотел купить в Платане, но дешевых нет в наличии, а те которые есть предложили привезти по 500 р за шт. Я че то пожадничал. Негуманный ценник. И тогда заказал у китаезов вот такой парктроник. За 1000 р. я получил 4 датчика с комплектом электроники "для опытов". Правда пришлось месяц ждать доставки.
Отдельно датчики от парктроников по вменяемой цене тож не нашел.
Rst7
Цитата
Тогда можно вобще все датчики одним концом на мультиплексор, вторым на другой порт. Никакой разницы.


Неа. Разница есть. Надо драйвить сразу оба пина в противофазе. Значит, оба вывода датчика должны быть подключены к одному порту.

Цитата
Думаю что не бывает плохих компиляторов


Бывают компиляторы, генерящие плохой код в не зависимости от мастерства программиста. ICC в их числе.
Altair
Цитата(Rst7 @ Aug 26 2009, 07:52) *
Неа. Разница есть. Надо драйвить сразу оба пина в противофазе. Значит, оба вывода датчика должны быть подключены к одному порту.

Пробовал и одновременно, и по очереди. Разницы не заметил.

Цитата(Rst7 @ Aug 26 2009, 07:52) *
Бывают компиляторы, генерящие плохой код в не зависимости от мастерства программиста. ICC в их числе.

У меня CodeVision. Хотя думаю особой разницы нет. Но меня ПОКА устраивает.

Вопрос еще такой. Интегратор это как? Мне представляется - сложить все измерения, например те же 1024 цкла, и по окончании поделить. Арифметическое среднее короче. Или принять первое значение, а потом в зависимости от значений следующих измерений либо прибавлять либо отнимать единичку к первому принятому?
Rst7
Цитата
Интегратор это как? Мне представляется - сложить все измерения, например те же 1024 цкла, и по окончании поделить. Арифметическое среднее короче.


Да. Но есть тонкость - если значения будут колебаться 0,255,0,255... и т.д., например. Тут надо брать разность по модулю 255 между двумя измерениями и его дважды интегрировать.
Огурцов
А не думали умножить сигнал на sin/cos тех же 40кгц, а уже потом проинтегрировать ? Вроде бы должно помочь принципиально подавить помехи ?
Rst7
Цитата
А не думали умножить сигнал на sin/cos тех же 40кгц, а уже потом проинтегрировать ? Вроде бы должно помочь принципиально подавить помехи ?


То не помехи были, уже ж разобрались. А добротность у датчика вполне приличная. Кстати, из-за приличной добротности я перед самим измерением вхолостую дую где-то 1000 периодов.
Altair
Можно измерять в диапазоне -128 0 +128. Значение капчи присваивать переменной типа signed char и отнимать 128. А для усреднения использовать модуль. Тогда получиться как в коде Грея - на краях диапазона различие в один младший разряд. Только одновременно нужно считать количество положительных и отрицательных компонент при усреднении, что бы понимать в положительной или отрицательной половине остаемся.
Rst7
Не совсем понятно, что Вы хотите сделать.
Altair
Ну например постоянно принимается 0-255-0-255. Мы это число переводим в знаковое и от каждого измерения отнимаем 128. ТОгда получается что на выходе то -1 то 0. Вот их и усредняем. О, даже и отнимать ничего не надо. В знаковом виде будет то -127 то +127. Таймер то считает от 0 до 255, а в знаковом виде - от -127 до +127. Т.е. когда он досчитал до +127, переполнился и начинается - 127. Или я что то неправильно понимаю?
Rst7
Цитата
Или я что то неправильно понимаю?


Мне кажется, что да. Попробуйте написать код. Не весь, а только расчетные выражения.
Altair
Нет. Я точно напутал. Но идея такая - перевести значение каждого измерения в код Грея, а уже в нем усреднять. Т.е. использовать свойство кода Грея в отличии любого соседнего значения только на один младший разряд.
Rst7
Цитата
Но идея такая - перевести значение каждого измерения в код Грея, а уже в нем усреднять. Т.е. использовать свойство кода Грея в отличии любого соседнего значения только на один младший разряд.


Причем тут код Грея? Достаточно того, что разность между двумя измерениями стремится к 0. Ху из разность? Правильно, производная. Значит, чтобы получить среднее по всем измерениям, надо дважды проинтегрировать разности соседних измерений (сначала получить интеграл производной, т.е. собственно значение измерения, но уже без переполнения, т.к. производная мала (помещатеся в signed char), а интегратор - достаточно широк, например, 16 бит для простоты), а затем - проинтегрировать (усреднить) уже полученные "непереполняющиеся" значения измерения.
Altair
2 Rst7

Т.е. так?

Интегратор(16бит) += (Текущее_измерение - Предидущее_значение);

... повторям много раз

Фактическое_значение = Интегратор/количество_отсчетов
Rst7
Нет. Не так.

Интегратор1(16бит) += (Текущее_измерение - Предидущее_значение);
Интегратор2(32бита) += Интегратор1;

... повторям много раз

Фактическое_значение = Интегратор2/количество_отсчетов
Altair
ЭЭЭэээ...
А разве это не одно и то же?

Разве нельзя сократить

Цитата
Интегратор1(16бит) += (Текущее_измерение - Предидущее_значение);
Интегратор2(32бита) += Интегратор1;

... повторям много раз

Фактическое_значение = Интегратор2/количество_отсчетов


до

Интегратор2(32бита) += (Текущее_измерение - Предидущее_значение);

... повторям много раз

Фактическое_значение = Интегратор2/количество_отсчетов ??


Или Интегратор1 тоже static?
Rst7
Цитата
Или Интегратор1 тоже static?


Конечно. Где Вы видели интегратор не static? wink.gif
Altair
Цитата(Rst7 @ Sep 7 2009, 16:08) *
Конечно. Где Вы видели интегратор не static? wink.gif


- Семен Семеныч!!!
- Ах да, да...


:-))
Rst7
Только если быть до конца точным, то должно быть
Код
Int1+=(signed char)(cur_val-prev_val);


Обратите внимание на приведение типа именно к 8ми битам со знаком. Если его не написать, то компилятор исполнит integer promotion и все пойдет по женскому половому органу wink.gif
techlab
Уважаемый RST7, а можно взглянуть на ваш вариант программной реализации? Собственно интересует сам механизм измерения сдвига фазы
Rst7
QUOTE (techlab @ Oct 2 2016, 15:59) *
Уважаемый RST7, а можно взглянуть на ваш вариант программной реализации? Собственно интересует сам механизм измерения сдвига фазы


Так вроде все описано выше. Конкретно код там довольно специфический и нечитабельный, по большому счету.
techlab
Цитата(Rst7 @ Oct 4 2016, 15:55) *
Так вроде все описано выше. Конкретно код там довольно специфический и нечитабельный, по большому счету.


из описанного выше вполне понятно как обработать полученный результат, а я будучи латышОм, не совсем понимаю сам механизм работы ацп в данном решении, потому даже не читаемый код был бы хорошим подспорьем, на чем еще учиться как ни на работе профи!?
Rst7
QUOTE (techlab @ Oct 7 2016, 11:12) *
не совсем понимаю сам механизм работы ацп в данном решении


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