Jump to content

    

conan

Участник
  • Content Count

    56
  • Joined

  • Last visited

Community Reputation

0 Обычный

About conan

  • Rank
    Участник

Recent Profile Visitors

962 profile views
  1. Много лет назад реализовал протокол двусторонней пакетной передачи (по uart) сообщений с гарантированием на основе контрольных сумм, таймаутов и повторных передач. Без адресации -- только два узла. Была самодельная многопоточность. Сперва реализовал на C под DOS на PC, потом просто строчка за строчкой перенес на avr asm
  2. Если пренебречь потерями на заряд-разряд завтора, то общие потери на ключе складываются из статических и динамических потерь. Чтобы для меандра на низковольтном мосфете с сопротивлением открытого канала 5mOhm получить 5W статич. потерь нужен ток стока sqrt(2*5/0.005) = 45A. Если взять время переключения в 100nS и макс. мощность при переключении как 45A*30V=1350W, то при частоте 10kHz динамические потери будут 2*1e-7*10000*1350=2.7W. Итого 5+2.7=7.7W
  3. Если мотор низковольтный, то проблемы нагрева ключей нет
  4. Когда-то реализовывал ШИМ-управление коллекторным электромотором постоянного тока (30V, 500W). Там нужно было выдерживать положение и (соответственно) скорость во времени по опред. закону. Реализовал так, что при логич. 0 открываются Q1 и Q4, а при логич. 1 открываются Q2 и Q3. Т. е. когда 0 -- полный вперед, когда 1 -- полный назад. Когда меандр -- мотор стоит на месте (потребление минимальное засчет индуктивности обмоток мотора). По крайней мере до 50 кГц без каких-либо радиаторов различимого на ощупь нагрева на MOSFET-ах не было -- при любых режимах
  5. Подобрать апроксимирующую синусоиду и исходя из ее периода и амплитуды принимать решение
  6. Будучи не в теме вопрос из праздного любопытства: что такое 5V-24V? ЭДС, логический уровень, еще что-то?
  7. Какой прок от этого знания? Почему недостаточно рассматривать транзистор как черный ящик со спецификацией, где приведены параметры и кривые
  8. Ну так ведь в одном случае вы записываете в саму переменную-аргумент (block_start_addr =), а в другом в переменную, на которую ссылается указатель (*text_type =)
  9. Можно сделать шаблон для общего случая, и к нему специализации: template<int USARTx_BASE, int FIFO_SIZE> class Uart {}; template<int FIFO_SIZE> class Uart<UART0, FIFO_SIZE> {}; template<int FIFO_SIZE> class Uart<UART1, FIFO_SIZE> {}; ... template<int FIFO_SIZE> class Uart<UART16, FIFO_SIZE> {}; Если для какого-то USARTx_BASE нет специализации, то будет использоваться общий вариант. Можно сделать специализации не только по одному аргументу, но и по нескольким: template<> class Uart<UART1, 32> {}; Но типы полученные от одного шаблона с разными значениями шаблонных аргументов -- разные типы. Нельзя объект от Uart<UART0, 16> передать в функцию, которая ждет Uart<UART1, 16>& или Uart<UART, 32>& (но можно сделать функцию тоже шаблонной). Еще есть подход Type erasure
  10. 2. Нестатический метод класса можно вызывать только для обьекта. UartBase::ISR (или ISRBase?) у вас метод нестатический и его можно вызывать только для существующего обьекта класса UartBase или обьекта производного класса. О чем компилятор самым явным образом вам сообщает. 1. Не понятно в чем вопрос. Значения для шаблонных аргументов становятся частью спецификации типа. Классы порожденные от одного и того же шаблона с разными значениями аргументов есть разные типы. Не понятно зачем нужна эта помойка
  11. Почему странный? Стандартный способ. Два основных подхода: 1. Вызывающая сторона выделяет память и передает адрес буфера в функцию в качестве аргумента. Функция заполняет буфер результатом работы. За освобождение памяти отвечает вызывающая сторона. Иногда, когда заранее неизвестно сколько надо будет памяти, чтобы поместился результат, функция вызывается два раза. Первый раз -- с 0 в качестве указателя на буфер и тогда, функция не генерирует результат, а только вычисляет и возвращает размер необходимого буфера. Потом вызывающая сторона готовит буфер нужного размера и вызывает функцию повторно, но уже с указателем на буфер. Такой под-подход встречается, например, в WinAPI. 2. Память выделяет сама функция и возвращает указатель на этот блок, заполненный результатом работы. Не кошерно, если потом память освобождается прямым вызовом free. По-хорошему должна быть отдельная функция которая просто освобождает память: Data *doSomething(); void free(Data *); Именно так устроено большинство C-библиотек. Есть набор функций, которые выделяют память и возвращают указатель и есть отдельная функция, которая по этим указателям память освобождает. Такой подход, например, позволяет подключать библиотеки, которые собраны другим компилятором (или тем же, но с другими настройками, которые влияют на распределитель памяти)
  12. С точки зрения спецификации языка C доступ к локальным переменным функции после её завершения влечет неопределенное поведение. Если копнуть глубже, то поведение зависит от устройства конкретного компилятора и конкретной платформы. На микроконтроллерах и ОС типа DOS данные в локальном массиве после завершения функции могут быть перезаписаны обработчиками аппаратных прерываний. В ОС использующих механизм страничной адресации памяти диапазон массива теоретически вообще может оказаться unmap-ленными и тогда даже попытка чтения приведет к segmenation fault и немедленному завершению программы
  13. В рамках самообразования рисую pfc из библиотечных элементов LTspice (без расчетов, путем проб и ошибок): Захотелось реализовать регулирование выходного напряжения -- перемножением сигнала входного напряжения (R8,R9) и ошибки выходного напряжения. Поэтому обратил внимание на умножитель сигналов
  14. Так и есть. Эксперименты в LTspice Это же jfet, а в умножителе mosfet