Задать вопрос
  • Как посчитать правильно расположенные круглые скобки из массива char?

    GavriKos
    @GavriKos
    Идете по массиву. Встречаете открывающую - +1 к счетчику. Встречаете закрывающую - -1 к счетчику. Если на каком то этапе счетчик стал <0 - скобки неверные. Если в конце прохода счетчик != 0 - скобки неверные
    Ответ написан
    Комментировать
  • Можете подсобите с описанием схемы с управляющим источником тока?

    @atereffigies
    Эх. Вы бы сперва разобрались с более простой схемой, а уже потом говорили, что вам подходит. Я за вами наблюдаю уже достаточно давно, и в упор не понимаю, почему вы не хотите разбираться в сути, а ищите готовое решение...
    Налицо непонимание работы ОУ в принципе и закона Ома.
    Схема эта ничем по принципу работы не отличается от той, что приводят в учебниках: https://tinyurl.com/2yahhns6
    636bcda3a2678028702628.png

    Каков самый главный принцип работы ОУ? Не знаете. А звучит он так -- ОУ пытается ВЫРОВНЯТЬ потенциал на своих входах посредством ОТРИЦАТЕЛЬНОЙ ОБРАТНОЙ СВЯЗИ (ООС). Это значит, что если у вас есть петля ООС и вы, скажем, подали на вход "+" 1В, то посредством этой самой ООС операционный усилитель на своём выходе выставит такое напряжение, при котором на входе "-" тоже будет 1 В.
    Это всё, что нужно знать о работе ОУ.
    Возвращаемся к схеме. Если на входе "+" будет 1 В, и мы видим что ООС есть (Выход ОУ - транзистор - токосъёмный резистор - вход "-"), это значит, что на входе "-" так же будет 1 В.
    Что из этого следует?
    А то, что через резистор будет протекать такой ток, который создаст падение напряжения на нём в 1 В.
    А это значит, что транзистор открыт так, что пропускает через себя именно такой ток.
    А это уже значит, что ОУ подаёт на затвор транзистора такое напряжение, при котором транзистор открывается именно так. Ведь цель ОУ -- сделать потенциал на входе "-" равным потенциалу входа "+".
    Вот это и есть принцип работы стабилизатора (источника) тока на ОУ.
    Нагрузка же включается в цепь стока (коллектора), и стоит понимать, что она будет не заземлена -- у вас это разъём ХР2.
    На вашей схеме явная ошибка -- диод VD2 анодом подключен к стоку транзистора, хотя должен быть подключен к плюсу источника питания.
    Разъём ХР3 вам нужен, если вы хотите контролировать ток при помощи АЦП, например, и вам надо знать его текущее значение.
    Схемы не с небес приходят, их делают люди под конкретную задачу и искать схему, которая вам подойдет, не разбираясь в вопросе -- глупо.
    Что вы должны знать при разработке такой схемы?
    1. максимальный ток в нагрузке;
    2. диапазон управляемых напряжений;
    3. максимальное падение напряжения на нагрузке и напряжение питания;
    4. диапазон управляемых напряжений;
    5. режим работы схемы (перменный или постоянный);
    6. требуемые точностные характеристики схемы;

    Зная эти условия, вы должны найти компромисс. Если у вас ток, скажем 10 А, а вы выбрали токосъемный резистор 1 Ом, то это явно перебор. Ведь при таком токе, на нём будет падать 10 В, а рассеиваемая мощность будет 100 Вт!
    Вы должны исходить из мощности токосъёмника. Скажем, если допустимо использовать резистор мощностью 1 Вт, то учитывая некоторый запас, можно прикинуть его номинал -- например 5 мОм. При токе в 10 А на нём будет падать 50 мВ. Это означает, что сигнал на входе у вас должен быть от 0 до 50 мВ.
    Теперь вы переходите к следующему шагу -- согласованию управляющего сигнала.
    Допустим, вы хотите управлять источником тока с ЦАПа. При этом, знаете, что выходное напряжение ЦАП от 0 до 3 В.
    Для этого вы подбираете номиналы делителя напряжения на входе, чтобы из 3 В на входе схемы получалось 50 мВ: https://tinyurl.com/2689aufo
    636bd6e536227242670579.png
    Разобравшись с этим, вы должны прикинуть, хватит ли вам напряжения питания. Для этого вы должны знать падение напряжения на нагрузке. Например, пусть оно будет 2 В.
    Чтобы прикинуть оптимальное напряжение питания, вам нужно сложить максимальное падение на токосъемном резисторе, падение напряжения на полевике при полностью открытом канале (+ некоторый запас, т.к. полевик от нагрева проводит хуже) и плюс то самое падение на нагрузке. Сопротивление канала транзистора можно посмотреть в даташите. Я возьму от балды для примера -- 10 мОм, с запасом в 1,5.
    Итак, при токе в 10 А, на резисторе упадёт 50 мВ, на транзисторе упадёт 0,01 Ом * 1,5 * 10 А = 150 мВ и на самой нагрузке 2 В, итого: 0,05 + 0,15 + 2 = 2,2 В. Т. е. оптимально было бы для нашего примера, если бы на плюсовой вывод нагрузки подавалось около 2,2 В или чуть выше.
    Здесь нужно понимать, что бОльшее напряжение питания вызовет излишнее падение на транзисторе, из-за чего он будет перегреваться, а меньшее напряжение питания не позволит на полную "раскачать" нагрузку.
    Это только один конкретный случай я описал, но суть та же -- вы должны понимать, что делаете.
    В приведённой вами схеме есть еще один недостаток -- отсутствие каких-либо цепей, препятствующий самовозбуждению схемы. Ведь у вас в цепи ООС присутствует ОУ, который вносит свою задержку. Пока по всей цепи ООС дойдет сигнал с выхода на вход "-" верхнего ОУ, условия уже поменяются, и ОУ снова начнёт изменять значение на выходе, и сигнал по ветви ООС опять будет "устаревшим" -- схема самовозбудится, т.к. ОУ всегда будет пытаться выровнять потенциалы и всегда будет некоторый момент запаздывания. Поэтому я бы сделал некоторую частотную коррекцию схемы в своём примере: https://tinyurl.com/262s8e84
    636bdb2b1e713710481088.png
    В общем, появилась RC-цепь между выходом и токосъёмным резистором. Номиналы можете взять примерно такие же, при условии, что режим работы схемы постоянный, а не переменный. С переменным придётся подбирать номиналы RC-цепочки и выбирать ОУ с достаточно быстрой скоростью нарастания выходного сигнала, естественно опираясь на нужное быстродействие.
    Даллее следует учесть момент входного напряжения смещения ОУ. Если критично, чтобы в нагрузке не протекал ток, когда на управляющем входе 0 В, то нужно добавить некотрую коррекцию напряжения смещения (как известно, напряжение смещения можно представить как источник напряжения, включенный последовательно с входом ОУ): https://tinyurl.com/2bl87tus
    636bddc8eee92221394194.png
    Здесь я добавил источник 5 мВ, чтобы сымитировать напряжение смещения ОУ и это привело к тому, что при 0 В на входе схемы в нагрузке протекает ток 1 А! А это недопустимо.
    Для коррекции нужно добавить некоторое смещение и на вход "-": https://tinyurl.com/2cq64z7t
    636bdef384024562775879.png
    Мне пришлось подключить резистор между 5 В и входом "-", чтобы добиться незначительного тока в нагрузке. Более того, пришось подгонять номинал верхнего резистора делителя напряжения (59 кОм -> 58 кОм), чтобы максимальный ток в нагрузке мог снова достигать 10 А.
    Т. е. столько нюансов, а вы хотите без понимания сути взять готовое и чтобы работало. И это ещё далеко не всё.
    Можете взять за пример приведенную мной в итоге схему и подогнать под свои условия. И не стоит ставить ОУ в ООС, если вы не понимаете что делаете, иначе заколебётесь глюки ловить.
    Дальше уже расписывать не буду, т. к. пошёл спать. Доброй ночи.
    Ответ написан
  • Какое сопротивление у резистора на схеме?

    ProgrammerForever
    @ProgrammerForever
    Учитель, автоэлектрик, программист, музыкант
    1R = 1Ом.
    Советские резисторы могут быть промаркированы как 1E.
    SMD будут промаркированы как 1R0.
    Цветовая маркировка:
    4 кольца: коричневый-чёрный-золотой-любой
    5 колец: коричневый-чёрный-чёрный-серебряный-любой
    Ответ написан
    Комментировать
  • Как учить C++ если будешь знать С?

    CityCat4
    @CityCat4 Куратор тега C
    //COPY01 EXEC PGM=IEBGENER
    С начала. Там все по-другому. Подход другой, принципиально. Синтаксис и некоторые ключевые слова общие, да. Но на этом все. Это примерно как самосвал и паркетник - оба автомобили, но один для перевозки грузов, а второй - для перевозки телок :)
    Ответ написан
    Комментировать
  • Сортировка расческой. Что такое число 1.247?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Судя по всему, это число вылезло в результате эксперементов каких-то исследователей. Они просто попробовали кучу разных факторов и нашли что при 1.247 вроде как быстрее в среднем. Формулу по это число потом какой-то шутник придумал. Кроме как в русской википедии (без ссылки на источник) я нигде эту формулу найти не могу.

    Влияет оно так: если число слишком большое, то мелкие элементы в конце массива не успевают перехать в начало на итерациях с достаточно большим шагом; если же число слишком мелкое, то делается много лишних итераций.
    Ответ написан
    Комментировать
  • Что это за кэши L1 типа I и D?

    mayton2019
    @mayton2019
    Bigdata Engineer
    I - это кеш инструкций. По сути - кеш твоего бинарного кода.
    Ответ написан
    Комментировать
  • Как зациклить трансляцию ffmpeg?

    @Drno Автор вопроса
    Вообщем сделал я зацикленный bash скрипт, вроде все норм)
    Пришлось еще подсунуть фейковую аудиодорожку, иначе стрим ВК не принимает
    -stimeout 10000000 - ожидание "переподключения", тут 10 секунд

    #!/bin/bash
    while true; do ffmpeg -re -rtsp_transport tcp -stream_loop -1 -stimeout 10000000 -i rtsp://admin:password@192.168.1.2:64075/ISAPI/Streaming/Channels/302 -f lavfi -i anullsrc -deinterlace -vcodec copy -f flv -c:a libmp3lame -ar 44100 -b:a 128k rtmp://ovsu.mycdn.me/input/vk_stream_key -nostdin -nostats; sleep 5; done;
    Ответ написан
    Комментировать
  • Взаимодействие уровней сетевых моделей?

    saboteur_kiev
    @saboteur_kiev Куратор тега Компьютерные сети
    software engineer
    А что ты уже читал хотябы в википедии?

    Ну вот например протокол низкого уровня - мы по кабелю пересылаем данные при помощи дискретного сигнала. Это же явно уровень ниже, чем HTTP
    или вместо кабеля на каком-то этапе нам нужно перейти на wifi, и передавать данные уже радиоволной, со своими особенностями, синхронизацией сигнала, отвержением отраженных повторений.

    Разные уровни могут работать по-разному, для этого читается их спецификация.
    Стандартизация была введена для того, чтобы можно было придумать свою реализацию чего-либо, и внедрить в остальной стек так, чтобы выше/нижележащие протоколы продолжали работать как работали.
    Ответ написан
    5 комментариев
  • Какая это сгоревшая радиодеталь?

    @pfg21
    ex-турист
    резистор проволочный низкоомный.
    наверное все таки не ноль. для перемычки уж слишком круто.

    посмотри по остаткам цветовой кодировки.
    предположу по цветам
    первое кольцо - (крайнее правое) красный (2) или коричневый (1)
    второе кольцо не четко видно хотя и не особо влияет - черный??? (0)
    третье кольцо видно четко - черное - ноль или множитель 10^0=1
    четвертое кольцо не видно изза гари - черное??? - множитель 10^0=1
    полследннее кольцо не может быть черным - нет цвета точности.
    итого 20 или 10 ом вполне нормально длят токоограничения.

    но надо сильно поковырять цвета, они толи обгорели, толи пеплом покрыты. играйся :)
    Ответ написан
    4 комментария
  • Чем обусловлены различия в работе со строками и другими массивами?

    @res2001
    Developer, ex-admin
    void func()
    {
    char str1[] = "Hello";
    const char* str2 = "Hello";
    int* mas1 = { 4, 5, 7, 9 };  // compile error
    int mas2[] = { 4, 5, 7, 9 };
    char* str3 = {'s', 't', 'r', '3', '\0'};  // compile error
    char str4[] = {'s', 't', 'r', '4', '\0'};
    ...
    }

    Объявление str1 и str2 это не совсем одно и то же.
    str1 выделяет на стеке массив charов подходящего размера и копирует в этот массив строку "Hello". Строка "Hello" до копирования будет хранится в сегменте памяти для констант (rodata), который сформируется ОС автоматически при загрузку исполняемого файла в память. Таким образом строка str1 лежит полностью на стеке, ее можно изменять при желании, но увеличивать размер нельзя. str1 может быть как константной строкой, так и не константной.
    str2 - на стеке выделяется память под указатель, указателю присваивается адрес строки "Hello", которая все так же лежит в сегменте rodata. Поэтому const тут необходим, т.к. оригинальная строка, на которую ссылается str2 не изменяемая. Если убрать const у str2, то, например, gcc выдаст предупреждение по умолчанию, но код скомпилирует. Если дальше попытаться изменить str2 (например str2[0] = 'h';), то компилятор на присвоение уже ничего не скажет, т.к. str2 уже не константная строка, но при выполнении получишь segfault, т.к. пытаешься изменить read-only память.
    В случае инициализации mas1, выражение в фигурных скобках - это список инициализации. На основании списка инициализации компилятор генерирует код, который при выполнении проинициализирует массив mas1, т.е. он не генерирует массив, он генерирует код, что-то типа такого mas1[0] = 4; mas[1] = 5; ... при этом компилятор подразумевает, что память под mas1 уже должна быть выделена подходящего объема. Но в примере mas1 - это не массив - это указатель, который никуда не ссылается. Инициализировать указатель таким образом не возможно. Нужно делать так, как показано для mas2.
    Точно так же списком инициализации можно проинициализировать и массив для строки (str3) и получить ту же ошибку, что и для mas1.
    Из примеров можно сделать вывод, что для строк в языке существует специальный синтаксис, который больше нигде не применим - пример str2. Это так и есть.

    Сырые строки (Си строки, ASCIIZ строки, строки оканчивающиеся нулем) ни разу не устаревшие. Объект string, конечно удобный и прочее, но он медленный из-за того, что хранит свою строку в динамической памяти, и при изменении строки перевыделяет память по мере надобности и копирует строку в новую память. Операции выделения/удаления динамической памяти очень дорогие. Чаще всего string - вполне адекватный выбор, но там где нужна быстра работа со строками лучше поискать другие варианты, например сырые строки.
    В С++17 появился std::string_view - это обертка над константной сырой строкой, делает код немного более понятным, но не производит никаких манипуляций с динамической памятью - ему на вход надо дать сырую строку. Он ее и использует для своих операций. Из-за того, что string_view не изменяет свою строку и не манипулирует с памятью - он работает быстрее, но у него ограниченное количество операций - отсутствуют операции модифицирующие строку.
    Ответ написан
    3 комментария
  • Как разделить строку до и после определённого символа?

    @res2001
    Developer, ex-admin
    Вариант с "токенизацией" делит один единственный буфер на несколько Си строк, т.е. там просто записывается завершающий 0 вместо разделителей. Это быстро и довольно просто, ничего никуда не копируется, дополнительная память не выделяется. Но надо иметь ввиду, что используется один и тот же буфер и если вы его не аккуратно перезапишите (не важно по какому указателю на внутренние строки), то ваши строки "испортятся". Освобождая память под этим буфером надо, естественно, по указателю на начало буфера, а не по указателю на произвольную строку внутри буфера. Освободив буфер надо иметь ввиду, что все строки, содержащиеся в буфере то же освободились.

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

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

    Если же вам надо только "вывести подстроку", то можно просто искать позицию разделителя, с его помощью вычислять размер левой подстроки и используя printf("%*s", len, leftstr); выводить левую подстроку. Дальше сохраняем указатель на начало правой подстроки, ищем от него следующий разделитель, то, что раньше было правой подстрокой становится левой, точно так же выводим и т.д. в цикле.
    Вместо printf можно выводить так: cout << setw(len) << leftstr;
    Ответ написан
    Комментировать
  • Маршрутизация на пк или 6 сетевых интерфейсов?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Для начала решить, что так жить нельзя и закопать, наконец, стюардессу :) Windows - однопользовательская развлекательная система, не наждо тащить ее в роль сервера видеонаблюдения.

    Поставить роутер с PoE, настроить на нем маршрутизацию, подключить винду в один из интерфейсов.
    Ответ написан
    Комментировать
  • Возможно ли каким то образом заразить свой ПК собственным вирусом?

    @Drno
    а почему нет? достаточно его запустить
    Ответ написан
    Комментировать
  • Какой максимальный ток может проходить через кнопку, рассчитаную на 0.5A 50V, если напряжение цепи 5V?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Напряжение на кнопках указывают для определения изолирующих (в разомкнутом состоянии) и искрогасящих параметров кнопки. Чем больше напряжение, тем больший зазор нужно делать между контактами.
    Ток же определяет какой будет нагрев в замкнутом состоянии. Кнопка - это не нагревательный прибор, у нее должно быть миимально енапряжение и в замкнутом виде она делает короткое замыкание. На её контактах в замкнутом виде не может быть ни 50 ни 5 вольт. Если на контактах замкнутой кнопки 5 вольт, то кнопка неисправна, у нее плохой контакт и по ней шпарит ток, гораздо выше озвученного.

    Ещё раз. На кнопке или любом выключателе либо напряжение (в разомкнутом виде), либо через нее течет ток (в замкнутом состоянии).
    Мощность на ней может какая-то рассеиваться, но уж точно не 25 ватт. Там будут миливатты.
    Ответ написан
    3 комментария
  • На чем программируют электронные устройства для техники?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Почти весь embed, и гражданский, и военный, пишется на C.
    Ответ написан
    Комментировать
  • Каким образом можно увеличить выходное напряжение без превышения уровня напряжения двоичного кода на ЦАП с резисторной матрицей R-2R?

    @Akela_wolf
    Extreme Programmer
    Поставьте на выход R2R операционный усилитель и получите совершенно произвольное напряжение на выходе (в пределах выходного диапазона ОУ). Операционный усилитель имеет еще такой немаловажный плюс, что R2R чувствителен к сопротивлению нагрузки, чем меньше сопротивление, тем больше напряжение на выходе будет "плавать". ОУ обладает очень высоким входным сопротивлением, поэтому в паре с R2R будет работать просто замечательно.

    Статья на хабре

    Я так полагаю, вам подойдет самая простая схема - неинвертирующий усилитель.
    Ответ написан
  • Не сохранился черновик статьи, что делать?

    Adler_lug
    @Adler_lug
    В следующий раз писать статью сперва в Word или блокноте...
    Ответ написан
    4 комментария
  • Как в ардуино включить светодиод при поступающем аналоговом значение которое больше (0-1024) 500 в течении 5 секунд?

    nava2002
    @nava2002
    Инженер
    Учитывая простоту вопроса по моему, кто то пытается сделать домашнее задание.
    Это программа на 4 оператора.
    Ответ написан
    Комментировать