• Что не так с моей схемой для оцифровки сигнала stm32f103t8c6 после маштабирующей схемы?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    Схема подключения повторителя сделана неверно, нельзя подключать ОУ для обработки сигнала, от которого этот же ОУ питается. Сначала надо смасштабировать этот сигнал до уровней линейного диапазона этого ОУ, например, с помощью резисторного делителя на входе ОУ, а его выход напрямую, без делителей, соединить со входом АЦП.
    Причина вашей ошибки - скорее всего, даташит, из которого взята вот эта страница:
    647249e67a814647959179.jpeg
    Тут сказано, что LM358 может обрабатывать сигналы вплоть до -0,3 вольта, т.е. ниже минуса питания. Это правда, он действительно может это делать, такова особенность его схемотехники. и за это мы его так любим. А вот насчёт плюса питания он так не может - входное напряжение не имеет права выходить за пределы плюса, оно должно быть несколько ниже (обычно на 1...1,5 вольт), чтобы входной диффкаскад смог с ним корректно работать. Написанное в даташите, что он может это делать - неверно, он этого не сможет. Гляньте на его схему - если базу входного транзистора соединить непосредственно с питанием, то этот транзистор просто закроется.
    Как возникла эта ошибка, и почему до меня её никто не заметил, мы тут обсуждать не будем. А исправить вашу неприятность очень легко - перепаяйте делитель 6ком/1ком с выхода ОУ на его вход, и всё придёт в норму.
    Ответ написан
    9 комментариев
  • Заработает ли схема по оцифровке "синусоидного" сигнала?

    @pfg21
    ex-турист
    нет. источник напряжения +5в имеет нулевое внутренне сопротивление и полностью "поглотит" весь твой переменный сигнал.
    да, это можно сделать. поставить на входе резистивный делитель потом емкостное разделение по постоянному току и еще один резистивный делитель который сформирует новую среднюю точку равной половине максимального входного напряжения АЦП.
    учитывая что тех.подробностей нет от слова савсем, то как-то очень примерно так.
    R1/R2 - делитель входного сигнала. до необходимой амплитуды.
    С1 - развязка постоянки
    R3/R4 - выставка нуля
    640a50b5ad429609095492.png
    Ответ написан
    4 комментария
  • Заработает ли схема по оцифровке "синусоидного" сигнала?

    @nehrung
    Не забывайте кликать кнопку "Отметить решением"!
    Я понял вашу проблему так - вам надо оцифровать переменную составляющую сигнала, а его средним значением можно либо пренебречь, либо любым образом им манипулировать (извините, если понял неправильно, но как написано, так и читано).
    Для решения этой задачи давно применяется классический и очень простой способ - подать сигнал через разделительный конденсатор (в вашей схеме это вместо резистора 160 ком или последовательно с ним). Его ёмкость выбирается исходя из входного сопротивления АЦП (в вашей схеме это резистор 50 ком) и наинизшей частоты в спектре сигнала.
    Если есть опасение, что размах переменной составляющей может превысить нижний и верхний пороги и выйти за пределы линейности АЦП, то перед разделительным конденсатором придётся поставить устройство автоматической нормализации уровня (в радиоприёмниках такая штука называется АРУ).
    Ответ написан
    Комментировать
  • Почему биты в регистре архитектуры AVR заносяться именно посредством сдвига 1 на этот бит влево?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    почему нельзя занести этот бит в регистр без сдвига, зачем это придумано
    UCSRA |= (1<<U2X);

    В заголовочных файлах U2X определён как "номер бита U2X в регистре UCSRA", т.е. 1.
    Если бы U2X был определён как "битовая маска поля U2X в регистре UCSRA" (т.е. 2), то все бы писали UCSRA |= U2X;. В ассемблерном коде avr оба эти варианта превратятся в инструкцию sbi UCSRA, 1, устанавливающую бит в регистре по номеру.

    Имея номер бита перевести его в битовую маску гораздо легче, чем наоборот, из маски вывести номер бита (который, в общем случае, может быть и не один), я думаю, что отчасти поэтому у программистов работающих с железом есть тенденция определять поля регистров через номера битов.
    Ответ написан
    Комментировать
  • Как передать переменные/аргументы из python в dll? И можно ли это осуществить?

    @rPman
    Тебе нужно написать прослойку, небольшой модуль питона на с или с++ (да собственно на чем угодно компилируемом, но документация вся для си), в котором подключаешь свою libview или что тебе там надо и делаешь нужные вызовы, с предварительной конвертацией типов данных

    https://habr.com/ru/post/466499/
    Ответ написан
    4 комментария
  • Как передавать информацию от\к микроконтроллеру по wifi с помощью сайта?

    Если использовать ESP-01 как wifi модуль, то можно отправить самый обычный http-запрос на сервер.

    1. ESP8266 сильно мощнее, чем atmega16. Можно спокойно убрать лишнее звено, если взять NodeMCU.
    АЦП там уже есть
    2. asm для этого, имхо, не очень удобен, тк слишком низкоуровневый.
    3. Самому реализовывать протокол для общения atmega и esp01 не нужно - обычно wifi-модуль уже настроен для работы через serial/spi/i2c
    4. Вот пример, как подобное можно сделать на arduino: https://techtutorialsx.com/2016/07/21/esp8266-post...
    Ответ написан
    2 комментария
  • Хотел спросить про python kivy... Вообще ничего не понимаю( Вы сможете помочь?

    @Umpiro
    Чтобы код выполнялся не весь сразу, а в зависимости от действий пользователя, вам нужно использовать events.
    Например, on_text_validate виджета TextInput.
    #!/usr/bin/python
    import kivy
    from kivy.app import App
    from kivy.uix.textinput import TextInput
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.button import Button
    
    class RootWidget(GridLayout):
        def __init__(self, **kwargs):
            super(RootWidget, self).__init__(**kwargs)
            self.cols = 2
            self.add_widget(CreateInput(multiline=False))
    
    class CreateInput(TextInput):
        def on_text_validate(self):
            for i in range(int(self.text)):
                self.parent.add_widget(Button(text=str(i)))
    
    class MyApp(App):
        def build(self):
            return RootWidget()
    
    if __name__ == "__main__":
        MyApp().run()
    Ответ написан
    2 комментария