Как посчитать теорему Пифагора в аналоговом виде?

 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Timofey just sent you (=KRoN=) a Private Message at Форумы Авиабазы.

Subject: Консультация



День добрый, Роман.

Тут мне приспичило, что аж караул.
Вот, решился просить совета специалистов. Ситуация в следующем: одному ОКБ требуется установка на опытный аппарат (хм... пусть он так называется) индикаторной панели. Это панелька (линейка) светодиодов: 4 зеленых + 4 желтых + 4 красных (всего 12 штук). Они отобжают (должны отображать) уровень сигнала. Сигнал поступает с 2х ДУС (постоянный ток от 0 до 6 В. Нулевой угловой скорости соответствет 0 В, максимальной - 6 В. Зависимость линейная). Вся беда в том, что перед отображением сигнал должен быть "обработан": нужно изобразить квадратный корень из суммы квадратов уровней сигналов от каждого из 2х ДУСов. Просто датчики стоят на перпендикулярных осях аппарата (OX - крен и OZ - тангаж) и нужно определить и показать суммарную угловую скорость (простая теорема Пифагора).
Т.е. при нулевых угловых скоростях светодиоды не светятся, при максимальных (и по крену и по тангажу) - светится вся линейка.
Тут "дедушки" нарисов! али схему этого устройства. Но оно получилось размером с 2 чемодана. А подключение такого потребителя через вой прибористов требует чуть ли не резолюции Генерального.
Мне кажется, что все может быть гораздо проще. Нам бы только схему такого устройства - соберем-то мы ее сами (как сумеем) :-)
Роман, у тебя на форумах часто появляются специалисты различных областей. Куда можно обратиться за такой электротехнической помощью?

С почтением, Тим.
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Мои мысли. Вариантов два:

1. Оцифровать сигналы (пара дешёвых 8-битных АЦП или один двухвходовый), загнать в микропроцессор-однокристаллку (чуть ли не в стандартном 16-ногом корпусе) и либо прямо к однокристаллке, если портов хватит, либо через дешифратор прилепить линейку светодиодов. Можно уложиться в два-четыре малогабаритных корпуса + немного дискретки. Без микропроцессора не обойтись, т.к. сложить или перемножить можно и в лоб (в цифровом виде), но вот как извлечь квадратный корень без микропроцессора я не представляю - поправьте, если это можно сделать.

2. Аналоговый метод. Увы, я тут дуб дубом. Сложить и перемножить сигналы - это, думаю, не сложно. А вот можно ли в аналоговом виде извлечь квадратный корень? Хотя что-то мне подсказывает, что можно операцию sqrt(a*a+b*b) в аналоговом виде решить одним действием...

Первую схемку я б взялся разработать за часик, если б были под рукой справочники (кои порастерялись) по АЦП и ещё пару часиков на программирование однокристаллки (тоже литературы не осталось уже).

А кто что по второй скажет?
 
RU CaRRibeaN #11.02.2002 17:53
+
-
edit
 

CaRRibeaN

координатор

Вообще говоря двухканальная измерительная схема имеет решение, которое старо как мир - 2 ОУ, двухканальная АЦП (рекомендую AD 77xx, в данном случае - AD7706), затем микроконтроллер, он уже зависит от того, с чем работали, я лично люблю Atmel (в данном случае подойдет что-то вроде AT90S2313), можно старшие PIC'и или любые "средние" 20/4051, лучше последние, как перепрограмируемые. Плата при умном подходе получаеться размером с 2-3 спичечных коробка, жрет 0.1 ватта. С этого же МК можно выдавать информацию на панель, последняя моя работа как раз заключалась в разводке платы-панели :)
Shadows of Invasion.  
RU CaRRibeaN #11.02.2002 17:56
+
-
edit
 

CaRRibeaN

координатор

По поводу аналогово вида - можно, на 3 операции потребуетья 6, если не ошибаюсь ОУ, соотвественно - пара-тройка корпусов типа SOIC-8 и с 20 дискретных элементов, вопрос, как на панель светоиндикаторов подать нужные циферки, неужели они аналоговые (сдвиговые регистры или их замена) бывают?
Shadows of Invasion.  
+
-
edit
 

GrayCat

координатор

Аналоговые операции можно выполнять:

А) На операционниках: есть схемы логарифмирования и потенцирования. Соответственно, на них строятся всякие возводители в степень и извлекатели корня.

Б) На аналоговых перемножителях. В квадрат возводить - понятно как, но и корень извлекать тоже может. Где-то в журналах то ли "Радио", то ли "Радиохобби" была статья "Применение аналоговых перемножителей", там это все описано.

Хотя, опять-таки, если потом все это будет идти на дискретную линейку светодиодов - возможно, проще действительно окажется микроконтроллер. Например, Atmel 8535 имеет АЦП с селектором входов - завести сигналы прямо на его ноги, на другие ноги - "светики", и все ОК!
Gray ©at [Семейство кошачих]  
+
-
edit
 

GrayCat

координатор

GrayCat>>Atmel 8535 имеет АЦП с селектором входов

Alecsandro>Лучше взять At90s2333 - ног меньше.

Да у меня тут сосед именно с 8535 плотно работает, первое что пришло на ум ляпнул.

Alecsandro> А так - у PICов ассемблер такой, что можно сломать ногу, не говоря уж о голове, особенно на первых порах.

Хмм. А причем тут PIC? :) А ассемблер у него, помнится, вполне нормальный RISC-ассемблер. Не хуже МК-61 :D

А вообще, выбор контроллера для такого простого применения определяется исключительно личными предпочтениями разработчика :)

Alecsandro> Выход сделать придётся ШИМом, потому что ЦАПы нив ПИК, ни в АВР не встраивают...

При чем тут ШИМ? Если выход на 12 светодиодов - просто подцепляем их к 12-ти ногам контроллера...


Alecsandro>А насчёт аналогового способа - если мне не изменяет память, АЧХ

...Видимо, на АЧХ, а ВАХ...

Alecsandro> диода имеет квадратичную зависимость в своём начале,

... и не квадратичную, а экспоненциальную, и не в начале, а по всей "длине", но с разными показателями :D

Alecsandro> то есть на 3-х ОУ вполне можно пифагора склепать, но для малого сигнала, то есть точность падает.

Вот именно подобный подход у меня упомянут как А) Только вот гемора много с ним получится: каждый входной сигнал прологарифмировать, удвоить, пропотенцировать, сложить, снова прологарифмировать, поделить на 2, и опять пропотенцировать.

А уж о термостабильности этого дела, основанного на свойствах pn-перехода, я молчу...

Alecsandro>Но на самом деле в голове критутся что-то типа сложения косинусоиды с синусоидой...

Да причем тут... Сигналы-то "квазистатические", как я понял.

В общем, так: "Радиохобби" No 2 за 2000 год, стр. 31: "Аналоговые перемножители". Скан лежал на официальном сайте журнала (что-то типа ), могу и сам выложить. Характеристики и схемы включения разных перемножителей.

Получается: пара перемножителей - квадраторы, "опер" - сложение, еще один перемножитель - извлекатель корня.
Gray ©at [Семейство кошачих]  
RU CaRRibeaN #11.02.2002 20:42
+
-
edit
 

CaRRibeaN

координатор

Интересно, ну пусть те инжеНера ничего не слышали про цифру и микроконтроллеры, но как у них получилось аналоговых элементов 2 чемодана?
Shadows of Invasion.  
AU Alecsandro #11.02.2002 21:33
+
-
edit
 

Alecsandro
Серокой

координатор
★★★★
GrayCat>Atmel 8535 имеет АЦП с селектором входов

Лучше взять At90s2333 - ног меньше. А так - у PICов ассемблер такой, что можно сломать ногу, не говоря уж о голове, особенно на первых порах. Выход сделать придётся ШИМом, потому что ЦАПы нив ПИК, ни в АВР не встраивают...

А насчёт аналогового способа - если мне не изменяет память, АЧХ диода имеет квадратичную зависимость в своём начале, то есть на 3-х ОУ вполне можно пифагора склепать, но для малого сигнала, то есть точность падает. В смысле, если поставить в цепь обратной связи диод. В первых двух, которые возводят в квадрат, в цепь вход - инв. вход ОУ, в выходящем - в цепь выход ОУ - инв. вход ОУ.

Но на самом деле в голове критутся что-то типа сложения косинусоиды с синусоидой...
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Блин, Валь, ну уж тебе-то стыдно должно быть всё буквально воспринимать! :D
 
+
-
edit
 

Timofey

старожил

Благодарю за столь массовое сочуствие :-)
Уж простите юродивого, но в терминологии (АЦП и проч.) я не силен. А идти с этим всем к тем самым "дедушкам" и говорить: "Вы все сделали неправильно. Вот тут люди так советуют..." - это с ними только поругаться и потом года два не разговаривать.
То, что они там нарисовали - ужас. Выдержит, кажется, и ядерный взрыв. А нужен простенький приборчик. Стоять он будет в кабине (вибрации минимальны, температура и влажность комфортные, в боевых действиях участвовать не будет).
Если у кого имеется возможность, пожалуйста, вышлите на эл. адрес принципиальную схему с кратким описанием. Аналоговую или цифровую - не важно. Лишь бы работало. А уж плату развести и все собрать - есть кого заставить :-)
А то сейчас пилоту, чтобы выдержать заданные угловые скорости, чуть ли не на секундомер смотреть надо. Позорище...
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Alecsandro>только подкиньте алгоритм вычисления квадратного корня в любом виде!..

Итерации по Ньютону для x=sqrt(a)

x = (x+a/x)/2

В качестве начального приближения удобно взять a/2 и гонять надо для двоичных чисел, пока разница станет <= 1.

Что-то типа такого.
Наверняка не самый оптимальный вариант, но первое что в голову приходит:
code cpp
  1. int x,x0;
  2. x=a/2;
  3. do
  4. {
  5.     x0=x;
  6.     x=(x+a/x)/2;
  7. }while( (x-x0) & -2 );


code 6502acme
  1. ; извлечь корень из AX:
  2.     PUSH BX CX DX
  3.     MOV BX, AX
  4.     SHR AX, 1
  5. LOOP:
  6.     MOV CX, AX
  7.     MOV AX, DX
  8.     DIV BX
  9.     ADD AX, CX
  10.     SHR AX, 1
  11.     OR  CX, AX
  12.     AND CX, 0FFFEh
  13.     JNZ LOOP
  14.     POP DX CX BX
 
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Вместо кучи сравнений лучше сделать массив на 256 байт.
Берём по 4 бита сигнала (кстати, три мало - всего 8 градаций), составляем из них индес таблицы, берём оттуда значение (заодно функцию можно любую загнать), можно уже нормализованное.

А сколько портов-то у этой микрухи? Неплохая штука, судя по описанию. Такую бы мне лет 10 назад, когда этим делом увлекался :D
 
AU Alecsandro #12.02.2002 14:01
+
-
edit
 

Alecsandro
Серокой

координатор
★★★★
Да, да, да , ВАХ, а не АЧХ, ну понятное дело! :)

А про PIC я сказал, потому что он упоминался как "конкурент" AVR.

Насколько срочно это надо сделать? На 2333 могу, думаю, дня за два программку накидать, только подкиньте алгоритм вычисления квадратного корня в любом виде!..
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
+
-
edit
 

=KRoN=
Balancer

администратор
★★★★★
Хех. Таблицу ручкаим набивать? Хех. Это надо быть ОЧЕНЬ трудолюбивым :D Я в ТЕ времена обычно писал за пару минут программку на qbasic, которая ваяла мне нужный набор 'DB'шек, в отдельный файл, который я потом в .asm вставлял ручками :)

А микрухи знатные - уже оценил мельком...
10 лет назад о таком и не мечтали :D
 
AU Alecsandro #12.02.2002 16:06
+
-
edit
 

Alecsandro
Серокой

координатор
★★★★
Значит так, мысли у меня такие, если кто найдёт глюк, покусайте...

Входящие сигналы оцифровываем АЦП 2333, отбрасываем всё, кроме стрших трёх бит (нам точность не нужна, поскольку всё дело ограничется 12 светодиодами). Возводим в квадрат, суммируем, а дальше я хочу сделать просто: поскольку мы имеем дело с 8-битным значением, то целых корней у нас всего может быть 16. Таким образом, чтобы не вычислять их, просто делаем сравнивание диапазонов такого числа, благо памяти программ много, аж 2КБайта, а занять её по большому счёту нечем :) Дальше вообще просто: получившееся 4-битное значение умножаем на 0,75 (то есть А=А-А>>1), нормализуя таким образом к 12, далее просто дешифрируем и выдаём на порты... Портов хватает за глаза. Из внешних деталей: кварц, 3 ёмкости (на питание и два на кварц), плюс входной резистивный делитель (потому что сигнал 6 вольт, а опорное напряжение АЦП на может быть больше питания микроконтроллера).

Списибо, Ром, за алгоритм, думаю, он пригодится не тут, так потом где ещё!
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
AU Alecsandro #12.02.2002 18:36
+
-
edit
 

Alecsandro
Серокой

координатор
★★★★
=KRoN=>Вместо кучи сравнений лучше сделать массив на 256 байт.

Ну, 16 сравнений не такая уж и куча. А 256 байт хранить в памяти программ - набивать долго :)

=KRoN=>Берём по 4 бита сигнала (кстати, три мало - всего 8 градаций), составляем из них индес таблицы, берём оттуда значение (заодно функцию можно любую загнать), можно уже нормализованное.
Тогда проще вообще ПЗУ взять :) АЦП надо внешнее тогда правда!

=KRoN=>А сколько портов-то у этой микрухи? Неплохая штука, судя по описанию. Такую бы мне лет 10 назад, когда этим делом увлекался :D

Штука рулезная. Я на такой, только с памятью в два раза больше, 4433 называлась, делал пульт управления светом - там тоже с аналоговых ручек снималось напряжение, запоминалось, на ЖКИ отображалось и так далее, а потом шло на ШИМы (вот откуда они выплыли и были жестоко растерзаны GrayCat'ом :) ).
Портов В:6+С:6+D:8=20. Из них 6 на портС могут работать аналоговыми входами.
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
AU Alesandro #13.02.2002 10:38
+
-
edit
 

Alesandro
Серокой

координатор
★★★★
hcube]Они еще знатнее, чем ты думаешь. и до кучи rs-232.

Один всего. Плюс SPI.

hcube]В общем, я тут буду разрабатывать типовую платку под два типоразмера - 8535/4333, ну и их младшие версии разумеется.

4333 - что за зверь? 4433может?

hcube]она же позволит контроллер через com-порт программировать, и через него же с ним общаться.

Программитровать как? COM к SPI напрямую подключить? А тактировать чем? А сброс формировать? Или тянуть не только Rx/Tx, но ещё что-то типа CTS/RTS?

Kron, я по твоему совету таблицей всё же сделал src=/forum/smilies/smile.gif [image link error] И так как мне трудолюбия не хватило, вывел ".dw" на Си в файлик src=/forum/smilies/smile.gif [image link error]
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
RU CaRRibeaN #13.02.2002 18:41
+
-
edit
 

CaRRibeaN

координатор

hcube>Они еще знатнее, чем ты думаешь. и до кучи rs-232.

Один всего. Плюс SPI.

hcube>В общем, я тут буду разрабатывать типовую платку под два типоразмера - 8535/4333, ну и их младшие версии разумеется.

4333 - что за зверь? 4433может?

hcube>она же позволит контроллер через com-порт программировать, и через него же с ним общаться.

Программитровать как? COM к SPI напрямую подключить? А тактировать чем? А сброс формировать? Или тянуть не только Rx/Tx, но ещё что-то типа CTS/RTS?

Kron, я по твоему совету таблицей всё же сделал :) И так как мне трудолюбия не хватило, вывел ".dw" на Си в файлик :)
Shadows of Invasion.  

hcube

старожил
★★
Они еще знатнее, чем ты думаешь. Там еще внутре помимо АЦП есть таймер (а то и три), память оперативная, память постоянная (не стирающаяся при выключении питания), память для программы, и до кучи rs-232. Правда к нему еще нужен формирователь уровня. То есть на одной 8535, с минимумом обвязки и LCD экранчиком можно сделать, к примеру, терминал. Или часы. Или спидометр.... Или все вместе.
В общем, я тут буду разрабатывать типовую платку под два типоразмера - 8535/4333, ну и их младшие версии разумеется. Если получится - на платку надо будет впаять кварц, пару резисторов, КРЕНку, пару-тройку конденсаторов - и получится готовая платформочка. А если поставить еще помянутый RS-232 формирователь и еще деталюшек - она же позволит контроллер через com-порт программировать, и через него же с ним общаться.
Убей в себе зомби!  

hcube

старожил
★★
>Один всего. Плюс SPI.

Прямо скажем, там UART :) , RXD, TXD лапы. У нас юзаються в основном 2313, постоянно леплю на платах конвертер уровня в 232, разьем для SPI.

Вообще, если кому надо могу дать платку для более удобного прошивания 23хх AVRов, под DIP-20

Ну а с схемой согласен, могу даже плату развести, если очень нужно :) Там разводить 10 минут на все :)

Да, кстати раз у нас цифровая схема, надо шину наружу к сдвиговым регистрам индикаторов-семисегментников вести - обычно 3 линии (клокер, данные последовательные и параллельные).
Убей в себе зомби!  
RU asoneofus #16.07.2002 16:09
+
-
edit
 

asoneofus

старожил
★★
Максик - он 4х канальный. Два на вход, два на выход. Два на вход, правда, мало, надо - три. Вход RX разводим одновременно на RX и вход SPI, выход SPI - через формирователь - на DTR, вход (черт, забыл как называется, но он там есть!) еще какой-то - на clk, и последний, третий - через ограничитель (два диода к земле и питанию и резистор перед ними на 1-10k) - на reset. Разводится 'один в один' на DB-9-M, так чтобы можно было воткнуть прямо в com, через удлинитель. А потом дергая com-порт в тестовом режиме осуществляем синхронную передачу программы ;-) .
"... аще где в книге сей грубостию моей пропись или небрежением писано, молю Вас: не зазрите моему окаянству, не кляните, но поправьте, писал бо не ангел Божий, но человек грешен и зело исполнен неведения ..."  
RU Alesandro #16.07.2002 17:15
+
-
edit
 

Alesandro
Серокой

координатор
★★★★
asoneofus]У нас это решается довольно просто src=/forum/smilies/smile.gif [image link error]
asoneofus] Если A ] B , то С " 0.9605*A +0.3978*B, точность 4%
asoneofus] Если A ] 2B , то С " 0.9859*A +0.2327*B, точность 1.4%

asoneofus! Вы - тот же, что и на Телесисе? src=/forum/smilies/wink.gif [image link error]
Кстати, речь шла в основном о простых восьмибитных микроконтроллерах, как ж вы умножать там собрались на такие классные числа?
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
RU asoneofus #16.07.2002 17:39
+
-
edit
 

asoneofus

старожил
★★
У нас это решается довольно просто, :) Решение пифагора Искать по ключевому слову "Понселе" для С = SQRT(A*A+B*B)
Корень суммы квадратов равен:
Если A > B , то С " 0.9605*A +0.3978*B, точность 4%
Если A > 2B , то С " 0.9859*A +0.2327*B, точность 1.4%
Как это снять? ...
"... аще где в книге сей грубостию моей пропись или небрежением писано, молю Вас: не зазрите моему окаянству, не кляните, но поправьте, писал бо не ангел Божий, но человек грешен и зело исполнен неведения ..."  
RU Alesandro #16.07.2002 18:39
+
-
edit
 

Alesandro
Серокой

координатор
★★★★
asoneofus>У нас это решается довольно просто :)
asoneofus> Если A > B , то С " 0.9605*A +0.3978*B, точность 4%
asoneofus> Если A > 2B , то С " 0.9859*A +0.2327*B, точность 1.4%

asoneofus! Вы - тот же, что и на Телесисе? ;)
Кстати, речь шла в основном о простых восьмибитных микроконтроллерах, как ж вы умножать там собрались на такие классные числа?
Больше не раскалятся ваши колосники. Мамонты пятилеток сбили свои клыки. ©  
RU asoneofus #16.07.2002 18:48
+
-
edit
 

asoneofus

старожил
★★
Alecsandro>asoneofus! Вы - тот же, что и на Телесисе? ;)
Я везде один :) ... А что, что-то не так? :D

Alecsandro>Кстати, речь шла в основном о простых восьмибитных микроконтроллерах, как ж вы умножать там собрались на такие классные числа?

Умножать? Как два пальца... о - т.е. Как два бита переслать. Я это и на ПЛИСе забубенил уже. :) Кстати, любое нормированное число - как здесь, элементарно переводится к операции целочисленной :) (с ф.т.) - как? Просто: если принять за 1 максимальное значение в данной разрядной сетке ... :) Дальше - в курсе :) Или привести два числа в 8 (16) зарядах? :)

Если уж совсем просто - то аналоговая схема об 3-х корпусах...

Зы:) Я догадываюсь о решении Вашей задачки с доступом к памяти :)
"... аще где в книге сей грубостию моей пропись или небрежением писано, молю Вас: не зазрите моему окаянству, не кляните, но поправьте, писал бо не ангел Божий, но человек грешен и зело исполнен неведения ..."  

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru